Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字-为什么在发送多条消息后连接关闭?_Python_Sockets - Fatal编程技术网

Python套接字-为什么在发送多条消息后连接关闭?

Python套接字-为什么在发送多条消息后连接关闭?,python,sockets,Python,Sockets,我有一个启动TCP客户端和服务器的程序,我可以从客户端向服务器发送消息和文件(它们都是朝这个方向传输的)。服务器应该一直在监听,并响应每一条即将到来的消息。但我发现在我发送了几条消息后,服务器再也没有响应,除非我在GUI上重新启动connect按钮 这里是服务器中的 # establish connection def conn(self): self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.bin

我有一个启动TCP客户端和服务器的程序,我可以从客户端向服务器发送消息和文件(它们都是朝这个方向传输的)。服务器应该一直在监听,并响应每一条即将到来的消息。但我发现在我发送了几条消息后,服务器再也没有响应,除非我在GUI上重新启动
connect
按钮

这里是
服务器中的

# 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
客户端

# 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()
将文件从客户端发送到服务器。这会导致问题吗?

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

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

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

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

告诉我它是否管用。

现在似乎管用了。谢谢那么过一段时间它就会被垃圾收集,我想是吧?@knh170是的,也许吧,因为它可能会被覆盖。@knh170:如果你还想知道发生了什么,请看一下你原来的服务器代码,告诉我们
self.conn
指的是什么。