Python中的互联网套接字连接?

时间:2016-02-13 19:33:40

标签: python sockets networking tcp

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

我的代码如下:

client.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()                

server.py

data
 [1] 18 22 18 20 20 20 20 17 17 16 20 17 21 19 18 19 13 21 19 14 22 19 20 20 16 19 21 19 17 20 15 20 18 19 26 21 19 22 20 24 25
 [42] 14 20 17 20 21 19 20 16 18 18 16 18 16 15 20 15 17 20 16 16 17 21 19 17 21 19 21 19 19 18 16 17 15 21 22 18 19 18 22 23 20
 [83] 21 17 17 15 12 23 18 19 18 21 18 17 18 22 16 20 21 18

table(data)
 data
 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
 1  1  2  5  9 12 15 15 17 12  6  2  1  1  1 

hist(data)
hist(data, probability=TRUE)
hist(table(data))
hist(table(data), probability=TRUE)

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

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

3 个答案:

答案 0 :(得分:2)

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

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

因此,您所有客户所要做的就是将数据发送到服务器的公共IP,特别是端口5001.这些数据当然会首先到达您的路由器,路由器将按照配置运行并将所有内容转发到您的服务器&#39 ; s端口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()

答案 1 :(得分:1)

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

希望它有所帮助!

答案 2 :(得分:0)

好像您需要执行基本的网络故障排除。您的描述表明您可以连接到您自己网络上的其他计算机,但不能连接到其他网络上的计算机。您可以在另一个网络上的计算机上尝试相同类型的测试:它是否可以连接到自己网络上的其他计算机,是否可以连接到其网络之外的其他计算机。

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

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