为什么客户端套接字连接在从服务器接收到所有数据后没有关闭?
问题描述:
我正在学习Python中的socket编程,为什么客户端套接字连接在从服务器接收到所有数据后没有关闭?
服务器代码:
import socket
srvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srvsock.bind(('', 23000))
srvsock.listen(5)
while True:
clisock, (rem_host, rem_port) = srvsock.accept()
print "conection established with host %s and port %s" % (rem_host, rem_port)
while True:
strg = clisock.recv(20)
if not strg:
print 'conection closed'
clisock.close()
break
clisock.send(strg)
客户端代码:
import socket
clisock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clisock.connect(('', 23000))
clisock.send("Hello World rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr dsadsadsa tttttt\n")
while True:
data = clisock.recv(20)
print type(data)
if not data:
clisock.close()
break
print data
我是从客户端发送数据流服务器同时从服务器接收数据,数据传输成功后,服务器不关闭客户端连接。我错过任何事情吗?
答
该问题是由于服务器不断读取客户端的数据直到它读取不到数据而引起的。只有当连接的客户端关闭连接时才会发生这种情况。在此之前,服务器套接字将阻塞(即临时怀疑操作),直到客户端发送更多数据。
底线:客户端或服务器必须指示它不再打算通过连接发送数据。
您可以通过在客户端for
循环之前加入一行
clisock.shutdown(socket.SHUT_WR)
固定客户。这表示不会再发送数据。
答
服务器代码:
while True:
clisock, (rem_host, rem_port) = srvsock.accept()
print "conection established with host %s and port %s" % (rem_host, rem_port)
while True:
strg = clisock.recv(20)
print '[message from client:] %s'%strg
clisock.send(strg)
print 'about to close with client'
clisock.close()
print 'connection closed with client'
break
客户端代码:
clisock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clisock.connect(('', 23000))
clisock.send("Hello World rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr dsadsadsa tttttt\n")
while True:
data = clisock.recv(20)
print '[Message from server :]%s'%data
print 'about to close server connection'
clisock.close()
print 'server connection closed'
break
这会在你的情况下工作了,holdenweb有适当的理由预期在上面的代码中的客户端代码的行为不正确的答案仅发送一条消息并关闭连接以及服务器仅侦听每个客户端的一条消息并关闭与该客户端的连接单个客户端 - 单个连接----单条消息
此外还有一个快速注释:协议设计最重要的部分之一是确保协议单元(数据包,数据帧,任何)可以相互分离。您试图实施一个协议,在该协议中不可能发送“消息结束”检测,也不会发送“传输结束”。 – holdenweb