在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ Python 模塊 socket 如何在收到空數(shù)據(jù)時(shí)停止?

Python 模塊 socket 如何在收到空數(shù)據(jù)時(shí)停止?

問題

Python 的模塊 socket 用 ecv() 不斷監(jiān)聽客戶端發(fā)來的請求數(shù)據(jù),包括空字符串 b'' ,怎么識別出空的請求并阻止?

源碼

服務(wù)器端:

import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(50)
while True:
    data, addr = server.accept()
    info = b'OK'
    while True:
        buffer = data.recv(2)    # 如果客戶端發(fā)送 b'',進(jìn)程將卡在這里,下面無法執(zhí)行
        if buffer == b'':
            info = b'Bad request'
            break
    data.send(info)
    data.close()

客戶端:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))
data = b''
s.send(data)
data_get = s.recv(1024)    # 進(jìn)程會卡在這里,收不到響應(yīng)
s.close()
回答
編輯回答
吃藕丑

socket.recv(),是一個(gè)阻塞型功能函數(shù),在沒有接收到任何數(shù)據(jù)的情況下是會一直等待,你發(fā)送空字符實(shí)際上就是沒有發(fā)送字符。
在實(shí)際應(yīng)用中,通常會把該部分功能單獨(dú)扔到一個(gè)子線程內(nèi)執(zhí)行,這樣在等待接收的時(shí)候你的主線程就還可以干其他事情了。

2018年4月29日 10:27
編輯回答
安淺陌

你客戶端bind的8080端口,服務(wù)端bind的80端口,端口都不一致,先改一致了。

s.send(b'') #發(fā)送數(shù)據(jù)為'',數(shù)據(jù)長度是0,tcp怎么發(fā)送?當(dāng)然不會發(fā)送了,你可以在print(buffer)看一下就知道了
s.send(b'123') #你的buffer是2,所以收到的是b'12'和b'3'
2017年6月6日 01:02
編輯回答
臭榴蓮

假設(shè)`data為客戶端發(fā)來值
if data=='':

斷開連接

`
在tcp四次揮手時(shí),最后會發(fā)送一個(gè)null的值,而python中沒有此類型,所有python會解釋為''字符串,需要明確知道null 不等于空字符串。

2018年1月26日 14:12
編輯回答
夕顏

讀阻塞型 socket 若返回空串,意味著連接已經(jīng)結(jié)束。

你可改用非阻塞 socket,或使用 python3 的 asyncio 。

參考 https://docs.python.org/3/lib...

2018年8月12日 14:42