Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 socket.error:[Errno 111]尝试连接到套接字时_Python_Sockets_Ports - Fatal编程技术网

Python socket.error:[Errno 111]尝试连接到套接字时

Python socket.error:[Errno 111]尝试连接到套接字时,python,sockets,ports,Python,Sockets,Ports,我试图编写一个代码,其中客户端以默认端口号连接到服务器,然后服务器向客户端发送另一个端口号。客户端现在连接到新端口号 客户: import socket import sys import os import signal import time s = socket.socket() s.connect(("127.0.0.1", 6667)) line = s.recv(1024) if line.strip(): port = int(line) s.close()

我试图编写一个代码,其中客户端以默认端口号连接到服务器,然后服务器向客户端发送另一个端口号。客户端现在连接到新端口号

客户:

import socket
import sys
import os
import signal
import time
s = socket.socket()
s.connect(("127.0.0.1", 6667))
line = s.recv(1024)
if line.strip():
    port = int(line)
    s.close()
    soc = socket.socket()
    soc.connect(("127.0.0.1", port))
    print soc.recv(1024)
    soc.close()
else:
    s.close()
Traceback (most recent call last):
  File "client.py", line 13, in <module>
    soc.connect(("127.0.0.1", port))
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
服务器:

import socket
import sys
import os
import signal
import time
port = 7777
s = socket.socket()
s.bind(("127.0.0.1", 6667))
s.listen(0)
sc, address = s.accept()
print address
sc.send(str(port))
sc.close()
s.close()
sock = socket.socket()
sock.bind(("127.0.0.1", port))
soc, addr = sock.accept()
print addr
soc.send("Success")
soc.close()
sock.close()
('127.0.0.1', 36282)
Traceback (most recent call last):
  File "server.py", line 17, in <module>
    soc, addr = sock.accept()
  File "/usr/lib/python2.7/socket.py", line 202, in accept
    sock, addr = self._sock.accept()
socket.error: [Errno 22] Invalid argument
当我执行这段代码时,我在客户端和服务器端收到以下错误

服务器:

import socket
import sys
import os
import signal
import time
port = 7777
s = socket.socket()
s.bind(("127.0.0.1", 6667))
s.listen(0)
sc, address = s.accept()
print address
sc.send(str(port))
sc.close()
s.close()
sock = socket.socket()
sock.bind(("127.0.0.1", port))
soc, addr = sock.accept()
print addr
soc.send("Success")
soc.close()
sock.close()
('127.0.0.1', 36282)
Traceback (most recent call last):
  File "server.py", line 17, in <module>
    soc, addr = sock.accept()
  File "/usr/lib/python2.7/socket.py", line 202, in accept
    sock, addr = self._sock.accept()
socket.error: [Errno 22] Invalid argument
('127.0.0.1',36282)
回溯(最近一次呼叫最后一次):
文件“server.py”,第17行,在
soc,addr=sock.accept()
文件“/usr/lib/python2.7/socket.py”,第202行,在accept中
sock,addr=self.\u sock.accept()
socket.error:[Errno 22]参数无效
客户:

import socket
import sys
import os
import signal
import time
s = socket.socket()
s.connect(("127.0.0.1", 6667))
line = s.recv(1024)
if line.strip():
    port = int(line)
    s.close()
    soc = socket.socket()
    soc.connect(("127.0.0.1", port))
    print soc.recv(1024)
    soc.close()
else:
    s.close()
Traceback (most recent call last):
  File "client.py", line 13, in <module>
    soc.connect(("127.0.0.1", port))
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
回溯(最近一次呼叫最后一次):
文件“client.py”,第13行,在
soc.连接((“127.0.0.1”,端口))
文件“/usr/lib/python2.7/socket.py”,第224行,meth格式
返回getattr(self.\u sock,name)(*args)
socket.error:[Errno 111]连接被拒绝

有人能给我解释一下这些错误的原因并为这些错误提供解决方案吗。

在您可以
侦听TCP/IP套接字(基于连接的流式套接字)之前,您需要使用
bind
分配一个套接字(使用
socket.socket()
创建)。然后您需要执行
侦听
,为传入连接做好准备,最后在准备好的套接字上执行
接受


调用
sock.bind((“127.0.0.1”,端口))
后,您似乎缺少
sock.listen(0)
。该文件缺少详细信息,但它确实说明了TCP/IP:

请注意,服务器必须执行序列套接字()绑定()侦听()接受()(可能重复接受()以服务多个客户机),而客户机只需要序列套接字()、连接()。还请注意,服务器不会在其侦听的套接字上发送all()/recv(),而是在accept()返回的新套接字上发送

Python的套接字模块基于Berkeley套接字模型。您可以在这里找到有关Berkeley Sockets的更多详细信息。特别是关于
bind

bind()为地址分配套接字。使用socket()创建套接字时,只会为其指定一个协议族,而不会为其分配地址。在套接字可以接受到其他主机的连接之前,必须通过bind()系统调用执行与地址的关联


还考虑如果客户端在服务器开始侦听连接之前发送端口号(并尝试连接)会发生什么(在这种情况下在端口7777上)。虽然不是您问题的原因,但我想指出完整性的场景。在端口7777插座上调用“<代码>侦听<代码> >之后,您可以考虑不要关闭端口6667的套接字。在调用

listen
后,您可以关闭第一个插座。在客户端上读取端口后,您可以等待服务器关闭第一个连接(端口6667),然后连接到端口7777。

您似乎缺少
sock。在调用
sock.bind((“127.0.0.1”,port))
后,请收听(0)
。还考虑如果客户端在服务器开始侦听连接之前发送端口号(并尝试连接)会发生什么。请为我工作。还要注意变量名<代码>s
sc
sock
。。。特别是如果你想把它贴在这里。@MichaelPetch:为什么不把它当作一个回答呢?@Michael Petch:谢谢,它奏效了。我对socket编程还不熟悉,这对我很有帮助。