python socket清空接受区_用Python制作只属于你和ta的聊天渠道吧
前言
本文的文字及圖片來源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問題請及時聯(lián)系我們以作處理。
作者: Python應(yīng)用寶典
PS:如有需要Python學(xué)習(xí)資料的小伙伴可以加點擊下方鏈接自行獲取
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef
原理簡介
在我們今天的教程中,將用到即時通訊的概念,即時通訊允許兩人或多人同時使用網(wǎng)絡(luò)傳遞文字信息、文字、語音等。即時通訊一般都基于socket連接,socket連接可用于發(fā)送或接受數(shù)據(jù),一般的組合形式是IP+端口號。
也就是說,在我們的例子中,聊天的雙方,由一方要承擔(dān)“服務(wù)器 ” 的責(zé)任,維持一個socket服務(wù)器,等待連接進(jìn)入;另一方則是“客戶端”,在服務(wù)器端維持等待狀態(tài)時即可發(fā)送請求,建立連接。
當(dāng)你和ta想進(jìn)入“小黑屋 ” 里聊天的時候,只有有一方充當(dāng)服務(wù)器,另一方充當(dāng)客戶端即可,作為“服務(wù)器端 ” 的那個人,在微信中將IP和端口號告訴對方,即可構(gòu)建連接,在小黑屋里聊天,這個小黑屋里的數(shù)據(jù)不會被任何數(shù)據(jù)庫保留(除非你自己做了一個保存的數(shù)據(jù)庫)。
服務(wù)器端
聊天的時候,我們有時候會遇到雙方同時發(fā)消息的情況。這種聊天方式就叫全雙工聊天方式:“服務(wù)器”可向“客戶端”發(fā)送消息,“客戶端”也可向“服務(wù)端”發(fā)送消息,而且允許同時發(fā)送消息。
服務(wù)器端怎么實現(xiàn)全雙工的聊天方式呢?其實很簡單,只要用多線程就行了,主線程用于接收客戶端的連接,連接成功后新建兩個線程:一個用于發(fā)送消息,一個用于接收消息:
首先,建立socket服務(wù)器:
import socketimport traceback# 設(shè)定ip和端口號host = ''port = 51423 # 建立socket服務(wù)器s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind((host,port))s.listen() while True: # 等待連接 try: clientsock, clientaddr = s.accept() except KeyboardInterrupt: raise except: traceback.print_exc() continue其中,AF_INET指的是用IPv4進(jìn)行通信,而SOCK_STREAM指的是TCP協(xié)議。端口號你可以隨意設(shè)定,服務(wù)器端的IP地址默認(rèn)為空即可。
在while循環(huán)中不斷等待用戶的連接。如果有用戶連接成功了,我們將進(jìn)入下一步,分別建立發(fā)送和接受線程:
# 建立接收線程t = _thread.start_new_thread(processRecv, (clientsock,)) # 建立發(fā)送線程r = _thread.start_new_thread(processSend, (clientsock,))clientsock就是我們得到的socket連接,processRecv和processSend分別用于處理接受信息和處理發(fā)送信息:
import _thread def processRecv(clientsock): """ 接受消息 :param clientsock: 客戶端的socket連接 """ while True: data = clientsock.recv(4096) if not len(data): break print (data.decode('utf-8')) clientsock.close() def processSend(clientsock): """ 發(fā)送消息 :param clientsock: 客戶端的socket連接 """ while True: data = input("> ") data = data clientsock.sendall(data.encode('utf-8')) clientsock.close()有個小細(xì)節(jié)要注意,socket連接的sendall函數(shù)只支持bytes類型的數(shù)據(jù),所以我們要encode('utf-8')。
服務(wù)端的所有代碼就這樣,沒錯,就是這么簡單。
客戶端
客戶端則更簡單,主線程本身設(shè)定為接受消息,那么我們只需要多一個線程用于發(fā)送消息即可。客戶端的全部代碼如下:
import _threadimport sysfrom socket import * def send_message(tcpCliSock): """ 發(fā)送信息 :param tcpCliSock: 與服務(wù)端的socket連接 """ while True: message = input('> ') if not message: break tcpCliSock.send(message.encode('utf-8')) tcpCliSock.close() if(len(sys.argv) < 3): HOST = 'localhost' PORT = 51423else: HOST = sys.argv[1] PORT = int(sys.argv[2]) BUFSIZ = 1024ADDR = (HOST,PORT) tcpCliSock = socket(AF_INET,SOCK_STREAM)tcpCliSock.connect(ADDR) # 建立發(fā)送消息的線程s = _thread.start_new_thread(send_message, (tcpCliSock,)) while True: rdata = tcpCliSock.recv(BUFSIZ) if not rdata: break print (rdata.decode('utf-8')) tcpCliSock.close()其中,HOST部分填寫對方的IP,PORT部分填寫端口號。sys.argv用于通過參數(shù)輸入這兩個值,比如我們將客戶端文件命名為:client.py, 在cmd中輸入:
python client.py 127.0.0.1 51423
能直接傳入?yún)?shù)執(zhí)行腳本,除此之外,其他部分和服務(wù)端其實差不多。注意把接受到的數(shù)據(jù)decode一下(因為我們發(fā)的時候encode了)。
總結(jié)
以上是生活随笔為你收集整理的python socket清空接受区_用Python制作只属于你和ta的聊天渠道吧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dicom格式怎么转换_QQ音乐下载的歌
- 下一篇: matlab简单程序实例_【简单实例】如