1. 程式人生 > >python 學習第二 十天(併發的tcp)

python 學習第二 十天(併發的tcp)

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'))