python网络编程-socket
socket
-
socket是把TCP/IP UDP做一个封装,send,recv...
-
网络协议基于socket,进行收发等动作
服务端
- 声明实例
server = socket.socket(AF.INET,sock.SOCK_STREAM)
- family address 地址簇
AF.INET IPV4(默认)
AF.INET6 IPV6
AF.UNIT local
- 类型
socket.SOCK_STREAM 流式socket , for TCP (默认)
socket.SOCK_DGRAM 数据报式socket , for UDP
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
socket.SOCK_SEQPACKET 可靠的连续数据包服务
- 绑定地址
server.bind(localhost,port)
- 开始监听
server.listen()
- 获取连接
conn,addr = server.accept()#阻塞,为进来的连接创建一个实例conn
5 .接收回复
while True:
print('new conn',addr)
#接收数据
data = conn.recv(1024)#官方建议最大8192
#recv默认是阻塞的
#回复数据
conn.send(b'recv data')#回复二进制数据
- 客户端断开,conn.recv收到的就是控数据,进入死循环,因此:
while True:
print('new conn',addr)
#接收数据
data = conn.recv(1024)#官方建议最大8192
#recv默认是阻塞的
if not data: #<----判断是否为空,标识是否断开
break
#回复数据
conn.send(b'recv data')#回复二进制数据
客户端client
- 实例化
client = socket.socket()
- 连接
client.connect(serverip,port)
- 发送数据
client.send()
- 收服务器回复
client.recv()