日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python socket清空接受区_用Python制作只属于你和ta的聊天渠道吧

發(fā)布時間:2024/4/13 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python socket清空接受区_用Python制作只属于你和ta的聊天渠道吧 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

本文的文字及圖片來源于網(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。