【问题标题】:Python Socket Programming - ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused itPython Socket 编程 - ConnectionRefusedError: [WinError 10061] 由于目标机器主动拒绝,无法建立连接
【发布时间】:2019-07-10 15:34:23
【问题描述】:

我正在使用客户端和服务器在 python 中进行有关套接字编程的作业。我目前使用的是 Windows 10。在进入任务的小细节之前,我一直在尝试简单地连接服务器和客户端。

每次我尝试运行客户端文件时,都会收到此错误

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() 替换主机,但错误仍然存​​在。我什至尝试过不同的端口号,但没有任何区别。我试过在 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()

【问题讨论】:

  • 您在尝试客户端之前正在启动服务器,对吧? (另请注意,低于 1024 的端口号通常需要特权才能侦听。)
  • 我尝试过先运行服务器,但每次运行时我的终端都会卡住,我无法按 ctrl+x 或 ctrl+c 退出。我也尝试过同时运行客户端和服务器,但客户端仍然会出现相同的错误,然后由于服务器而卡在终端中。
  • @DavisHerring 我已经尝试使用超过 1024 的端口并且它有效! (至少在我的 ubuntu 虚拟机上)我以为我在 Windows 上有特权,但我想没有。谢谢你:)

标签: python sockets client


【解决方案1】:

对于客户端.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)

对于 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 中,那么您必须在套接字接收和发送二进制字符串时进行编码和解码。

【讨论】:

    【解决方案2】:

    我的服务器成功了!

    我的服务器 python 脚本如下:

        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()
    

    我的客户端 python 脚本如下:

    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.Server的主机必须是

    '0.0.0.0'

    以便python脚本可以使用服务器中的所有接口

    2.我通过提示找到了问题的错误:

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

    表示'send'方法中的每一个字符串消息都需要转换为'bytes-like object',所以正确的是

    s.send(b"你好")

    重要的是这是b'hello' 而不是'hello'

    【讨论】:

      【解决方案3】:

      我正在学习使用线程启动服务器的教程。一旦我删除了线程,我就可以连接到它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-07
        • 2021-01-04
        • 2018-12-01
        • 2021-12-22
        • 2022-12-10
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多