用Python製作只屬於你和ta的聊天渠道吧

2021-10-12 03:50:08 字數 3328 閱讀 1719

原理簡介

也就是說,在我們的例子中,聊天的雙方,由一方要承擔「伺服器 」 的責任,維持乙個socket伺服器,等待連線進入;另一方則是「客戶端」,在伺服器端維持等待狀態時即可傳送請求,建立連線。

伺服器端

聊天的時候,我們有時候會遇到雙方同時發訊息的情況。這種聊天方式就叫全雙工聊天方式:「伺服器」可向「客戶端」傳送訊息,「客戶端」也可向「服務端」傳送訊息,而且允許同時傳送訊息。

伺服器端怎麼實現全雙工的聊天方式呢?其實很簡單,只要用多執行緒就行了,主線程用於接收客戶端的連線,連線成功後新建兩個執行緒:乙個用於傳送訊息,乙個用於接收訊息:

首先,建立socket伺服器:

import socket

import traceback

# 設定ip和埠號

host =

''port =

51423

# 建立socket伺服器

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進行通訊,而sock_stream指的是tcp協議。埠號你可以隨意設定,伺服器端的ip位址預設為空即可。

# 建立接收執行緒

t = _thread.start_new_thread(processrecv,

(clientsock,))

# 建立傳送執行緒

r = _thread.start_new_thread(processsend,

(clientsock,

))

clientsock就是我們得到的socket連線,processrecv和processsend分別用於處理接受資訊和處理傳送資訊:

'''

'''import _thread

defprocessrecv

(clientsock)

:"""

接受訊息

:param clientsock: 客戶端的socket連線

"""while

true

: data = clientsock.recv(

4096)if

notlen

(data)

:break

print

(data.decode(

'utf-8'))

clientsock.close(

)def

processsend

(clientsock)

:"""

傳送訊息

:param clientsock: 客戶端的socket連線

"""while

true

: data =

input

("> "

) data = data

clientsock.sendall(data.encode(

'utf-8'))

clientsock.close(

)

有個小細節要注意,socket連線的sendall函式只支援bytes型別的資料,所以我們要encode('utf-8')

服務端的所有**就這樣,沒錯,就是這麼簡單。

客戶端

客戶端則更簡單,主線程本身設定為接受訊息,那麼我們只需要多乙個執行緒用於傳送訊息即可。客戶端的全部**如下:

'''

'''import _thread

import sys

from socket import

*def

send_message

(tcpclisock)

:"""

傳送資訊

:param tcpclisock: 與服務端的socket連線

"""while

true

: message =

input

('> ')if

not message:

break

tcpclisock.send(message.encode(

'utf-8'))

tcpclisock.close()if

(len

(sys.ar**)

<3)

: host =

'localhost'

port =

51423

else

: host = sys.ar**[1]

port =

int(sys.ar**[2]

)bufsiz =

1024

addr =

(host,port)

tcpclisock = socket(af_inet,sock_stream)

tcpclisock.connect(addr)

# 建立傳送訊息的執行緒

s = _thread.start_new_thread(send_message,

(tcpclisock,))

while

true

: rdata = tcpclisock.recv(bufsiz)

ifnot rdata:

break

print

(rdata.decode(

'utf-8'))

tcpclisock.close(

)

其中,host部分填寫對方的ip,port部分填寫埠號。sys.ar**用於通過引數輸入這兩個值,比如我們將客戶端檔案命名為:client.py, 在cmd中輸入:

python client.py 127.0

.0.1

51423

能直接傳入引數執行指令碼,除此之外,其他部分和服務端其實差不多。注意把接受到的資料decode一下(因為我們發的時候encode了)。

製作屬於你的終端詞典

今天在閱讀文獻的時候,覺得可以把文獻中的一些詞彙記下來,做成乙個詞典。這個詞典當然是電子版的,畢竟你手寫乙個詞典很麻煩,而且你做好以後翻起來也很麻煩,所以我是不可能手寫的。建立乙個txt檔案。大致如下 paradigm 正規化,模範,範例 renaissance 復興 neurorehabilita...

華為怎樣讓你的隱私只屬於你?

移動網際網路的成熟,萬物互聯時代的快速到來,讓幾乎所有業務都可以智慧型線上辦理。人們在享受這些便利的同時,支付密碼 身份證資訊 等個人資訊,甚至使用習慣 輸入片語 搜尋記錄等資料,也成為被網際網路應用覬覦的 金礦 作為無數使用者的消費終端提供者,怎樣保護好使用者的隱私安全,成為華為最關注的事情。從最...

Python模組 製作屬於自己的有聲小說

python版本 anaconda3 python3.7.4 作業系統 ubuntu19.10 編譯器 pycharm社群版 用到的模組 pyttsx3,requests pyttsx3官網位址 pyttsx3 text to speech 是乙個語音轉換模組,它可以在離線的環境下工作,支援多個引擎...