跨网络的Python Socket通信无法正常工作

时间:2018-05-26 21:06:10

标签: python sockets

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

服务器:

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 )运行客户端代码时,它不起作用。没有错误,但他发送的数据既不是我的计算机也不是路由器的端口转发规则。

这个问题可能来自我的代码,还是因为我的路由器设置不正确而更有可能?

2 个答案:

答案 0 :(得分:0)

好的我设置了HotSpot我的Android手机。在这种情况下,你的“路由器”,使用我的手机的IP地址。并且在计算机上试图运行客户端代码,它在客户端上发送测试消息:

发送:测试消息 发送:测试消息 发送:测试消息 发送:测试消息 ....

但我在您的服务器上没有收到任何信息,仍然说服务器已启动。

所以我在“客户端应用程序”上配置了你的主机变量,你的端口在服务器上的2000和客户端上的2001不一致:

host =“”#我的路由器的外部IP port = 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)

取决于您运行serverApp的位置。使用运行服务器的计算机的IP。我还在学习,所以我不知道如何设置它来使用路由器的IP。

ClientApp代码 在您的朋友计算机上运行此操作或更多。或者甚至在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 IT WORKS FINE进行测试。只要我不使用路由器的IP在客户端主机上。

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

客户端

Client on computer Sending Tests

移动客户端 enter image description here

答案 1 :(得分:0)

此代码实际上是100%正确,错误在我的端口转发中。