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時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...