原理簡介
也就是說,在我們的例子中,聊天的雙方,由一方要承擔「伺服器 」 的責任,維持乙個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 是乙個語音轉換模組,它可以在離線的環境下工作,支援多個引擎...