国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Python的網(wǎng)絡(luò)聊天室設(shè)計

2019-06-20 10:31:23鄧亞君楊剛翁文斌邱瀘誼
電子技術(shù)與軟件工程 2019年5期
關(guān)鍵詞:聊天室服務(wù)端線程

鄧亞君 楊剛 翁文斌 邱瀘誼

摘要??? 本文使用的網(wǎng)絡(luò)編程模型是客戶端/服務(wù)端(C/S)結(jié)構(gòu),網(wǎng)絡(luò)聊天功能通過socket模塊實現(xiàn),用戶在客戶端上登錄到指定端口的服務(wù)端與其他用戶進(jìn)行網(wǎng)絡(luò)聊天。服務(wù)器啟動后,等待客戶端的連接,轉(zhuǎn)發(fā)客戶端指定的聊天用戶或所有的其他用戶??蛻舳藛雍笤赑ython的GUI界面接收用戶傳遞到服務(wù)器端的消息。某一用戶可以與指定用戶進(jìn)行私聊,也可以向系統(tǒng)中其他已經(jīng)登錄的客戶發(fā)送消息實現(xiàn)自由聊天,同時可以管理好友列表如添加或刪除好友。

【關(guān)鍵詞】網(wǎng)絡(luò)通信socket多線程GUI界面

1 前言

在互聯(lián)網(wǎng)相當(dāng)流行的時代,人們對網(wǎng)絡(luò)的依賴與日俱增,網(wǎng)絡(luò)交流更是成為了人們生活的一部分。借助網(wǎng)絡(luò)聊天工具,人們足不出戶就可實現(xiàn)閑聊甚至工作交流,使人們的日常生活與工作需求更加便利。網(wǎng)絡(luò)聊天室主要包括文字聊天室和視頻聊天室這兩種。本次設(shè)計的文字聊天室使用的是Python語言,它具有面向?qū)ο?、與平臺無關(guān)、安全、多線程等特點。

2 總體方案設(shè)計

2.1 設(shè)計原理

Socket對象在網(wǎng)絡(luò)編程中承擔(dān)著重要任務(wù),能夠用套接字技術(shù)編寫一個網(wǎng)絡(luò)聊天室,每個用戶需要服務(wù)器啟動一個線程進(jìn)行相應(yīng)工作。在該線程中借助套接字實現(xiàn)客戶間信息交流,當(dāng)服務(wù)器接收到客戶端發(fā)送的聊天信息時,服務(wù)器可以在相應(yīng)的線程的輸入流中寫入相關(guān)信息,然后特定的客戶套接字的輸入流便能讀取到相關(guān)信息。

2.2 基本設(shè)計概念和處理流程

本系統(tǒng)運(yùn)行用Python開發(fā),采用C/S結(jié)構(gòu),系統(tǒng)分為客戶端和服務(wù)端兩大部分,使用socket庫建立套接字實現(xiàn)客戶端和服務(wù)端的通信。

服務(wù)器端先將Socket初始化,然后綁定指定端口,實現(xiàn)端口監(jiān)聽,調(diào)用accept方法實現(xiàn)TCP阻塞,等待客戶端連接。如果這時有一個Socket對象被客戶端初始化,并向服務(wù)器請求連接。如果連接成功,數(shù)據(jù)便可以在客戶端與服務(wù)端之間進(jìn)行傳遞。服務(wù)端接收客戶端發(fā)送的數(shù)據(jù)請求并處理,之后將回應(yīng)數(shù)據(jù)發(fā)送給指定客戶端,該客戶端讀取相應(yīng)數(shù)據(jù),如果沒有數(shù)據(jù)傳遞則關(guān)閉連接,交互完畢。如圖1所示。

這個聊天室采用的是面向連接的傳輸控制協(xié)議,即TCP(Transmission Control Protocol)。TCP協(xié)議在傳送數(shù)據(jù)前必須先建立連接,并在數(shù)據(jù)傳送后要釋放連接。TCP能夠?qū)崿F(xiàn)全雙工通信提供可靠交互的服務(wù),能按序到達(dá)目的端,且不會出現(xiàn)錯誤。

3 單元模塊設(shè)計

3.1 客戶端

客戶端代碼可以實現(xiàn)在登錄窗口中通過套接字連接到本機(jī)IP地址127.0.0.1,端口號為9999的指定服務(wù)端。登錄時通過觸發(fā)登錄按鈕調(diào)用login_sever函數(shù),退出登錄時調(diào)用exit_system函數(shù)。使用Python的內(nèi)置模塊tkinter描繪界面,其模塊中的Tk接口是Python的標(biāo)準(zhǔn)GUI工具包的接口,使用import tkinter的命令即可將該模塊導(dǎo)入程序。編寫程序時,將窗口的長寬設(shè)置為不可變的情況,這樣可以保證內(nèi)部控件位置的合理性。用exit_system函數(shù)實現(xiàn)客戶端退出,login_sever函數(shù)實現(xiàn)登錄。在登錄函數(shù)中調(diào)用connect_sever函數(shù),創(chuàng)建socket對象,連接對應(yīng)的服務(wù)端,并為該客戶端啟動一個線程??蛻舳擞酗@示對話的功能,并且通過敏感字向聊天室的所有人發(fā)送消息,實現(xiàn)群聊和私聊。get_info函數(shù)可以實現(xiàn)接受服務(wù)器發(fā)來的消息,并且能夠?qū)⒑糜殃欠Q插入好友列表中。通過好友列表中的Delete鍵將來將好友刪除,以此來管理好友。在本程序中能夠自動將已發(fā)送消息的好友昵稱添加至好友列表。該功能的實現(xiàn)是調(diào)用tkinter模塊中l(wèi)istbox的delete方法,實現(xiàn)指定好友從列表中刪除??蛻舳四軌?qū)崿F(xiàn)將本用戶的消息發(fā)給服務(wù)端,并且在自己的消息框中展示。通過insert_user()函數(shù)將選中的好友名放入發(fā)送好友框中,進(jìn)行指定好友通信,實現(xiàn)私聊??蛻舳说娜毫暮退搅牡南⒄故究梢栽谕淮翱谡故尽DM客戶端E與客戶端Q私聊的消息可以在兩方的消息框中展示,并且不會被其他用戶看見他們之間私聊的消息。

3.2 服務(wù)端

在服務(wù)器程序中首先要綁定一個固定端口并監(jiān)聽來自其他客戶端的連接。如果某個客戶端已發(fā)送連接請求,服務(wù)器就與該客戶端建立Socket連接。在大量的客戶端連接中,服務(wù)器通過一個Socket連接的服務(wù)器地址與端口和客戶端的地址與端口來確定是否為唯一的Socket。之所以服務(wù)器要對每個客戶端的連接需要一個新的線程來處理,是因為服務(wù)器必須同時響應(yīng)多個客戶端的請求。首先初始化socket對象,同時使用thread模塊實現(xiàn)多線程功能。然后調(diào)用Socket對象中的bind()函數(shù)來指定服務(wù)器的port端口和具體IP地址。最后調(diào)用socket對象的accept()方法,等待客戶端的連接,并返回連接對象。

1. win = tkinter.Tk() # 創(chuàng)建主窗口

2. win.mainloop() # 相應(yīng)窗口動態(tài)

用tkinter實現(xiàn)GUI界面繪制,entryIp和entryport定義了兩個輸入框,從鍵盤中獲得服務(wù)器的地址和端口。在本程序運(yùn)行中,采用本機(jī)地址127.0.0.1,選擇數(shù)值較大且不易被計算機(jī)使用的端口號9999。對“啟動”按鍵進(jìn)行綁定函數(shù)startSever,用來為服務(wù)器運(yùn)行開啟一個線程。

1. def startSever():

2. s = threading.Thread(target=start)# 啟 用一個線程開啟服務(wù)器

3. s.start()# 開啟線程

在為服務(wù)器啟動的線程中,自動觸發(fā)start函數(shù),使服務(wù)器開始監(jiān)聽客戶連接,并進(jìn)行相應(yīng)的要求應(yīng)答。服務(wù)器每次收到一個客戶端的連接請求就為它開啟一個線程,同時觸發(fā)run函數(shù)。在該函數(shù)中使用while True命令實現(xiàn)服務(wù)端不斷接收客戶端的信息的功能。在run函數(shù)里面,服務(wù)器使用ck.recv(1024)指令接收客戶端發(fā)送的消息,并且在for循環(huán)中,判斷客戶發(fā)來的消息中是否含有“@全體成員”,對infolist客戶列表進(jìn)行遍歷,將消息發(fā)送給所有客戶端。

在客戶登錄后,通過廣播歡迎消息,可以使客戶盡快向聊天室的其他成員發(fā)送消息,這樣就可以在房間內(nèi)自由聊天。

4 總體系統(tǒng)

在進(jìn)行測試系統(tǒng)時,先運(yùn)行服務(wù)端程序,通過操作建立模擬服務(wù)器,等待客戶端的連接。在本設(shè)計中,總共運(yùn)行了三次客戶端的程序,分別模擬用戶Q、用戶W和用戶E。三個客戶分別登錄到模擬服務(wù)器,所以只需要向服務(wù)器發(fā)送消息,便可以向其他用戶發(fā)送相應(yīng)的消息??蛻艨梢韵蛉w成員發(fā)送消息,并且客戶端之間互發(fā)消息不被別人知曉。

能夠?qū)崿F(xiàn)服務(wù)器與和客戶端之間的通信依賴于socket庫的網(wǎng)絡(luò)編程的方法。s.bind()將套接字綁定到指定地址,s.listen(num)開始監(jiān)聽傳入連接,其中num的含義是在拒絕連接之前,計算機(jī)可以掛起的最大連接數(shù)量,s.accept()接受連接并返回連接對象,可以用來接收和發(fā)送數(shù)據(jù),accept()方法采用阻塞式策略等待接收TCP客戶的連接。s.recv()用來接受套接字的數(shù)據(jù)。s.send()將接收到的數(shù)據(jù)發(fā)送到指定的套接字。以上幾種命令便是在本設(shè)計的客戶端和服務(wù)端程序中使用最多的方法,也是網(wǎng)絡(luò)通信必不可少的環(huán)節(jié)。

5 結(jié)論

服務(wù)端能夠顯示已連接的用戶,并且向指定用戶甚至所有用戶發(fā)送消息,存在特殊關(guān)鍵字的消息可以使人更加明確的知道是群聊消息,通過切換發(fā)送對象能夠隨時隨心的私聊??蛻舳说牧奶旖缑婵梢燥@示每條消息的發(fā)送時間,并且可以在好友列表中自動插入已給自己發(fā)送信息的用戶名??蛻艨梢酝ㄟ^刪除鍵刪除好友名稱,也可以在發(fā)送框中選擇未在列表里的在線用戶進(jìn)行交流。

參考文獻(xiàn)

[1]楊心強(qiáng),陳國有.數(shù)據(jù)通信與計算機(jī)網(wǎng)絡(luò)[M].北京:電子工業(yè)出版社,2018(06).

[2]張蕾.網(wǎng)絡(luò)控制中心的遠(yuǎn)程智能監(jiān)控系統(tǒng)[J].科技資訊,2014.

[3]王豐錦,邵新宇,喻道遠(yuǎn),李培根.基于SOCKET和多線程的應(yīng)用程序間通信技術(shù)的研究[J].計算機(jī)應(yīng)用,2000(06).

[4]楊國軍.一種基于WinSocket的聊天程序設(shè)計方法[J].內(nèi)江科技,2007(02).

猜你喜歡
聊天室服務(wù)端線程
多多熊聊天室
新少年(2023年10期)2023-10-24 07:47:12
云存儲中基于相似性的客戶-服務(wù)端雙端數(shù)據(jù)去重方法
新時期《移動Web服務(wù)端開發(fā)》課程教學(xué)改革的研究
在Windows Server 2008上創(chuàng)建應(yīng)用
歌劇聊天室 洗洗曬曬,又是新一天
歌劇(2017年4期)2017-05-17 04:07:29
歌劇聊天室 永遠(yuǎn)盛放的雪絨花
歌劇(2017年3期)2017-05-17 04:06:47
淺談linux多線程協(xié)作
Linux線程實現(xiàn)技術(shù)研究
“鴿子”玩升級 黑你沒商量
么移動中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
白水县| 邵阳县| 林甸县| 大新县| 丰顺县| 巴楚县| 嘉义县| 扶风县| 勐海县| 中山市| 新昌县| 阿瓦提县| 普安县| 祁阳县| 龙岩市| 额尔古纳市| 古交市| 张家界市| 武山县| 东海县| 大荔县| 都兰县| 台安县| 昭觉县| 察哈| 尖扎县| 通州区| 河间市| 绥芬河市| 江西省| 句容市| 泗洪县| 西藏| 湘阴县| 瓦房店市| 浑源县| 上林县| 博乐市| 垣曲县| 新安县| 永平县|