0
我有一个启动TCP客户端和服务器的程序,我可以将消息和文件从客户端发送到服务器(它们都在这个方向上传输)。期望服务器始终监听,并响应每个即将到来的消息。但是当我发送几条消息后,我发现服务器再也没有响应,除非我在GUI上重新启动connect
按钮。Python套接字 - 为什么连接在发送几条消息后关闭?
在这里,我们必须在server
,
# 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
,并在client
我有,
# 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
的问题是,我应该把client.socket.connect()
每个send
功能或者我只是把它建立并相信它不会下降?而在服务器中,我应该在收到每封邮件后关闭连接吗?以及为什么我的连接在短时间后神秘地停下来?
另一个问题是我注意到一些代码示例使用conn.send()
将文件从服务器传输到客户端,而我通过socket.send()
将文件从客户端发送到服务器。这会造成问题吗?
现在它似乎工作。谢谢。所以一段时间后它会被垃圾收集,我猜? – knh170 2014-10-18 10:23:03
@ knh170是的,也许,因为它可能被覆盖。 – 2014-10-18 12:51:46
@ knh170:如果您仍然在想什么,请查看您的原始服务器代码,并告诉我们“self.conn”指的是什么。 – 2014-10-18 13:17:05