服務端代碼
import socketserver
# 定義一個類
class MyServer(socketserver.BaseRequestHandler):
# 如果handle方法出現報錯,則會進行跳過.但是setup方法和finish方法無論如何都會進行執行的.
def setup(self):
print("首先執行setup")
def handle(self):
print("然后執行handle")
conn = self.request # 定義連接變量
conn.send(("連接成功,客戶端端口:%s" % (conn.getpeername()[1])).encode()) # 向客戶端發送消息
while True:
data = conn.recv(1024) # 接收客戶端消息
print(data.decode())
if not data or data == b'exit':
break
conn.send(data)
conn.close()
def finish(self):
print("最后執行finish")
if __name__ == "__main__":
# 創建多線程實例
server = socketserver.ThreadingTCPServer(("127.0.0.1", 3120) ,MyServer)
# 開啟異步多線程,等待連接
server.serve_forever()
客戶端代碼
import socket
client = socket.socket()
client.connect(("127.0.0.1", 3120))
while True:
data = client.recv(1024)
print(data.decode())
msg = input("請輸入要發送的信息...")
client.send(msg.encode())
if not msg or msg == "exit":
break
client.close()
為什么是非阻塞通信呢?
原來的tcp通信只能跟一個客戶端連接,當另一個客戶端來連接的時候,就會阻塞連接不上。socketserver模塊采用的就是多線程。
