Python Socket - 为什么发送几条消息后连接关闭?

0 投票
1 回答
1877 浏览
提问于 2025-04-28 06:18

我有一个程序,它同时启动了一个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:
...

告诉我这样是否有效。

撰写回答