python 學習第二 十天(併發的tcp)
阿新 • • 發佈:2019-01-08
tcp併發
- 服務端
import socketserver
import struct
class mysocket(socketserver.BaseRequestHandler):
def handle(self,buffersize=10):
print(self.request)#一個連線物件
print(self.client_address)#一個客戶端的地址
while True:
try:
head=self.request.recv(4)
head=struct.unpack('i' ,head)[0]
n=head//buffersize
m=head % buffersize
l=(self.request.recv(buffersize) for i in range(n))
if l:
if m :
remain=self.request.recv(m)
recv_msg=b''.join(l)+remain
else :
recv_msg=b''.join(l)
else:
recv_msg=self.request.recv(m)
if recv_msg!=b'':
print(recv_msg.decode('utf8'))
lenth_backdata = struct.pack('i', len('訊息已收到'.encode('utf8')))
self.request.send(lenth_backdata)
self.request.send('訊息已收到' .encode('utf8'))
except Exception:
break
if __name__== '__main__':
s=socketserver.ThreadingTCPServer(('127.0.0.1',8000),mysocket)
s.serve_forever()
pass
- 客戶端
客戶端不變
import socket
import struct
buffersize=5
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('127.0.0.1',8000))#連線伺服器
while True:
data=input('>>')
if data=='':
continue
if data=='q':
break
sock.send(struct.pack('i',len(data.encode('utf8'))))
sock.send(data.encode())
lenth_data = sock.recv(4)
lenth = struct.unpack('i', lenth_data)[0]
n = lenth // buffersize
m = lenth % buffersize
l = [sock.recv(buffersize) for i in range(n)]
if l:
if m:
remain = sock.recv(m)
recv_mess = ''.encode().join(l) + remain
else:
recv_mess = ''.encode().join(l)
else:
recv_mess = sock.recv(m)
print(recv_mess.decode('utf8'))