使用SocketServer寫一個套接字程序來實現多線程,即服務器端可與多個客戶端進行通話,首先服務器端程序為:
#!/usr/bin/python
#coding:utf-8
import socketserver
class MyTCPHandle(socketserver.BaseRequestHandler):
def handle(self):
print("recived address:"+format(self.client_address[0]))
while True:
self.data=self.request.recv(1024*4).strip()
print(self.data)
self.request.sendall(self.data.upper())
if __name__=="__main__":
HOST,PORT="localhost",9999
server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandle)
server.serve_forever() #循環停止,等待它。
客戶端源程序為:
#!/usr/bin/python
#coding:utf-8
import socket
HOST,PORT="localhost",9999
data=""
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
sock.connect((HOST,PORT))
while True:
data=input("please input a string:")
sock.sendall(data.encode('utf-8','strict'))
received=sock.recv(1024*4)
print(str(received))
except Exception:
raise
finally:
sock.close()
其實只有服務器端的源碼不同,客戶端與之前的用socket寫的客戶端源碼相同。
在這裡服務器端要進行多個通話,因此,只是將接收到的字符串大寫後然後再進行返回,現在運行服務器端以及兩個客戶端的結果為:
服務器端:
客戶端1:
客戶端2:
於是這便實現了多線程的socket通話,其實在這個程序的關鍵源碼為:
socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandle)
這一行實現了多線程通話,以及這一行:
server.serve_forever() #循環停止,等待它。
這一行的源碼效果為不會出現在一個客戶端結束後,當前服務器端就會關閉或者報錯,而是繼續運行,與其他的客戶端繼續進行通話。
使用socketserver進行多線程通話,就是這樣。