我已经在Python 2.7.x中创建了一个基本的客户端服务器套接字程序,即使在不同的计算机上,它也可以在同一网络上正常运行,但是当我在不同的网络上运行服务器和客户端时(我 friend 所在的服务器上的服务器,而我的客户端上的服务器)不返回任何错误,并继续等待。我只是不明白如何调试代码。我通过杀死端口80上的所有服务来使用端口80。我还完成了两台计算机上端口80上的端口转发。

我的代码如下:

client.py

import socket

s = socket.socket()
host = '103.47.59.130'
port = 80

s.connect((host, port))
while True:
    print "From Server: ", s.recv(1024)  #This gets printed after sometime
    s.send(raw_input("Client please type: "))

s.close()

server.py
import socket

s = socket.socket()         # Create a socket object
host = '192.168.0.104'    #private ip address of machine running fedora
port = 80
s.bind((host, port))

s.listen(5)
c, addr = s.accept()
print 'Got connection from', addr    #this line never gets printed
while True:
   c.send(raw_input("Server please type: "))
   print "From Client: ", c.recv(1024)

c.close()

有时会输出**从服务器:**,但不会来回发送任何消息。

PS:我之前在Stack Overflow上进行了搜索,但找不到任何相关内容。

最佳答案

使用此software实现端口转发。我建议您为服务器使用另一个端口,例如5006,以防止与使用非常常用的端口(例如80)相关的任何问题。基本上,该软件的工作方式如下:

  • 单击“连接”,它将搜索路由器,如果找到您的路由器,则会列出现有的端口映射。
  • 您创建一个端口映射(在右侧),默认协议(protocol)为TCP
  • 您在路由器上选择一个端口,例如5001(称为“外部端口”)
  • 您选择服务器上的端口,也许是5006(称为内部端口)
  • 然后将指示路由器使用私有(private)IP将到达端口5001的所有数据转发到服务器,特别是转发到服务器上的端口5006。

  • 因此,您的客户端所需要做的就是将数据发送到服务器的公共(public)IP,特别是到端口5001。当然,这些数据将首先到达路由器,路由器将按照配置进行操作,并将所有内容转发到服务器的端口5006。仅在您的Internet网关支持端口转发时才有效。

    客户:
    import socket
    
    s = socket.socket()
    host = '103.47.59.130'
    port = 5001
    
    s.connect((host, port))
    while True:
        try:
            print "From Server: ", s.recv(1024)
            s.send(raw_input("Client please type: "))
        except:
            break
    s.close()
    

    服务器:
    import socket
    
    s = socket.socket()         # Create a socket object
    host = '192.168.0.104'    #private ip address of machine running fedora
    port = 5006
    s.bind((host, port))
    
    s.listen(5)
    c, addr = s.accept()
    print 'Got connection from', addr
    while True:
       c.send(raw_input("Server please type: "))
       print "From Client: ", c.recv(1024)
    
    c.close()
    

    10-07 16:27