利用Python打造一個(gè)多人聊天室的示例詳解_第1頁(yè)
利用Python打造一個(gè)多人聊天室的示例詳解_第2頁(yè)
利用Python打造一個(gè)多人聊天室的示例詳解_第3頁(yè)
利用Python打造一個(gè)多人聊天室的示例詳解_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第利用Python打造一個(gè)多人聊天室的示例詳解vii.掌握利用Socket進(jìn)行編程的技術(shù)

viii.必須掌握多線(xiàn)程技術(shù),保證雙方可以同時(shí)發(fā)送

ix.建立聊天工具

x.可以和多個(gè)人同時(shí)進(jìn)行聊天

xi.必須使用圖形界面,顯示雙方的語(yǔ)錄

四、實(shí)驗(yàn)環(huán)境

PC多臺(tái),操作系統(tǒng)Win7,win10(32位、64位)

具備軟件python3.6。

五、操作方法與實(shí)驗(yàn)步驟

服務(wù)端

1.調(diào)入多線(xiàn)程、與scoket包,用于實(shí)現(xiàn)多線(xiàn)程連接

2.記錄本地地址與端口,開(kāi)啟監(jiān)聽(tīng),等待請(qǐng)求

3.收到某個(gè)客戶(hù)端的請(qǐng)求,建立連接,為每一個(gè)客戶(hù)端分配一個(gè)線(xiàn)程,并記錄客戶(hù)端地址與端口

4.收到某個(gè)客戶(hù)端發(fā)送的數(shù)據(jù),將數(shù)據(jù)轉(zhuǎn)發(fā)給所有與服務(wù)器連接的客戶(hù)機(jī)。

5.當(dāng)某個(gè)客戶(hù)端斷開(kāi)連接,通知所有與服務(wù)器連接的客戶(hù)機(jī)。

6.服務(wù)器一直保持監(jiān)聽(tīng)狀態(tài),等待其他客戶(hù)端接入服務(wù)器

7.代碼

importsocket

importthreading

num=0

defchat(service_client_socket,addr):

#等待接收客戶(hù)端消息存放在2個(gè)變量service_client_socket和addr里

ifnotaddrinuser:

print('Acceptnewconnectionfrom%s:%s...'%addr)

#如果addr不在user字典里則執(zhí)行以下代碼

forscsinserv_clie_socket:

serv_clie_socket[scs].send(data+'進(jìn)入聊天室...'.encode('utf-8'))

#發(fā)送user字典的data和address到客戶(hù)端

user[addr]=data.decode('utf-8')#data是最新進(jìn)入聊天室的客戶(hù),解壓后放入user

serv_clie_socket[addr]=service_client_socket#將服務(wù)器與服務(wù)器端口號(hào)為addr的套接字放入字典

#接收的消息解碼成utf-8并存在字典user里,鍵名定義為addr

#print("可以開(kāi)始聊天了")

#如果addr在user字典里,跳過(guò)本次循環(huán)

whileTrue:

d=service_client_socket.recv(1024)

if(('EXIT'.lower()ind.decode('utf-8'))|(d.decode('utf-8')=='error1')):

#如果EXIT在發(fā)送的data里

name=user[addr]

#user字典addr鍵對(duì)應(yīng)的值賦值給變量name

user.pop(addr)

serv_clie_socket.pop(addr)

#刪除user里的addr

forscsinserv_clie_socket:

#從user取出address

serv_clie_socket[scs].send((name+'離開(kāi)了聊天室...').encode('utf-8'))

#發(fā)送name和address到客戶(hù)端

print('Connectionfrom%s:%sclosed.'%addr)

globalnum

num=num-1

break

else:

print('"%s"from%s:%s'%(d.decode('utf-8'),addr[0],addr[1]))

forscsinserv_clie_socket:

#從user遍歷出address

ifserv_clie_socket[scs]!=service_client_socket:

#address不等于addr時(shí),執(zhí)行下面的代碼

serv_clie_socket[scs].send(d)

#發(fā)送data到客戶(hù)端

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#創(chuàng)建socket對(duì)象

addr=('127.0.0.1',9999)

s.bind(addr)#綁定地址和端口

s.listen(128)

print('TCPServeron',addr[0],":",addr[1],"......")

user={}#存放字典{addr:name}

serv_clie_socket={}#存放{socket:不同線(xiàn)程的套接字}

whileTrue:

try:

print("等待接收客戶(hù)端的連接請(qǐng)求....")

service_client_socket,addr=s.accept()#等待接收客戶(hù)端的連接請(qǐng)求

print("接收到客戶(hù)端的連接請(qǐng)求....")

exceptConnectionResetError:

print('Someoneleftunexcept.')

data=service_client_soc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論