socket 在 tcp 協議下通訊
客戶端
import socket
# 建立客戶端tcp協議通訊
c = socket.socket(
)# 與指定服務端握手
c.connect(
('127.0.0.1'
,8080))
# 通訊迴圈
while
true
:# 向服務端傳送資訊
msg =
input
('>>>')if
len(msg)==0
:continue
c.send(msg.encode(
'utf-8'))
# 接受服務端資訊
data = c.recv(
1024
)print
(data.decode(
'utf-8'
))
普通服務端
import socket
# 建立服務端tcp通訊
s = socket.socket(
)# 繫結ip+port
s.bind(
('127.0.0.1'
,8080))
s.listen(5)
# 連線迴圈
while
true
:# 接收使用者端管道和位址
conn, addr = s.accept(
)print
(addr)
# 通訊迴圈
while
true
:# 客戶端若異常退出會報錯,try一下
try:
# 接收客戶端傳送的資訊
data = conn.recv(
1024)if
len(data)==0
:break
# 在服務端列印出來
print
(data.decode(
'utf-8'))
# 轉大寫發給服務端
conn.send(data.upper())
except connectionreseterror:
break
# 客戶端退出 服務端則關閉連線通道
conn.close(
)此時服務端每次只能服務乙個使用者,因為建立連線與接受資訊是同乙個人在幹活,要想建立另外乙個連線需要先斷開正在連線的這個使用者
所以實現socket併發的思路是: 讓建立連線與接受資訊分開幹活
併發服務端(執行緒下的實現方法)
import socket
from threading import thread
# 建立tcp協議socket通訊物件
s = socket.socket(
)s.bind(
('127.0.0.1'
,8080))
s.listen(5)
# 建立迴圈通訊的子執行緒
defcommunication
(conn, addr)
:while
true
:try
: data = conn.recv(
1024
)print
(data.decode(
'utf-8'))
msg =
input
('>>>:')if
len(msg)==0
:continue
conn.send(msg.encode(
'utf-8'))
except connectionreseterror as e:
print
(e,addr)
break
conn.close()
# 建立連線迴圈
while
true
: conn, addr = s.accept(
)# print(conn)
print
(addr)
# 建立子執行緒,
t = thread(target=communication, args=
(conn,addr)
) t.start(
)
TCP服務端實現併發
socket 在 tcp 協議下通訊 客戶端import socket 建立客戶端tcp協議通訊 c socket.socket 與指定服務端握手 c.connect 127.0.0.1 8080 通訊迴圈 while true 向服務端傳送資訊 msg input if len msg 0 con...
(六)多程序實現TCP服務端
首先,為什麼要用多程序處理,多程序的好處是可靠性高,而且在處理大量資料的時候,多程序的速度會比多執行緒快,所有多程序還是要掌握的。在一些實際專案中,程序和執行緒要根據實際場景用。但是多程序是不能共享程序空間的,所以有很多變數都不能共享。除了fork 之前的變數是可以共享的。下面的 基本邏輯就是,用父...
python 實現socket服務端併發的四種方式
服務端 多程序和多執行緒的開啟方式相同。缺點 1 由於cpython的gil,導致同一時間無法執行多個執行緒 2 不可能無限開進程式或執行緒 解決辦法 多程序 concurrent.futures.processpoolexecutor 執行緒池 import socket from multipr...