socket非阻塞模組

2021-09-03 02:58:07 字數 2311 閱讀 9062

一 服務端程式

# 匯入模組

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...