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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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套接字编程中的错误111连接被拒绝_Python_Multithreading_Sockets - Fatal编程技术网

Python套接字编程中的错误111连接被拒绝

Python套接字编程中的错误111连接被拒绝,python,multithreading,sockets,Python,Multithreading,Sockets,我有两个python脚本:一个server.py和一个worker.py 这应该是这样工作的: - server.py listens on 5005 - workers are started and bind to random ports - they send a message to the server with their port nr - server adds the port to its list of known workers - it does this for e

我有两个python脚本:一个server.py和一个worker.py 这应该是这样工作的:

- server.py listens on 5005
- workers are started and bind to random ports
- they send a message to the server with their port nr
- server adds the port to its list of known workers
- it does this for each worker
def handle_join(worker_ip_port):
    worker_ip_port = tuple(worker_ip_port)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        print "Trying to connect to {}".format(worker_ip_port)
        for i in range(3):
                try:
                        s.connect(("",int(worker_ip_port[1])))
                        if worker_ip_port not in WORKERS:
                                WORKERS.append(worker_ip_port)
                                print '\t\tNew worker added on {}'.format(worker_ip_port)
                                print '\t\tWORKERS: {}'.format(WORKERS)
                                s.send('0'+SIGEND)
                                s.close()
                                return 0
                except Exception as e:
                        pass
    print '\t\tThat port is already in the worker list'
        s.send('1'+SIGEND)
        s.close()
    return 1
我遇到的问题是,在添加第一个worker并启动另一个worker之后,服务器端出现以下错误:

Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "server.py", line 42, in listener
    if handle_join(data.split(',')[1:]) == 1:
  File "server.py", line 122, in handle_join
    s.connect(("",int(worker_ip_port[1])))
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 111] Connection refused
该应用程序已经有了很大的发展,因此我将在这里只包括相关部分: server.py:

def handle_join(worker_ip_port):
# e.g. worker_ip_port = 127.0.0.1,55256
# 
#
    worker_ip_port = tuple(worker_ip_port)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        print "Trying to connect to {}".format(worker_ip_port)
        s.connect(("",int(worker_ip_port[1])))
    if worker_ip_port not in WORKERS:
        WORKERS.append(worker_ip_port)
        print '\t\tNew worker added on {}'.format(worker_ip_port)
        print '\t\tWORKERS: {}'.format(WORKERS)
                s.send('0'+SIGEND)
                s.close()
                return 0
    print '\t\tThat port is already in the worker list'
    s.send('1'+SIGEND)
    s.close()
    return 1
worker.py

def read_socket():
# binds socket, keeps listening
# once connection is accepted, loops over the socket buffer until the
# signal for transmission end
# then returns the data
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
   s.bind(("",WORKER_PORT))
   print "listening on {}".format(WORKER_PORT)
   while True:
           buffer = ''
           data = True
           s.listen(0)
           conn, addr = s.accept()
           print "accepted connection"
           while data:
                    data = conn.recv(BUFFER_SIZE)
                    # if the SIGNAL for end of packet is found in current packet
                    # add only up to that part
                    # close socket
                    # return data
                    if data.find(SIGEND) != -1:
                            buffer += data[:data.rfind(SIGEND)]
                            conn.close()
                            s.close()
                            return buffer
                    else:
                            buffer += data
注意:我试过Linux和Windows。 我已经阅读了网站上的所有其他建议,以及我在谷歌上能找到的内容。这些措施似乎都不起作用

已尝试通过telnet连接到第二个工作进程建立的连接:

Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
据我所知,第二个工人没有从服务器获得任何连接

netstat的输出也很有趣:

tcp        0      0 0.0.0.0:55271           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:5005          127.0.0.1:55271         TIME_WAIT
55271是第二个工作者绑定到的端口; 下面的连接是它用来向服务器发送“我在这里”消息的连接

tcp        0      0 0.0.0.0:55269           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:59240         127.0.0.1:55269         TIME_WAIT
tcp        0      0 127.0.0.1:5005          127.0.0.1:55269         TIME_WAIT
在第一个worker(这里是55269)的例子中,我可以看到有两个连接。应该如此。第一个从工作者到服务器,带有“我在这里”。第二个从服务器发送到工作人员,发送确认信息,确认一切正常,并且现在已在其工作人员列表中


我正在使用多处理框架。那会是个问题吗

已解决。在server.py中添加了一个try,如下所示:

- server.py listens on 5005
- workers are started and bind to random ports
- they send a message to the server with their port nr
- server adds the port to its list of known workers
- it does this for each worker
def handle_join(worker_ip_port):
    worker_ip_port = tuple(worker_ip_port)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        print "Trying to connect to {}".format(worker_ip_port)
        for i in range(3):
                try:
                        s.connect(("",int(worker_ip_port[1])))
                        if worker_ip_port not in WORKERS:
                                WORKERS.append(worker_ip_port)
                                print '\t\tNew worker added on {}'.format(worker_ip_port)
                                print '\t\tWORKERS: {}'.format(WORKERS)
                                s.send('0'+SIGEND)
                                s.close()
                                return 0
                except Exception as e:
                        pass
    print '\t\tThat port is already in the worker list'
        s.send('1'+SIGEND)
        s.close()
    return 1

每个
s.accept()
之前的
s.listen(0)
在我看来是错误的
listen
应该只在套接字上调用一次,而不是在每次
accept
之前调用。不是这样。检查下面我的答案。