TCP程式設計(二)[Python]
阿新 • • 發佈:2019-01-10
前言
轉眼間都2019年了,首先祝大家新年快樂,也希望自己能夠堅持下去。希望自己有所為,有所愛,有所希望,有所熱愛。
《TCP程式設計(一)[Python]》中已經基本描述了Python中如何建立一個socket通訊的基本架構。本章首先給出本機通訊Client端和Server端的完整程式碼,再學習一下多執行緒,做做筆記。
正文
客戶端程式碼
import socket HostPort = ('127.0.0.1', 9995) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(HostPort) while True: Input_Message = input('>>> ').strip() s.send(Input_Message.encode('utf-8')) if len(Input_Message) == 0: continue if Input_Message in ('Quit','quit'): s.close() break server_reply = s.recv(1024).decode() +" " +'From ' + HostPort[0] print(server_reply)
服務端程式碼
import socket print("Waitting to be connected......") HostPort = ('127.0.0.1',9995) s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(HostPort) s.listen(1) conn,addr = s.accept() while True: data = conn.recv(1024).decode()+" "+'From '+HostPort[0] print (data) user_input = input('>>>') conn.send(user_input.encode('utf8'))
多執行緒Socket
上述的連線只是簡單單一執行緒的socket連線,意思就是隻能一收一發,一次只能傳送一條訊息,必須等待對方回覆後才能傳送下一條訊息,因此可以使用多執行緒來為每一次的通訊開一個執行緒,完成多發多收的效果。
客戶端程式碼
import socket import threading HostPort = ('127.0.0.1', 9994) s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(HostPort) Switch = True def Receive(s): global Switch while Switch: data = s.recv(1024).decode('utf8') if data == 'quit': Switch = False print('Received Message:',data) ''' 建立一個新執行緒:其中 target = Receive 為執行緒函式 args[,kwargs]表示傳遞給執行緒函式的引數,必須是一個tuple型別 ''' thread = threading.Thread(target=Receive, args=(s,)) thread.start() while Switch: Input_Message = input('>>>') s.send(Input_Message.encode('utf8')) if Input_Message in('quit','Quit'): Switch = False s.close()
伺服器端程式碼
#匯入socket、threading多執行緒模組
import socket
import threading
print("Waitting to be connected......")
HostPort = ('127.0.0.1',9994)
#建立一個socket連線
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(HostPort)
s.listen(1)
socket, address = s.accept()
Switch=True
address = str(address)
print('Connecting by : %s ' % address)
#定義一個接收資料的函式
def Receive(socket):
#此處定義一個全域性變數Switch
global Switch
while Switch:
data = socket.recv(1024).decode('utf8')
if data == 'quit':
true=False
print("Received Message: " + data +" from" + address)
#例項化一個執行緒
thread=threading.Thread(target=Receive, args=(socket,))
thread.start()
while Switch:
Input_Message = input('>>>')
socket.send(Input_Message.encode('utf8'))
if Input_Message == 'quit':
Switch = False
s.close()
未完待續……
參考連結
https://blog.csdn.net/dyy8686/article/details/79356189#commentsedit