基于python3的socket聊天編程
本文實(shí)例為大家分享了基于python3的socket聊天編程,供大家參考,具體內(nèi)容如下
階段一:最簡(jiǎn)易的聊天系統(tǒng)
缺點(diǎn):程序不夠完善,只能一來(lái)一回,且沒(méi)人每次只能說(shuō)一句話(huà)
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)
注意事項(xiàng):在python 3中,bytes和str是兩個(gè)不同的概念,send和recv的數(shù)據(jù)都是bytes,而str轉(zhuǎn)化成bytes是通過(guò)encode('utf8')實(shí)現(xiàn),bytes轉(zhuǎn)化成str,是通過(guò)decode()實(shí)現(xiàn);
在該階段,服務(wù)十分不穩(wěn)定,經(jīng)常會(huì)斷開(kāi),所以有下一個(gè)階段,且每人每次可以發(fā)送多條消息;
階段二 多線(xiàn)程并發(fā)聊天系統(tǒng)
在階段一中,服務(wù)器端和客戶(hù)的通信只能一發(fā)一收,不能實(shí)現(xiàn)服務(wù)器端和客戶(hù)端雙方的自由消息發(fā)送,所以,我們引用多線(xiàn)程,我們將消息的接收單獨(dú)開(kāi)一個(gè)線(xiàn)程,這樣便可以服務(wù)器端和客戶(hù)端實(shí)現(xiàn)同時(shí)發(fā)送多條消息,并不影響接收;
開(kāi)始上代碼:
server端:
import socket
import threading # 導(dǎo)入多線(xiàn)程模塊
print("Waitting to be connected......")
HostPort = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 創(chuàng)建socket實(shí)例
s.bind(HostPort)
s.listen(1)
conn,addr = s.accept()
true=True
addr = str(addr)
print('Connecting by : %s ' %addr )
def Receve(conn): # 將接收定義成一個(gè)函數(shù)
global true # 聲明全局變量,當(dāng)接收到的消息為quit時(shí),則觸發(fā)全局變量 true = False,則會(huì)將socket關(guān)閉
while true:
data = conn.recv(1024).decode('utf8')
if data == 'quit':
true=False
print("you have receve: "+data+" from"+addr) # 當(dāng)接收的值為'quit'時(shí),退出接收線(xiàn)程,否則,循環(huán)接收并打印
thrd=threading.Thread(target=Receve,args=(conn,)) # 線(xiàn)程實(shí)例化,target為方法,args為方法的參數(shù)
thrd.start() # 啟動(dòng)線(xiàn)程
while true:
user_input = input('>>>')
conn.send(user_input.encode('utf8')) # 循環(huán)發(fā)送消息
if user_input == 'quit': # 當(dāng)發(fā)送為‘quit'時(shí),關(guān)閉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()
效果展示(紫色字體為接收消息,白色字體為發(fā)送消息,雙方任意一方輸入'quit',即可退出)
1、服務(wù)器端:(原來(lái)只能服務(wù)器端先接收消息后才能發(fā)送消息,現(xiàn)在沒(méi)有這種限制,可以隨時(shí)主動(dòng)發(fā)送)

2、客戶(hù)端

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python?requests用法和django后臺(tái)處理詳解
這篇文章主要給大家介紹了關(guān)于Python中requests用法和django后臺(tái)處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03
Anaconda+pycharm安裝及環(huán)境配置全過(guò)程
在使用pyCharm進(jìn)行開(kāi)發(fā)時(shí),需要用到Anaconda創(chuàng)建的環(huán)境,下面這篇文章主要給大家介紹了關(guān)于Anaconda+pycharm安裝及環(huán)境配置的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
用python刪除java文件頭上版權(quán)信息的方法
在使用他人代碼時(shí),為不保留文件頭部版權(quán)信息,需要一個(gè)個(gè)刪掉,下面是用python刪除java文件頭上的版權(quán)信息的方法2014-07-07
Python接口開(kāi)發(fā)實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了Python接口開(kāi)發(fā)實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
python base64 decode incorrect padding錯(cuò)誤解決方法
這篇文章主要介紹了python base64 decode incorrect padding錯(cuò)誤解決方法,本文使用把string補(bǔ)齊等號(hào)的方法解決了這個(gè)錯(cuò)誤,需要的朋友可以參考下2015-01-01
python paramiko實(shí)現(xiàn)ssh遠(yuǎn)程訪問(wèn)的方法
這篇文章主要介紹了python paramiko模塊實(shí)現(xiàn)ssh遠(yuǎn)程訪問(wèn)的方法,大家參考使用2013-12-12
Python實(shí)現(xiàn)銀行賬戶(hù)資金交易管理系統(tǒng)
這篇文章主要介紹了Python銀行賬戶(hù)資金交易管理系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
我在七夕佳節(jié)用Python制作的表白神器,程序員也應(yīng)該擁有愛(ài)情!建議收藏
這篇文章主要介紹了我在七夕佳節(jié)用Python制作的表白神器,建議收藏,程序員也該擁有愛(ài)情,感興趣的小伙伴快來(lái)看看吧2021-08-08
Python使用xpath實(shí)現(xiàn)圖片爬取
這篇文章主要介紹了Python使用xpath實(shí)現(xiàn)圖片爬取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

