TCP协议一旦链接就会一直占用,直到结束
server 与client连接建立了长连接,client2可以连但是处于等待
在连接accept()上方加一个循环
上一节是TCP
UDP网络编程
udp的server不需要监听和建立连接
启动服务器后只能被动等待客户端发消息
客户端发消息同同时,自带地址信息
消息回复时,需要把地址填上
#server.py
import socket
sk = socket.socket(type=socket.SOCK_DGRAM) #datagram 数据报文的意思
sk.bind(('127.0.0.1',8080))
msg , addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
sk.sendto(b'bye',addr`-)
sk.close()
#client.py
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1'.8080)
sk.sendto(b'hello',ip_port)
ret,addr = sk.recvfrom(1024)
print(ret.decode('utf-8'))
sk.close()
同时接收多个人的信息,短连接
UDP不会出现黏包问题,但是会丢包
TCP会黏包,不丢包
黏包第一次没发完,下一次发的时候继续上次没发完的内容
tcp是基于数据流的,因此收发消息不能为空。需要添加空消息处理机制,防止程序卡住。数据不会丢,数据可靠,但是会黏包
解决黏包问题
本质是不知道要接收数据的大小
首先,发送数据的大小,然后按照数据长度接收数据
struct模块解决
该模块可以把一个类型,如数字转换成 固定长度的bytes