Python Socket - 为什么发送几条消息后连接关闭?
我有一个程序,它同时启动了一个TCP客户端和一个服务器,我可以从客户端向服务器发送消息和文件(所有的传输都是这个方向)。服务器应该一直在监听,并对每条即将到来的消息做出回应。但是我发现,在我发送了几条消息后,服务器就不再回应了,除非我在图形界面上重新点击一下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
问题是,我应该在每个send
函数里都放上client.socket.connect()
吗?还是说我可以保持连接不变,信任它不会掉线?在服务器那边,我是否应该在每次收到消息后关闭连接?为什么我的连接在短时间后就神秘掉线了呢?
还有一个问题是,我注意到一些代码示例是通过conn.send()
从服务器传输文件到客户端,而我则是通过socket.send()
从客户端发送文件到服务器。这样会造成问题吗?
1 个回答
2
我觉得你函数的名字可能有问题,这可能是导致你遇到麻烦的原因。
在你的服务器代码中,把函数名字改一下:
...
def connection(self):
...
...
def run(self):
self.connection()
while True:
...
告诉我这样是否有效。