用Python編寫簡(jiǎn)單的聊天程式教程
May 08, 2023 pm 06:37 PM實(shí)現(xiàn)想法
x01 服務(wù)端的建立
#首先,在服務(wù)端,使用socket進(jìn)行訊息的接受,每接受一個(gè)socket的請(qǐng)求,就開啟一個(gè)新的線程來管理訊息的分發(fā)與接受,同時(shí),又存在一個(gè)handler來管理所有的線程,從而實(shí)現(xiàn)對(duì)聊天室的各種功能的處理
x02 客戶端的建立
客戶端的建立就要比服務(wù)端簡(jiǎn)單多了,客戶端的作用只是對(duì)訊息的發(fā)送以及接受,以及按照特定的規(guī)則去輸入特定的字符從而實(shí)現(xiàn)不同的功能的使用,因此,在客戶端這裡,只需要去使用兩個(gè)線程,一個(gè)是專門用於接受訊息,一個(gè)是專門用於發(fā)送訊息的
#至於為什麼不用一個(gè)呢,那是因?yàn)?只用一個(gè)的話,當(dāng)接受了訊息,在發(fā)送之前接受訊息的處於阻塞狀態(tài),同理,發(fā)送訊息也是,那麼要是將這兩個(gè)功能放在一個(gè)地方實(shí)現(xiàn),就會(huì)導(dǎo)致沒有辦法連續(xù)發(fā)送或者接受訊息了
#實(shí)作方式
服務(wù)端實(shí)作
import?json import?threading from?socket?import?* from?time?import?ctime class?PyChattingServer: ????__socket?=?socket(AF_INET,?SOCK_STREAM,?0) ????__address?=?('',?12231) ????__buf?=?1024 ????def?__init__(self): ????????self.__socket.bind(self.__address) ????????self.__socket.listen(20) ????????self.__msg_handler?=?ChattingHandler() ????def?start_session(self): ????????print('等待客戶連接...\r\n') ????????try: ????????????while?True: ????????????????cs,?caddr?=?self.__socket.accept() ????????????????#?利用handler來管理線程,實(shí)現(xiàn)線程之間的socket的相互通信 ????????????????self.__msg_handler.start_thread(cs,?caddr) ????????except?socket.error: ????????????pass class?ChattingThread(threading.Thread): ????__buf?=?1024 ????def?__init__(self,?cs,?caddr,?msg_handler): ????????super(ChattingThread,?self).__init__() ????????self.__cs?=?cs ????????self.__caddr?=?caddr ????????self.__msg_handler?=?msg_handler ????#?使用多線程管理會(huì)話 ????def?run(self): ????????try: ????????????print('...連接來自于:',?self.__caddr) ????????????data?=?'歡迎你到來PY_CHATTING!請(qǐng)輸入你的很cooooool的昵稱(不能帶有空格喲`)\r\n' ????????????self.__cs.sendall(bytes(data,?'utf-8')) ????????????while?True: ????????????????data?=?self.__cs.recv(self.__buf).decode('utf-8') ????????????????if?not?data: ????????????????????break ????????????????self.__msg_handler.handle_msg(data,?self.__cs) ????????????????print(data) ????????except?socket.error?as?e: ????????????print(e.args) ????????????pass ????????finally: ????????????self.__msg_handler.close_conn(self.__cs) ????????????self.__cs.close() class?ChattingHandler: ????__help_str?=?"[?SYSTEM?]\r\n"?\ ?????????????????"輸入/ls,即可獲得所有登陸用戶信息\r\n"?\ ?????????????????"輸入/h,即可獲得幫助\r\n"?\ ?????????????????"輸入@用戶名?(注意用戶名后面的空格)+消息,即可發(fā)動(dòng)單聊\r\n"?\ ?????????????????"輸入/i,即可屏蔽群聊信息\r\n"?\ ?????????????????"再次輸入/i,即可取消屏蔽\r\n"?\ ?????????????????"所有首字符為/的信息都不會(huì)發(fā)送出去" ????__buf?=?1024 ????__socket_list?=?[] ????__user_name_to_socket?=?{} ????__socket_to_user_name?=?{} ????__user_name_to_broadcast_state?=?{} ????def?start_thread(self,?cs,?caddr): ????????self.__socket_list.append(cs) ????????chat_thread?=?ChattingThread(cs,?caddr,?self) ????????chat_thread.start() ????def?close_conn(self,?cs): ????????if?cs?not?in?self.__socket_list: ????????????return ????????#?去除socket的記錄 ????????nickname?=?"SOMEONE" ????????if?cs?in?self.__socket_list: ????????????self.__socket_list.remove(cs) ????????#?去除socket與username之間的映射關(guān)系 ????????if?cs?in?self.__socket_to_user_name: ????????????nickname?=?self.__socket_to_user_name[cs] ????????????self.__user_name_to_socket.pop(self.__socket_to_user_name[cs]) ????????????self.__socket_to_user_name.pop(cs) ????????????self.__user_name_to_broadcast_state.pop(nickname) ????????nickname?+=?"?" ????????#?廣播某玩家退出聊天室 ????????self.broadcast_system_msg(nickname?+?"離開了PY_CHATTING") ????#?管理用戶輸入的信息 ????def?handle_msg(self,?msg,?cs): ????????js?=?json.loads(msg) ????????if?js['type']?==?"login": ????????????if?js['msg']?not?in?self.__user_name_to_socket: ????????????????if?'?'?in?js['msg']: ????????????????????self.send_to(json.dumps({ ????????????????????????'type':?'login', ????????????????????????'success':?False, ????????????????????????'msg':?'賬號(hào)不能夠帶有空格' ????????????????????}),?cs) ????????????????else: ????????????????????self.__user_name_to_socket[js['msg']]?=?cs ????????????????????self.__socket_to_user_name[cs]?=?js['msg'] ????????????????????self.__user_name_to_broadcast_state[js['msg']]?=?True ????????????????????self.send_to(json.dumps({ ????????????????????????'type':?'login', ????????????????????????'success':?True, ????????????????????????'msg':?'昵稱建立成功,輸入/ls可查看所有在線的人,輸入/help可以查看幫助(所有首字符為/的消息都不會(huì)發(fā)送)' ????????????????????}),?cs) ????????????????????#?廣播其他人,他已經(jīng)進(jìn)入聊天室 ????????????????????self.broadcast_system_msg(js['msg']?+?"已經(jīng)進(jìn)入了聊天室") ????????????else: ????????????????self.send_to(json.dumps({ ????????????????????'type':?'login', ????????????????????'success':?False, ????????????????????'msg':?'賬號(hào)已存在' ????????????????}),?cs) ????????#?若玩家處于屏蔽模式,則無法發(fā)送群聊消息 ????????elif?js['type']?==?"broadcast": ????????????if?self.__user_name_to_broadcast_state[self.__socket_to_user_name[cs]]: ????????????????self.broadcast(js['msg'],?cs) ????????????else: ????????????????self.send_to(json.dumps({ ????????????????????'type':?'broadcast', ????????????????????'msg':?'屏蔽模式下無法發(fā)送群聊信息' ????????????????}),?cs) ????????elif?js['type']?==?"ls": ????????????self.send_to(json.dumps({ ????????????????'type':?'ls', ????????????????'msg':?self.get_all_login_user_info() ????????????}),?cs) ????????elif?js['type']?==?"help": ????????????self.send_to(json.dumps({ ????????????????'type':?'help', ????????????????'msg':?self.__help_str ????????????}),?cs) ????????elif?js['type']?==?"sendto": ????????????self.single_chatting(cs,?js['nickname'],?js['msg']) ????????elif?js['type']?==?"ignore": ????????????self.exchange_ignore_state(cs) ????def?exchange_ignore_state(self,?cs): ????????if?cs?in?self.__socket_to_user_name: ????????????state?=?self.__user_name_to_broadcast_state[self.__socket_to_user_name[cs]] ????????????if?state: ????????????????state?=?False ????????????else: ????????????????state?=?True ????????????self.__user_name_to_broadcast_state.pop(self.__socket_to_user_name[cs]) ????????????self.__user_name_to_broadcast_state[self.__socket_to_user_name[cs]]?=?state ????????????if?self.__user_name_to_broadcast_state[self.__socket_to_user_name[cs]]: ????????????????msg?=?"通常模式" ????????????else: ????????????????msg?=?"屏蔽模式" ????????????self.send_to(json.dumps({ ????????????????'type':?'ignore', ????????????????'success':?True, ????????????????'msg':?'[TIME?:?%s]\r\n[?SYSTEM?]?:?%s\r\n'?%?(ctime(),?"模式切換成功,現(xiàn)在是"?+?msg) ????????????}),?cs) ????????else: ????????????self.send_to({ ????????????????'type':?'ignore', ????????????????'success':?False, ????????????????'msg':?'切換失敗' ????????????},?cs) ????def?single_chatting(self,?cs,?nickname,?msg): ????????if?nickname?in?self.__user_name_to_socket: ????????????msg?=?'[TIME?:?%s]\r\n[?%s?CHATTING?TO?%s?]?:?%s\r\n'?%?( ????????????????ctime(),?self.__socket_to_user_name[cs],?nickname,?msg) ????????????self.send_to_list(json.dumps({ ????????????????'type':?'single', ????????????????'msg':?msg ????????????}),?self.__user_name_to_socket[nickname],?cs) ????????else: ????????????self.send_to(json.dumps({ ????????????????'type':?'single', ????????????????'msg':?'該用戶不存在' ????????????}),?cs) ????????print(nickname) ????def?send_to_list(self,?msg,?*cs): ????????for?i?in?range(len(cs)): ????????????self.send_to(msg,?cs[i]) ????def?get_all_login_user_info(self): ????????login_list?=?"[?SYSTEM?]?ALIVE?USER?:?\r\n" ????????for?key?in?self.__socket_to_user_name: ????????????login_list?+=?self.__socket_to_user_name[key]?+?",\r\n" ????????return?login_list ????def?send_to(self,?msg,?cs): ????????if?cs?not?in?self.__socket_list: ????????????self.__socket_list.append(cs) ????????cs.sendall(bytes(msg,?'utf-8')) ????def?broadcast_system_msg(self,?msg): ????????data?=?'[TIME?:?%s]\r\n[?SYSTEM?]?:?%s\r\n'?%?(ctime(),?msg) ????????js?=?json.dumps({ ????????????'type':?'system_msg', ????????????'msg':?data ????????}) ????????#?屏蔽了群聊的玩家也可以獲得系統(tǒng)的群發(fā)信息 ????????for?i?in?range(len(self.__socket_list)): ????????????if?self.__socket_list[i]?in?self.__socket_to_user_name: ????????????????self.__socket_list[i].sendall(bytes(js,?'utf-8')) ????def?broadcast(self,?msg,?cs): ????????data?=?'[TIME?:?%s]\r\n[%s]?:?%s\r\n'?%?(ctime(),?self.__socket_to_user_name[cs],?msg) ????????js?=?json.dumps({ ????????????'type':?'broadcast', ????????????'msg':?data ????????}) ????????#?沒有的登陸的玩家無法得知消息,屏蔽了群聊的玩家也沒辦法獲取信息 ????????for?i?in?range(len(self.__socket_list)): ????????????if?self.__socket_list[i]?in?self.__socket_to_user_name?\ ????????????????????and?self.__user_name_to_broadcast_state[self.__socket_to_user_name[self.__socket_list[i]]]: ????????????????self.__socket_list[i].sendall(bytes(js,?'utf-8')) def?main(): ????server?=?PyChattingServer() ????server.start_session() main()
客戶端的實(shí)作
import?json import?threading from?socket?import?* is_login?=?False is_broadcast?=?True class?ClientReceiveThread(threading.Thread): ????__buf?=?1024 ????def?__init__(self,?cs): ????????super(ClientReceiveThread,?self).__init__() ????????self.__cs?=?cs ????def?run(self): ????????self.receive_msg() ????def?receive_msg(self): ????????while?True: ????????????msg?=?self.__cs.recv(self.__buf).decode('utf-8') ????????????if?not?msg: ????????????????break ????????????js?=?json.loads(msg) ????????????if?js['type']?==?"login": ????????????????if?js['success']: ????????????????????global?is_login ????????????????????is_login?=?True ????????????????print(js['msg']) ????????????elif?js['type']?==?"ignore": ????????????????if?js['success']: ????????????????????global?is_broadcast ????????????????????if?is_broadcast: ????????????????????????is_broadcast?=?False ????????????????????else: ????????????????????????is_broadcast?=?True ????????????????print(js['msg']) ????????????else: ????????????????if?not?is_broadcast: ????????????????????print("[現(xiàn)在處于屏蔽模式]") ????????????????print(js['msg']) class?ClientSendMsgThread(threading.Thread): ????def?__init__(self,?cs): ????????super(ClientSendMsgThread,?self).__init__() ????????self.__cs?=?cs ????def?run(self): ????????self.send_msg() ????#?根據(jù)不同的輸入格式來進(jìn)行不同的聊天方式 ????def?send_msg(self): ????????while?True: ????????????js?=?None ????????????msg?=?input() ????????????if?not?is_login: ????????????????js?=?json.dumps({ ????????????????????'type':?'login', ????????????????????'msg':?msg ????????????????}) ????????????elif?msg[0]?==?"@": ????????????????data?=?msg.split('?') ????????????????if?not?data: ????????????????????print("請(qǐng)重新輸入") ????????????????????break ????????????????nickname?=?data[0] ????????????????nickname?=?nickname.strip("@") ????????????????if?len(data)?==?1: ????????????????????data.append("?") ????????????????js?=?json.dumps({ ????????????????????'type':?'sendto', ????????????????????'nickname':?nickname, ????????????????????'msg':?data[1] ????????????????}) ????????????elif?msg?==?"/help": ????????????????js?=?json.dumps({ ????????????????????'type':?'help', ????????????????????'msg':?None ????????????????}) ????????????elif?msg?==?"/ls": ????????????????js?=?json.dumps({ ????????????????????'type':?'ls', ????????????????????'msg':?None ????????????????}) ????????????elif?msg?==?"/i": ????????????????js?=?json.dumps({ ????????????????????'type':?'ignore', ????????????????????'msg':?None ????????????????}) ????????????else: ????????????????if?msg[0]?!=?'/': ????????????????????js?=?json.dumps({ ????????????????????????'type':?'broadcast', ????????????????????????'msg':?msg ????????????????????}) ????????????if?js?is?not?None: ????????????????self.__cs.sendall(bytes(js,?'utf-8')) def?main(): ????buf?=?1024 ????#?改變這個(gè)的地址,變成服務(wù)器的地址,那么只要部署到服務(wù)器上就可以全網(wǎng)使用了 ????address?=?("127.0.0.1",?12231) ????cs?=?socket(AF_INET,?SOCK_STREAM,?0) ????cs.connect(address) ????data?=?cs.recv(buf).decode("utf-8") ????if?data: ????????print(data) ????receive_thread?=?ClientReceiveThread(cs) ????receive_thread.start() ????send_thread?=?ClientSendMsgThread(cs) ????send_thread.start() ????while?True: ????????pass main()
以上是用Python編寫簡(jiǎn)單的聊天程式教程的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

要實(shí)現(xiàn)PHP結(jié)合AI進(jìn)行文本糾錯(cuò)與語法優(yōu)化,需按以下步驟操作:1.選擇適合的AI模型或API,如百度、騰訊API或開源NLP庫;2.通過PHP的curl或Guzzle調(diào)用API並處理返回結(jié)果;3.在應(yīng)用中展示糾錯(cuò)信息並允許用戶選擇是否採(cǎi)納;4.使用php-l和PHP_CodeSniffer進(jìn)行語法檢測(cè)與代碼優(yōu)化;5.持續(xù)收集反饋並更新模型或規(guī)則以提升效果。選擇AIAPI時(shí)應(yīng)重點(diǎn)評(píng)估準(zhǔn)確率、響應(yīng)速度、價(jià)格及對(duì)PHP的支持。代碼優(yōu)化應(yīng)遵循PSR規(guī)範(fàn)、合理使用緩存、避免循環(huán)查詢、定期審查代碼,並藉助X

用戶語音輸入通過前端JavaScript的MediaRecorderAPI捕獲並發(fā)送至PHP後端;2.PHP將音頻保存為臨時(shí)文件後調(diào)用STTAPI(如Google或百度語音識(shí)別)轉(zhuǎn)換為文本;3.PHP將文本發(fā)送至AI服務(wù)(如OpenAIGPT)獲取智能回復(fù);4.PHP再調(diào)用TTSAPI(如百度或Google語音合成)將回復(fù)轉(zhuǎn)為語音文件;5.PHP將語音文件流式返回前端播放,完成交互。整個(gè)流程由PHP主導(dǎo)數(shù)據(jù)流轉(zhuǎn)與錯(cuò)誤處理,確保各環(huán)節(jié)無縫銜接。

本文為您精選了多個(gè)頂級(jí)的Python“成品”項(xiàng)目網(wǎng)站與高水平“大片”級(jí)學(xué)習(xí)資源入口。無論您是想尋找開發(fā)靈感、觀摩學(xué)習(xí)大師級(jí)的源代碼,還是系統(tǒng)性地提昇實(shí)戰(zhàn)能力,這些平臺(tái)都是不容錯(cuò)過的寶庫,能幫助您快速成長(zhǎng)為Python高手。

收集用戶行為數(shù)據(jù)需通過PHP記錄瀏覽、搜索、購(gòu)買等信息至數(shù)據(jù)庫,並清洗分析以挖掘興趣偏好;2.推薦算法選擇應(yīng)根據(jù)數(shù)據(jù)特徵決定:基於內(nèi)容、協(xié)同過濾、規(guī)則或混合推薦;3.協(xié)同過濾在PHP中可實(shí)現(xiàn)為計(jì)算用戶餘弦相似度、選K近鄰、加權(quán)預(yù)測(cè)評(píng)分並推薦高分商品;4.性能評(píng)估用準(zhǔn)確率、召回率、F1值及CTR、轉(zhuǎn)化率並通過A/B測(cè)試驗(yàn)證效果;5.冷啟動(dòng)問題可通過商品屬性、用戶註冊(cè)信息、熱門推薦和專家評(píng)價(jià)緩解;6.性能優(yōu)化手段包括緩存推薦結(jié)果、異步處理、分佈式計(jì)算與SQL查詢優(yōu)化,從而提升推薦效率與用戶體驗(yàn)。

選擇合適的PHP框架需根據(jù)項(xiàng)目需求綜合考慮:Laravel適合快速開發(fā),提供EloquentORM和Blade模板引擎,便於數(shù)據(jù)庫操作和動(dòng)態(tài)表單渲染;Symfony更靈活,適合複雜系統(tǒng);CodeIgniter輕量,適用於對(duì)性能要求較高的簡(jiǎn)單應(yīng)用。 2.確保AI模型準(zhǔn)確性需從高質(zhì)量數(shù)據(jù)訓(xùn)練、合理選擇評(píng)估指標(biāo)(如準(zhǔn)確率、召回率、F1值)、定期性能評(píng)估與模型調(diào)優(yōu)入手,並通過單元測(cè)試和集成測(cè)試保障代碼質(zhì)量,同時(shí)持續(xù)監(jiān)控輸入數(shù)據(jù)以防止數(shù)據(jù)漂移。 3.保護(hù)用戶隱私需採(cǎi)取多項(xiàng)措施:對(duì)敏感數(shù)據(jù)進(jìn)行加密存儲(chǔ)(如AES

使用Seaborn的jointplot可快速可視化兩個(gè)變量間的關(guān)係及各自分佈;2.基礎(chǔ)散點(diǎn)圖通過sns.jointplot(data=tips,x="total_bill",y="tip",kind="scatter")實(shí)現(xiàn),中心為散點(diǎn)圖,上下和右側(cè)顯示直方圖;3.添加回歸線和密度信息可用kind="reg",並結(jié)合marginal_kws設(shè)置邊緣圖樣式;4.數(shù)據(jù)量大時(shí)推薦kind="hex",用

PHP開發(fā)AI文本摘要的核心是作為協(xié)調(diào)器調(diào)用外部AI服務(wù)API(如OpenAI、HuggingFace),實(shí)現(xiàn)文本預(yù)處理、API請(qǐng)求、響應(yīng)解析與結(jié)果展示;2.局限性在於計(jì)算性能弱、AI生態(tài)薄弱,應(yīng)對(duì)策略為藉力API、服務(wù)解耦和異步處理;3.模型選擇需權(quán)衡摘要質(zhì)量、成本、延遲、並發(fā)、數(shù)據(jù)隱私,推薦使用GPT或BART/T5等抽象式模型;4.性能優(yōu)化包括緩存、異步隊(duì)列、批量處理和就近區(qū)域選擇,錯(cuò)誤處理需覆蓋限流重試、網(wǎng)絡(luò)超時(shí)、密鑰安全、輸入驗(yàn)證及日誌記錄,以確保系統(tǒng)穩(wěn)定高效運(yùn)行。

1.PHP在AI內(nèi)容推薦系統(tǒng)中主要承擔(dān)數(shù)據(jù)收集、API通信、業(yè)務(wù)規(guī)則處理、緩存優(yōu)化與推薦展示等角色,而非直接執(zhí)行複雜模型訓(xùn)練;2.系統(tǒng)通過PHP收集用戶行為與內(nèi)容數(shù)據(jù),調(diào)用後端AI服務(wù)(如Python模型)獲取推薦結(jié)果,並利用Redis緩存提升性能;3.基礎(chǔ)推薦算法如協(xié)同過濾或內(nèi)容相似度可在PHP中實(shí)現(xiàn)輕量級(jí)邏輯,但大規(guī)模計(jì)算仍依賴專業(yè)AI服務(wù);4.優(yōu)化需關(guān)注實(shí)時(shí)性、冷啟動(dòng)、多樣性及反饋閉環(huán),挑戰(zhàn)包括高並發(fā)性能、模型更新平穩(wěn)性、數(shù)據(jù)合規(guī)與推薦可解釋性,PHP需協(xié)同消息隊(duì)列、數(shù)據(jù)庫與前端共同構(gòu)建穩(wěn)
