您好,登錄后才能下訂單哦!
本文實例為大家分享了基于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',9999) s = socket.socket(socket.AF_INET,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',9999) s = socket.socket(socket.AF_INET,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',9999) s = socket.socket(socket.AF_INET,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、客戶端
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。