tcp协议传输数据存在粘包现象,udp协议不存在粘包协议。
三次握手的过程在代码中是由accept和connect共同完成的,具体的细节再socket中没有体现出来
io模型种类:
server端同时与多个client客户端之间的聊天:
# server.py
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.setblocking(False) # 非阻塞,setblocking()的参数为False时,表示非阻塞,如果参数不写,默认为True。
sk.listen()
conn_l = []
del_l = []
while True:
try:
conn,addr = sk.accept() # 阻塞,直到有一个客户端来连我
print(conn)
conn_l.append(conn)
except BlockingIOError:
for c in conn_l:
try:
msg = c.recv(1024).decode('utf-8')
if not msg:
del_l.append(c)
continue
print('-->',[msg])
c.send(msg.upper().encode('utf-8'))
except BlockingIOError:pass
for c in del_l:
conn_l.remove(c)
del_l.clear()
sk.close()
# client.py
import time
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
for i in range(30):
sk.send(b'zhangsan')
msg = sk.recv(1024)
print(msg)
time.sleep(0.2)
sk.close()
socketserver模块解决了socket的阻塞问题,直接实现tcp协议可并发的server端
# server.py
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self): # 自动触发了handle方法,并且self.request == conn
msg = self.request.recv(1024).decode('utf-8')
self.request.send('1'.encode('utf-8'))
msg = self.request.recv(1024).decode('utf-8')
self.request.send('2'.encode('utf-8'))
msg = self.request.recv(1024).decode('utf-8')
self.request.send('3'.encode('utf-8'))
server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver)
server.serve_forever()
# client.py
import socket
import time
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
for i in range(3):
sk.send(b'hello,yuan')
msg = sk.recv(1024)
print(msg)
time.sleep(1)
sk.close()