尝试在树莓派上托管 python 套接字服务器时出现 ConnectionRefusedError

Posted

技术标签:

【中文标题】尝试在树莓派上托管 python 套接字服务器时出现 ConnectionRefusedError【英文标题】:ConnectionRefusedError when trying to host python socket server on raspberry pi 【发布时间】:2020-06-22 20:26:01 【问题描述】:

我正在尝试制作一个基本的 python 网络程序。我要做的就是在服务器和客户端之间来回发送文本字符串。我正在尝试在我的 Raspberry Pi 上托管服务器,并与 Windows 10 上的客户端连接。该程序在我的计算机上本地运行良好,但是当我尝试连接到我的服务器时,它给了我ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it.我的服务器代码如下:

import socket               # Import socket module
import netifaces as ni

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.

s.bind((host, port))

#host_ip = ni.ifaddresses('wlan0')[ni.AF_INET][0]['addr']

host_ip = "bruh?"

print("Server started! \nHostname: " + host + " \nIP: " + host_ip + " \nPort: " + str(port))

s.listen()                  # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print('Got connection from', addr)
   output = "Welcome to the server!".encode()
   c.send(output)

   c.close()

客户端代码:

import socket

s = socket.socket()

host = 192.168.1.21
port = 12345

s.connect((host, int(port)))

noResponse = False
serverResponse = s.recv(1024).decode()
    
print(serverResponse)
    
s.close()

有人知道我的问题是什么吗?谢谢。

【问题讨论】:

【参考方案1】:

您收到 ConnectionRefusedError 可能有几个原因,请尝试以下方法:

    检查是否没有防火墙阻止您的连接。 仔细检查服务器IP,如果错误可能会出现此错误。 尝试使用 Hercules 检查连接。

另外,我将代码更改如下:

服务器:

import socket

HOST = ''  # localhost
PORT =     # IMPORTANT !! Do not use reserved ports 

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    sock.bind((HOST, PORT))
    sock.listen()
    conn, addr = sock.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            print('Data: ',data)
            conn.sendall('RT') 

客户:

import socket

HOST = ''  # server IP address
PORT =     # server port

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    sock.connect((HOST, PORT))
    sock.sendall('Hello, I am the Client')
    data = sock.recv(1024)

print('Received', data)

通过这样做,您使用的是 TCP 连接,您可以使用不同的 TCP 服务器和客户端模拟器测试您的代码。

【讨论】:

1.我可以验证没有防火墙阻止我的连接,因为我既可以从服务器 ping 到客户端,也可以从客户端到服务器。 2.服务器IP正确。 3. 我正在尝试连接到我的 LAN 网络上的服务器。如果我尝试在我的机器上本地运行服务器和客户端,我的程序可以正常工作,但当我将服务器卸载到另一台设备时就不行。你是说我不能在本地网络上将一台设备连接到另一台设备? 尝试更改代码以创建 TCP 套接字(参见示例),然后使用像 Hercules 这样的 TCP/IP 客户端服务器终端测试代码,这样做将帮助您查看问题出在哪里,并且建立连接。 @NinjaPixels

以上是关于尝试在树莓派上托管 python 套接字服务器时出现 ConnectionRefusedError的主要内容,如果未能解决你的问题,请参考以下文章

发送图像时出现 Python 套接字错误。无法解码字节/意外 EOF

HTTP 错误 500.19 - 在 IIS 上托管时出现内部服务器错误 [重复]

SyntaxError:在 Heroku 上托管 Discord 机器人时出现意外的令牌 '??='

在 Heroku 上托管 MusicBot

在树莓派上运行 vcpkg 时出现 VCPKG_FORCE_SYSTEM_BINARIES 错误

在 IIS (10.0.17763.1) 上托管 .net5.0 核心 Web api 时出现问题