Python 套接字编程中的 Errno 111 连接被拒绝
Errno 111 Connection refused in Python sockets programming
我有两个 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
我遇到的问题是,在添加第一个工作人员并启动另一个工作人员后,我在服务器端收到此错误:
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 我都试过了。
我已经通读了网站上的所有其他建议以及我在 Google 上可以找到的内容。 None 似乎有效。
已尝试通过 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 是 SECOND worker 绑定的端口;
下面的连接是它用来向服务器发送 "I AM HERE" 消息的连接;
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
对于第一个工作人员(此处为 55269),我可以看到有两个连接。应该如此。第一个从worker到server,用"I AM HERE"。第二个从服务器到工作人员,发送确认一切正常并且它现在在其工作人员列表中。
我正在使用多处理框架。那会有问题吗?
已解决。像这样在 server.py 中添加了一个尝试:
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
我有两个 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
我遇到的问题是,在添加第一个工作人员并启动另一个工作人员后,我在服务器端收到此错误:
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 我都试过了。 我已经通读了网站上的所有其他建议以及我在 Google 上可以找到的内容。 None 似乎有效。
已尝试通过 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 是 SECOND worker 绑定的端口; 下面的连接是它用来向服务器发送 "I AM HERE" 消息的连接;
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
对于第一个工作人员(此处为 55269),我可以看到有两个连接。应该如此。第一个从worker到server,用"I AM HERE"。第二个从服务器到工作人员,发送确认一切正常并且它现在在其工作人员列表中。
我正在使用多处理框架。那会有问题吗?
已解决。像这样在 server.py 中添加了一个尝试:
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