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

San*_*ain 6 python sockets networking tcp

我已经在Python 2.7.x中创建了一个基本的客户端服务器套接字程序,即使在不同的机器上也可以在同一个网络上运行,但是当我在不同的网络上运行服务器和客户端时(我朋友的网络上的服务器,而我的客户端)不会返回任何错误并继续等待.我只是无法理解如何调试代码.我通过杀死端口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()                     
Run Code Online (Sandbox Code Playgroud)

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()                
Run Code Online (Sandbox Code Playgroud)

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

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

Tis*_*dii 7

使用本软件实现端口转发。我建议您为服务器使用另一个端口,例如 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()
Run Code Online (Sandbox Code Playgroud)

服务器:

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()
Run Code Online (Sandbox Code Playgroud)


cdo*_*nts 2

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

希望能帮助到你!