基於python3的socket聊天程式設計
阿新 • • 發佈:2020-02-18
本文例項為大家分享了基於python3的socket聊天程式設計,供大家參考,具體內容如下
階段一:最簡易的聊天系統
缺點:程式不夠完善,只能一來一回,且沒人每次只能說一句話
server端:
import socket HostPort = ('127.0.0.1',9999) s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(HostPort) s.listen(1) conn,addr = s.accept() #print('Connecting by : %s ' % addr) while 1: data = conn.recv(1024).decode() print (data) user_input = input('>>>') conn.send(user_input.encode('utf8')) #conn.close() s.close()
client端:
import socket hostport = ('127.0.0.1',socket.SOCK_STREAM) s.connect(hostport) while 1: user_input = input('>>> ').strip() s.send(user_input.encode('utf-8')) if len(user_input) == 0: continue if user_input == 'quit': s.close() break server_reply = s.recv(1024).decode() print (server_reply)
注意事項:在python 3中,bytes和str是兩個不同的概念,send和recv的資料都是bytes,而str轉化成bytes是通過encode('utf8')實現,bytes轉化成str,是通過decode()實現;
在該階段,服務十分不穩定,經常會斷開,所以有下一個階段,且每人每次可以傳送多條訊息;
階段二 多執行緒併發聊天系統
在階段一中,伺服器端和客戶的通訊只能一發一收,不能實現伺服器端和客戶端雙方的自由訊息傳送,所以,我們引用多執行緒,我們將訊息的接收單獨開一個執行緒,這樣便可以伺服器端和客戶端實現同時傳送多條訊息,並不影響接收;
開始上程式碼:
server端:
import socket import threading # 匯入多執行緒模組 print("Waitting to be connected......") HostPort = ('127.0.0.1',socket.SOCK_STREAM) # 建立socket例項 s.bind(HostPort) s.listen(1) conn,addr = s.accept() true=True addr = str(addr) print('Connecting by : %s ' %addr ) def Receve(conn): # 將接收定義成一個函式 global true # 宣告全域性變數,當接收到的訊息為quit時,則觸發全域性變數 true = False,則會將socket關閉 while true: data = conn.recv(1024).decode('utf8') if data == 'quit': true=False print("you have receve: "+data+" from"+addr) # 當接收的值為'quit'時,退出接收執行緒,否則,迴圈接收並列印 thrd=threading.Thread(target=Receve,args=(conn,)) # 執行緒例項化,target為方法,args為方法的引數 thrd.start() # 啟動執行緒 while true: user_input = input('>>>') conn.send(user_input.encode('utf8')) # 迴圈傳送訊息 if user_input == 'quit': # 當傳送為‘quit'時,關閉socket true = False #conn.close() s.close()
client 端
import socket import threading hostport = ('127.0.0.1',socket.SOCK_STREAM) s.connect(hostport) true = True def Receve(s): global true while true: data = s.recv(1024).decode('utf8') if data == 'quit': true = False print('recevie news:\033[5;37;46m%s\033[0m' % data ) thrd=threading.Thread(target=Receve,args=(s,)) thrd.start() while true: user_input = input('>>>') s.send(user_input.encode('utf8')) if user_input == 'quit': true = False s.close()
效果展示(紫色字型為接收訊息,白色字型為傳送訊息,雙方任意一方輸入'quit',即可退出)
1、伺服器端:(原來只能伺服器端先接收訊息後才能傳送訊息,現在沒有這種限制,可以隨時主動傳送)
2、客戶端
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。