【问题标题】:Python Socket - Why connection closed after sending several messages?Python Socket - 为什么在发送多条消息后连接关闭?
【发布时间】: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() 将文件从客户端发送到服务器。这会导致问题吗?

【问题讨论】:

    标签: python sockets


    【解决方案1】:

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

    在您的服务器代码中更改函数名称:

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

    告诉我它是否有效。

    【讨论】:

    • 现在它似乎工作了。谢谢。所以一段时间后它会被垃圾收集,我猜?
    • @knh170 是的,也许吧,因为它可能会被覆盖。
    • @knh170 :如果您仍然想知道发生了什么,请查看您的原始服务器代码并告诉我们self.conn 指的是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2017-06-13
    • 2016-01-30
    • 1970-01-01
    相关资源
    最近更新 更多