python 网络编程
一 网络基础
互联网协议按照功能不同分为osi七层或者ip/tcp五层,ip/tcp四层。
数据链路层:有个以太网协议,ethernet,一组电信号称为一个数据报,也叫帧。ethernet规定接入internet的计算机都必须有网卡,发送端和接收端的地址就是网卡地址,也就是MAC地址。
网路层:规定网络地址的协议叫做ip协议,它定义的地址叫做ip地址。
传输层:tcp/udp协议。
二 socket
socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。
实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。
1 套接字的两个种族
1 AF_UNIX,基于文件类型。很少用
2 AF_INET,基于网络类型。 AF,代表 Address Family,地址族。
Server端
import socket server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(('127.0.0.1',8080)) #绑定 server.listen(5) #监听 while True: #连接循环 conn,ip_port=server.accept() #创建client与server端的连接 print('conn',conn) print('ip_port',ip_port) while True: #通信循环 try: #异常处理,client端突然断开 date=conn.recv(1024) #接收
if not date:break #这行代码是针对linux,在linu中如果client突然断开,conn.recv由阻塞状态变为不阻塞状态,一直接收 空。
print(date) conn.send(date.upper()) #发送 except Exception: break conn.close() server.close()
Client端
import socket client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('127.0.0.1',8080)) while True: #通信循环 cmd=input('==>') if not cmd:continue #判定不能为空,为空,实际上client端没有被操作系统发出数据,空 操作系统就不会发出。 client.send(bytes(cmd,encoding='utf-8')) date=client.recv(1024) print(date.decode('utf-8'))