python recv在連線斷開後會變為非阻塞

2021-07-04 03:42:34 字數 1553 閱讀 8672

以前一直以為recv預設是一直阻塞的。後來發現並不是這樣。

recv預設是阻塞的,當然也可以使用s.setblocking()或者s.settimeout()。

python socket:

但是當客戶端斷開連線後recv就會變為非阻塞,並返回空的字串

#coding=utf-8

'''created on 2015-7-27

@author: xhw

@explain: pass

'''import socket,time,threading

host = 'localhost'

port = 8080

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

def server():

s.bind((host,port))

s.listen(10)

while 1:

conn,addr = s.accept()

print "connected with %s %s"%(addr[0],addr[1])

t = threading.thread(target = task, args = (conn,addr,))

t.setdaemon(true)

t.start()

def task(conn,addr):

while 1:

#conn.settimeout(10)#設定超時間

ret = conn.recv(1024)

if ret == '':

break

print "ret:",ret

time.sleep(0.2)

print "connected close with %s %s"%(addr[0],addr[1])

conn.close()

if __name__ == '__main__':

server()

client:

#coding=utf-8

'''created on 2015-7-27

@author: xhw

@explain: pass

'''import socket,time

host = 'localhost'

port = 8080

def client():

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

s.connect((host, port))

i = 0

while 1:

if i > 20:

break

s.send("time:%s"%time.strftime('%y-%m-%d %h:%m:%s'))

time.sleep(0.5)

i+=1

s.close()

if __name__ == "__main__":

client()

Tcp 斷開連線

tcp協議規定,對於已經建立的連線,網路雙方要進行四次握手才能成功斷開連線,如果缺少了其中某個步驟,將會使連線處於假死狀態,連線本身占用的資源不會被釋放。網路伺服器程式要同時管理大量連線,所以很有必要保證無用連線完全斷開,否則大量僵死的連線會浪費許多伺服器資源。在眾多tcp狀態中,最值得注意的狀態有...

TCP IP 斷開連線

tcp ip 斷開連線 四次握手 斷開連線其實從我的角度看不區分客戶端和伺服器端,任何一方都可以呼叫close or closesocket 之類 的函式開始主動終止乙個連線。這裡先暫時說正常情況。當呼叫close函式斷開乙個連線時,主動斷開的 一方傳送fin finish報文給對方。有了之前的經驗...

php斷開mysql mysql連線與斷開伺服器

為了連線伺服器,當呼叫mysql時,通常需要提供乙個mysql使用者名稱並且很可能需要乙個 密碼。如果伺服器執行在登入伺服器之外的其它機器上,還需要指定主機名。聯絡管理員以找出進行連線所使用的引數 即,連線的主機 使用者名稱和使用的密碼 知道正確的引數後,可以按照以下方式進行連線 shell mys...