【发布时间】:2014-10-18 18:16:44
【问题描述】:
我有一个启动 TCP 客户端和服务器的程序,我可以将消息和文件从客户端发送到服务器(它们都在这个方向传输)。服务器应该一直在监听,并响应每一个即将到来的消息。但是我发现在我发送了几条消息之后,服务器再也没有响应,除非我在 GUI 上重新启动 connect 按钮。
这里有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() 将文件从客户端发送到服务器。这会导致问题吗?
【问题讨论】: