一 服務端程式
# 匯入模組
import socketserver
import random
# 定義乙個類
class myserver(socketserver.baserequesthandler):
# 如果handle方法出現報錯,則會進行跳過
# setup方法和finish方法無論如何都會進行執行
# 首先執行setup
def setup(self):
pass
# 然後執行handle
def handle(self):
# 定義連線變數
conn =self.request
# 傳送訊息定義
msg = "hello world!"
# 訊息傳送
conn.send(msg.encode())
# 進入迴圈,不斷接收客戶端訊息
while true:
#接收客戶端訊息
data = conn.recv(1024)
# 列印訊息
print(data.decode())
# 接收到exit,則進行迴圈的退出
if data==b'exit':
break
conn.send(data)
conn.send(str(random.randint(1,1000)).encode())
conn.close()
# 最後執行finish
def finish(self):
pass
if __name__=="__main__":
# 建立多執行緒例項
server = socketserver.threadingtcpserver(('127.0.0.1',8888),myserver)
# 開啟啟動多執行緒,等待連線
server.serve_forever()
二 客戶端程式
# 匯入模組
import socket
# 建立例項
client =socket.socket()
#訪問的服務端的ip和埠
ip_port=("127.0.0.1",8888)
# 連線主機
client.connect(ip_port)
#定義乙個迴圈,不斷傳送訊息
while true:
# 接收主機資訊
data = client.recv(1024)
# 列印接收的資料
# 此處byte型資料特指python3.x以上
print(data.decode())
# 輸入傳送的訊息
msg_input=input("請輸入傳送的訊息")
# 訊息傳送
client.send(msg_input.encode())
if msg_input=="exit":
break
data = client.recv(1024)
print(data.decode())
三 執行結果
1 服務端
e:\python\python_lab\venv\scripts\python.exe e:/python/python_lab/socket_tcp_server2.py
dnstcp
how are you
2 客戶端1
e:\python\python_lab\venv\scripts\python.exe e:/python/python_lab/socket_clent.py
hello world!
請輸入傳送的訊息dns
dns857
請輸入傳送的訊息
3 客戶端2
e:\python\python_lab\venv\scripts\python.exe e:/python/python_lab/socket_clent.py
hello world!
請輸入傳送的訊息tcp
tcp879
請輸入傳送的訊息
4 客戶端3
e:\python\python_lab\venv\scripts\python.exe e:/python/python_lab/socket_clent.py
hello world!
請輸入傳送的訊息how are you
how are you
679請輸入傳送的訊息
socket阻塞與非阻塞
何為阻塞?在以上過程中若連線還沒到來,那麼接受阻塞,程式執行到這裡不得不掛起,cpu轉而執行其他執行緒。在以上過程中若資料還沒準備好,請閱讀會一樣也會阻塞。阻塞式網路io的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些cpu時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...
轉阻塞socket和非阻塞socket
讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...
非阻塞socket程式設計
socket程式設計中可能出現阻塞的呼叫有4個 1.write send sendto sendmsg sendv等,如果某個程序呼叫乙個阻塞的tcp套接字 預設設定 如果傳送緩衝區沒有空間,呼叫程序將會睡眠,直到有空間為止。如果tcp套接字是非阻塞的,且沒有空間可寫,則會返回乙個ewouleblo...