socket非阻塞通訊

2021-08-21 06:35:32 字數 1878 閱讀 3153

fd

非阻塞需要多執行緒程式設計

服務端方式1: 使用threading庫實現多執行緒

基本方法和單程序基本寫法一致, 將收發部分封裝為函式以便開啟其他執行緒:

import socket

import time

import threading

defhandle_socket

(conn, addr):

while

true:

data = conn.recv(1024)

print(data.decode('utf-8'))

time.sleep(3)

send_data = 'got it'

conn.send(send_data.encode('utf-8'))

conn.close()

基本設定和呼叫部分: 繫結, 監聽, 接受連線:

if __name__ == '__main__':

s = socket.socket(socket.af_inet, socket.sock_stream)

s.bind(('0.0.0.0', 8888))

s.listen()

while

true:

conn, addr = s.accept()

client_thread = threading.thread(target=handle_socket, args=[conn, addr])

client_thread.start()

方式2: 通過繼承streamrequesthandler庫實現多執行緒

收發部分寫到handle方法中:

import socketserver

from socketserver import streamrequesthandler

import time

class

myhandler

(streamrequesthandler):

defhandle

(self):

# addr = self.request.getpeername()

# print('get connection from ', addr)

# self.wfile.write('hello, thank for your connection'.encode())

while

true:

datarecv = self.request.recv(1024)

ifnot datarecv:

break

time.sleep(3)

print(datarecv.decode())

self.request.send("got it".encode())

開啟

myserver = socketserver.threadingtcpserver(('127.0.0.1', 8888), myhandler)

myserver.serve_forever()

客戶端

客戶端:

import socket

conn = socket.socket(socket.af_inet, socket.sock_stream)

conn.connect(('127.0.0.1', 8888))

while

true:

conn.send('hello'.encode())

data = conn.recv(1024)

print(data.decode())

Java 非阻塞 socket 通訊

前幾天我們公司c語言組的人需要乙個基於socket的報文接收器來方便他們測試專案,我花了小半天給他們做了個多執行緒的socket服務端,我寫好後在本機上測試後交給了他們,但是他們那邊能連上伺服器端,但是傳送訊息時沒響應,後來我看到他們用的都是tcp ip測試工具 乙個c s結構的socket除錯工具...

NIO實現非阻塞式Socket通訊

filechannel 由上圖可知道,該channel 只有阻塞模式。datagramchannel socketchannel serversocketchannel 三個網路channel 可以通過configureblocking 方法,設定非阻塞模式 nio 只有在 網路中,使用select...

socket阻塞與非阻塞

何為阻塞?在以上過程中若連線還沒到來,那麼接受阻塞,程式執行到這裡不得不掛起,cpu轉而執行其他執行緒。在以上過程中若資料還沒準備好,請閱讀會一樣也會阻塞。阻塞式網路io的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些cpu時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...