2014-10-18 29 views
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()将文件从客户端发送到服务器。这会造成问题吗?

回答

2

我认为有可能导致您的问题的函数名称有问题。

变化的函数名在您的服务器代码:

... 
def connection(self): 
... 

... 
def run(self): 
    self.connection() 
    while True: 
... 

告诉我,如果它的工作原理。

+0

现在它似乎工作。谢谢。所以一段时间后它会被垃圾收集,我猜? – knh170 2014-10-18 10:23:03

+0

@ knh170是的,也许,因为它可能被覆盖。 – 2014-10-18 12:51:46

+0

@ knh170:如果您仍然在想什么,请查看您的原始服务器代码,并告诉我们“self.conn”指的是什么。 – 2014-10-18 13:17:05

相关问题