Python Socket编程 - ConnectionRefusedError:[WinError 10061] 无法建立连接,因为目标机主动拒绝了它。

4 人关注

我正在做一个关于使用客户端和服务器的Python套接字编程的作业。我现在使用的是windows 10。在进入作业的小细节之前,我一直在尝试简单地连接服务器和客户端。

Every time I try to run the client file, I would get this error

File "tcpclient.py", line 9, in <module>
    s.connect((host, port))
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

我已经打开了防火墙的端口,但仍然没有结果。我试着在客户端和服务器文件中用''、0.0.0.0、socket.gethostname()替换host,但错误仍然存在。我甚至尝试了不同的端口号,但都没有什么区别。我试着在Ubuntu和Max上运行这段代码,得到同样的错误--连接拒绝。我一直在研究许多解决方案,但我仍然没有找到一个有效的解决方案。如果有任何帮助,我将不胜感激。

注意:这段代码取自网上,但它基本上是我需要完成的基础。 tcpclient.py

import socket
host = '127.0.0.1'
port = 80
buffer_size = 1024
text = "Hello, World!"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send(text)
data = s.recv(buffer_size)
s.close()
print("received data:", data)

tcpserver.py

import socket
host = '127.0.0.1'
port = 80
buffer_size = 20  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
conn, addr = s.accept()
print 'Connection address:', addr
while 1:
    data = conn.recv(buffer_size)
if not data: break
print("received data:", data)
conn.send(data)  # echo
conn.close()
    
3 个评论
You 在尝试客户端之前先启动服务器,对吗? (还要注意,1024以下的端口号通常需要有权限才能监听)。
我试过先运行服务器,但每次运行时,我的终端都会被卡住,我无法用ctrl+x或ctrl+c来解决。我也试过同时运行客户端和服务器,但我还是会在客户端得到同样的错误,然后因为服务器而卡在终端。
@DavisHerring 我试着用了一个超过1024的端口,结果成功了!(至少在我的ubuntu虚拟盒上)我以为我在windows上有权限,但我想没有。(至少在我的ubuntu虚拟盒上)我以为我的windows上有权限,但我猜不是。谢谢你 :)
python
sockets
client
xerop
xerop
发布于 2019-02-17
4 个回答
Aman Gupta
Aman Gupta
发布于 2022-01-27
0 人赞同

For client.py

import socket
host = '127.0.0.1'
port = 9879
buffer_size = 1024
text = "Hello, World!"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
text = text.encode('utf-8')
s.send(text)
data = s.recv(buffer_size)
s.close()
print("received data:", data)

For server.py

import socket
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
buffer_size = 1024
text = "Hello, World!"
mysocket.bind(('127.0.0.1', 9879))
mysocket.listen(5)
(client, (ip,port)) = mysocket.accept()
print(client, port)
client.send(b"knock knock knock, I'm the server")
data = client.recv(buffer_size)
print(data.decode())
mysocket.close()

只要改变端口号就可以了,如果你是在python3中,那么你将不得不进行编码和解码,因为socket只接收和发送二进制字符串。

Pro Tech
Pro Tech
发布于 2022-01-27
0 人赞同

只是使用不同的端口。客户端和服务器都应该有相同的端口和主机,否则就无法工作。请确保在客户端脚本之前运行服务器。

five element god
five element god
发布于 2022-01-27
0 人赞同

我的服务器已经成功了!

My server python script is below:

    import socket
    host='0.0.0.0'
    port=2345
    s=socket.socket()
    s.bind((host,port))
    s.listen(2)
    while True:
    conn,addr=s.accept()
    print("Connected by",addr)
    data=conn.recv(1024)
    print("received data:",data)
    conn.send(data)
    conn.close()

My Client python script is below:

import socket
s=socket.socket()
host="xx.xx.xx.xx"       #This is your Server IP!
port=2345
s.connect((host,port))
s.send(b"hello")
rece=s.recv(1024)
print("Received",rece)
s.close()

在剧本中,有两点需要注意。

1.The host of the Server must is

'0.0.0.0'

这样,Python脚本就可以使用服务器中的所有界面了

2.我已经通过提示找到了问题的错误。

TypeError: 需要一个类似字节的对象,而不是'str'。

这意味着 "发送 "方法中的每一个字符串信息都需要转换为 "类字节对象",所以正确的做法是

s.send(b"hello")