Python中的internet套接字连接?

2024-04-23 07:13:24 发布

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

我用Python2.7.x创建了一个基本的客户机-服务器套接字程序,它在同一个网络上运行得非常好,即使在不同的机器上,但当我在不同的网络上运行服务器和客户机时(在我朋友的网络上运行服务器,而在我的客户机上运行客户机),它不会返回任何错误并一直等待。我只是不明白如何调试代码。我正在使用端口80杀死端口80上的所有服务。我也在两台机器上的端口80上做了端口转发。

我的代码如下:

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

服务器.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:我之前搜索过堆栈溢出,但找不到任何相关内容。


Tags: 端口代码frompyimport网络服务器机器
3条回答

似乎需要执行基本的网络故障排除。您的描述说,您可以连接到自己网络上的其他计算机,但不能连接到其他网络上的计算机。您可以在另一个网络上的机器上尝试相同的测试:它能连接到自己网络上的其他机器吗,它能连接到网络之外的其他机器吗。

一些非常有价值的工具包括ping、tracepath、tcpdump和nc(netcat)。

最后,如果你能与netcat建立连接,你可以假设问题出在你的代码上,但是如果你做不到,你可以尝试找出网络问题。

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

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

因此,您的客户机所要做的就是将数据发送到服务器的公共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()

您需要使用公共IP地址或服务器中的0.0.0.0,并确保调制解调器/路由器允许在指定端口(通常称为端口转发)进行传入连接。

希望有帮助!

相关问题 更多 >