跨网络的Python套接字通信不工作

2024-04-25 03:46:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用套接字模块在我和朋友的计算机之间建立通信。我在我的电脑上运行服务器代码,他在他的电脑上运行客户端代码。代码如下:

服务器:

import socket

host = "XXX.XXX.XX.XXX" # IP of my computer
port = 2000

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))

addrs = []

print("Server started")
while True:
    data, addr = s.recvfrom(1024)
    if not addr in addrs:
        addrs.append(addr)
    data = data.decode("utf-8")
    print("Recieved: " + str(data))
    print("Sending: " + data)
    for add in addrs:
        s.sendto(data.encode("utf-8"), add)

客户:

import socket
import time

host = "XXX.XXX.XXX.XXX" # External IP of my router
port = 2001

server = (host, port)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(False)

while True:
    message = "Test message"
    time.sleep(1)
    print("Sending: " + message)
    s.sendto(message.encode("utf-8"), server)
    try:
        data, addr = s.recvfrom(1024)
    except BlockingIOError:
        pass
    else:
        data = data.decode("utf-8")
        print("Recieved: " + str(data))

注意:客户机代码和服务器代码中的端口是不同的,以确保我的端口转发确实在做一些事情。你知道吗

我在路由器上设置了端口转发。当我在我的计算机上运行这两个脚本(或者甚至另一台与我的WiFi连接的计算机)并且我知道端口转发正在进行时,一切都正常。但是,当我的朋友(连接到另一个WiFi)运行客户端代码时,它不起作用。没有抛出错误,但他发送的数据,我的电脑和路由器的端口转发规则都没有收到。你知道吗

这个问题是源于我的代码,还是更可能是因为我的路由器没有正确设置?你知道吗


Tags: 端口代码服务器hostmessagedataport计算机
2条回答

好吧,我在Android手机上设置了一个热点。这是你的“路由器”,用的是我手机的IP地址。在计算机上尝试运行客户端代码,它在客户端上发送测试消息:

发送:测试消息 发送:测试消息 发送:测试消息 发送:测试消息 .... 你知道吗

但我在你的服务器上没有收到任何消息,仍然说服务器启动了。你知道吗

所以我在“Client App”上这样配置了主机变量,而且服务器上的端口2000和客户端上的端口2001也不一致:

主机=“#我的路由器的外部IP 端口=2000 注意!!我让主人空着

因为我认为出于某种原因,服务器是本地托管在pc上的,所以您正在运行服务器。这样,我也可以从运行服务器应用程序的同一台计算机进行本地连接:

host=“localhost”#我的路由器的外部IP

在你的客户端应用程序上。你知道吗

一切都是这样。你知道吗

服务器代码 在你的电脑上运行这个。你知道吗

import socket

host = "" # IP of my computer
port = 2000

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))

addrs = []

print("Server started")
while True:
    data, addr = s.recvfrom(1024)
    if not addr in addrs:
        addrs.append(addr)
    data = data.decode("utf-8")
    print("Recieved: " + str(data))
    print("Sending: " + data)
    for add in addrs:
        s.sendto(data.encode("utf-8"), add)

取决于你在哪里运行你的服务器应用程序。使用运行服务器的计算机的IP。我还在学习,所以我不知道如何设置它使用您的路由器的IP。你知道吗

客户端应用程序代码 在你的朋友电脑上运行这个或更多。甚至在android上。你知道吗

import socket
import time

host = "ip_of_the_computer_the_server_is_running_on" # connecting from another computer
#host = "localhost" # If you connecting locally

port = 2000

server = (host, port)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(False)

while True:
    message = "Test message"
    time.sleep(1)
    print("Sending: " + message)
    s.sendto(message.encode("utf-8"), server)
    try:
        data, addr = s.recvfrom(1024)
    except BlockingIOError:
        pass
    else:
        data = data.decode("utf-8")
        print("Recieved: " + str(data))

并仅将路由器用于同一AP连接。 用我的TOTO-LINK测试,效果很好。只要我不在客户端主机上使用路由器的IP。你知道吗

演示服务器Server Code Running and recieving from Android and localhost

客户

Client on computer Sending Tests

移动客户端enter image description here

这个代码实际上是100%正确的,错误是在我的端口转发。你知道吗

相关问题 更多 >