Python套接字-为什么在发送多条消息后连接关闭?
我有一个启动TCP客户端和服务器的程序,我可以从客户端向服务器发送消息和文件(它们都是朝这个方向传输的)。服务器应该一直在监听,并响应每一条即将到来的消息。但我发现在我发送了几条消息后,服务器再也没有响应,除非我在GUI上重新启动Python套接字-为什么在发送多条消息后连接关闭?,python,sockets,Python,Sockets,我有一个启动TCP客户端和服务器的程序,我可以从客户端向服务器发送消息和文件(它们都是朝这个方向传输的)。服务器应该一直在监听,并响应每一条即将到来的消息。但我发现在我发送了几条消息后,服务器再也没有响应,除非我在GUI上重新启动connect按钮 这里是服务器中的 # establish connection def conn(self): self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.bin
connect
按钮
这里是服务器中的
# establish connection
def conn(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.bind((self.ip, self.port))
self.s.listen(1)
print 'server ready.'
self.conn, self.addr = self.s.accept()
print 'Connected by', str(self.addr), '\n'
def recv(self):
flag = self.conn.recv(BUFFER_SIZE)
data = self.conn.recv(BUFFER_SIZE)
# this is a message
if flag=='1':
msg = "other >> %s" % data
self.conn.send("success")
print msg
return
# there will be a file
elif flag=='0':
filename = data
with open('new_'+filename, 'wb+') as f:
while True:
data = self.s.recv(BUFFER_SIZE)
if not data: break # transfer finished
f.write(data)
size = os.path.getsize(filename)
self.conn.send(str(size)) # echo size
self.conn.send("success")
return
# do not close connection unless exception raised
def run(self):
self.conn()
while True:
try:
# shoud I connect again each time here?
self.recv()
except:
self.close()
break
在客户端
中
# expected to establish a connection
def conn(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'client ready.'
try:
self.s.connect((self.ip, self.port))
print 'connection established.'
except:
# close socket
self.s.close()
raise
def send(self, msg='', flag=1):
if flag:
self.s.send(str(flag))
self.s.send(msg)
sent = self.s.recv(BUFFER_SIZE)
print sent
else:
self.s.send(str(flag))
self.s.send(msg) # send filename
# send file in buffer-size
with open(msg, 'rb') as f:
while 1:
data = f.read(BUFFER_SIZE)
if not data: break
self.s.send(data) # send block
sent = self.s.recv(BUFFER_SIZE)
print 'sent: %s bytes' % sent
问题是,我应该在每个send
函数中放入client.socket.connect()
,还是让它保持建立状态并相信它不会关闭?在服务器中,我是否应该在收到每条消息后关闭连接?为什么我的联系在短时间后神秘地中断了
另一个问题是,我注意到一些代码示例使用
conn.send()
将文件从服务器传输到客户端,相反,我使用socket.send()
将文件从客户端发送到服务器。这会导致问题吗?我认为函数名有问题,可能会导致您的问题
更改服务器代码中的函数名:
...
def connection(self):
...
...
def run(self):
self.connection()
while True:
...
告诉我它是否管用。现在似乎管用了。谢谢那么过一段时间它就会被垃圾收集,我想是吧?@knh170是的,也许吧,因为它可能会被覆盖。@knh170:如果你还想知道发生了什么,请看一下你原来的服务器代码,告诉我们
self.conn
指的是什么。