我是Sockets的新手,请原谅我完全缺乏理解。
我有一个服务器脚本(server.py):
#!/usr/bin/python
import socket #import the socket module
s = socket.socket() #Create a socket object
host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) #Bind to the port
s.listen(5) #Wait for the client connection
while True:
c,addr = s.accept() #Establish a connection with the client
print "Got connection from", addr
c.send("Thank you for connecting!")
c.close()
和客户端脚本(client.py):
#!/usr/bin/python
import socket #import socket module
s = socket.socket() #create a socket object
host = '192.168.1.94' #Host i.p
port = 12397 #Reserve a port for your service
s.connect((host,port))
print s.recv(1024)
s.close
我转到桌面终端并输入以下命令启动脚本:
python server.py
之后,我转到笔记本电脑终端并启动客户端脚本:
python client.py
但是我收到以下错误:
文件“client.py”,第9行,
s.connect((host,port))
文件“/usr/lib/python2.7/socket.py”,第224行,在meth
返回getattr(self._sock,name)(* args)
socket.error:[Errno 111]拒绝连接
我尝试使用不同的端口号无济于事。但是,我能够在客户端脚本中使用相同的ip和gethostname()方法获取主机名,我可以ping桌面(服务器)。
答案 0 :(得分:66)
而不是
host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) #Bind to the port
你应该试试
port = 12397 # Reserve a port for your service
s.bind(('', port)) #Bind to the port
这样监听套接字不会受到太多限制。也许否则只在一个接口上进行监听,而接口又与本地网络无关。
一个例子可能是它只监听127.0.0.1
,这使得从不同的主机连接变得不可能。
答案 1 :(得分:8)
此错误表示无论出于何种原因客户端无法连接到运行服务器脚本的计算机上的端口。这可能是由少数事情引起的,例如缺少到目的地的路由,但由于您可以ping服务器,情况应该不是这样。另一个原因可能是您的客户端和服务器之间有防火墙 - 它可能位于服务器本身或客户端上。鉴于您的网络寻址,我假设服务器和客户端都在同一个局域网上,因此不应该涉及任何阻止流量的路由器。在这种情况下,我会尝试以下方法:
netstat -ntulp
telnet LISTENING_IP LISTENING_PORT
应该完成工作然后让我们知道调查结果。
答案 2 :(得分:1)
host = socket.gethostname() # Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) # Bind to the port
我认为此错误可能与DNS解析有关。
这句话host = socket.gethostname()
获取主机名,但如果操作系统无法将主机名解析为本地地址,则会收到错误。
Linux操作系统可以修改/etc/hosts
文件,在其中添加一行。它看起来像下面('hostname'是socket.gethostname()
得到的)。
127.0.0.1 hostname
答案 3 :(得分:1)
假设s = socket.socket() 服务器可以通过以下方法绑定: 方法1:
host = socket.gethostname()
s.bind((host, port))
方法2:
host = socket.gethostbyname("localhost") #Note the extra letters "by"
s.bind((host, port))
方法3:
host = socket.gethostbyname("192.168.1.48")
s.bind((host, port))
如果您在客户端没有使用相同的方法,则会收到错误:socket.error errno 111 connection refused.
因此,您必须在客户端使用与获取主机完全相同的方法,就像在服务器上一样。例如,对于客户端,您将相应地使用以下方法:
方法1:
host = socket.gethostname()
s.connect((host, port))
方法2:
host = socket.gethostbyname("localhost") # Get local machine name
s.connect((host, port))
方法3:
host = socket.gethostbyname("192.168.1.48") # Get local machine name
s.connect((host, port))
希望能解决问题。
答案 4 :(得分:1)
在终端尝试此命令:
sudo ufw enable
ufw allow 12397
答案 5 :(得分:0)
make:host ='192.168.1.94'
而不是host = socket.gethostname()
答案 6 :(得分:0)
我能够ping通我的连接,但仍然收到“连接被拒绝”错误。原来我在自我检查!那就是问题所在。
答案 7 :(得分:0)
注意更改端口号。有时,您只需要更改端口号。当我对语法和功能进行更改时,我就体验到了这一点。
答案 8 :(得分:0)
我在我的代码中遇到了同样的问题,经过几天的搜索,我终于找到了解决方案,问题是函数 socket.gethostbyname(socket.gethostname) 在 linux 中不起作用,所以你必须使用 socket.gethostbyname('put the hostname manual') 而不是 socket.gethostbyname('localhost'),使用 socket.gethostbyname('host') 查看 ifconfig。