Python 套接字编程无法连接到其他网络
我最近用python编写了一个使用套接字的客户机/服务器对,但问题是客户机没有连接到另一个网络上的服务器。我尝试了端口转发,并将内部IP地址设置为静态,一个真正困扰我的问题是,我是否需要外部/公共IP地址来连接客户端,如果是这种情况,当ISP更改我的外部IP地址时该怎么办。请给出一些建议,谢谢Python 套接字编程无法连接到其他网络,python,sockets,ip-address,portforwarding,Python,Sockets,Ip Address,Portforwarding,我最近用python编写了一个使用套接字的客户机/服务器对,但问题是客户机没有连接到另一个网络上的服务器。我尝试了端口转发,并将内部IP地址设置为静态,一个真正困扰我的问题是,我是否需要外部/公共IP地址来连接客户端,如果是这种情况,当ISP更改我的外部IP地址时该怎么办。请给出一些建议,谢谢 code: PORT=8888 srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) srvsock.setsockopt( soc
code:
PORT=8888
srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
srvsock.bind( ('', PORT) )
srvsock.listen( 10 )
print 'server now listening on PORT '+str(PORT)
while 1:
clisock, (remhost, remport) = srvsock.accept()
dl_information_file="server.txt"
if os.path.exists(dl_information_file):
f=open('server.txt','rb')
read=f.read()
clisock.send( read )
f.close()
首先,尝试在同一台计算机上运行服务器和客户端(连接到本地主机) 如果这起作用,您的问题与端口转发有关。
请参阅:客户端和服务器是在本地网络上还是由Internet分隔 如果服务器在NAT后面的机器上运行,则必须在该机器上执行端口转发,并确保机器的IP是静态的,或者使用更新的IP更新客户端 如果服务器位于您自己的网络中,您可以使用
socket.gethostbyname(socket.getfqdn())
获取接口的IP(注意,您可能有多个),并使用该IP绑定套接字
您还可以使用WireShark对连接进行故障排除-您可以看到哪些数据包正在从您的客户端流出,哪些数据包正在进入您的服务器
如果没有进一步的代码和网络上的更多信息,真的很难说更多——可能是防火墙,可能是NAT,可能是配置不好的接口
编辑:您似乎正在将套接字绑定到'
,这意味着它应该绑定到本地主机端口,这意味着服务器侦听本地环回上的连接(127.0.0.1)。运行服务器的任何其他计算机都无法访问此接口。
您应该在脚本中的变量中使用静态配置的IP,或者使用
socket.gethostbyname(socket.getfqdn())
与socket通信不需要公共IP地址,但必须发布代码(或相关部分),否则没有人能够帮助您。基本的网络设置也会有所帮助。1.服务器位于哪个网络?IP地址、子网掩码等。与客户端所在的网络相同。此网络之间是否可以进行其他通信,它们是如何连接的…?它在同一台计算机和同一网络上运行,但在internet上失败。如何实现socket.gethostbyname(socket.getfqdn()),谢谢这是一个示例:srvsock.bind((socket.gethostbyname(socket.getfqdn()),PORT))
。请记住,此方法解析getfqdn()提供的主机名的IP,然后获取第一个接口的主机名,该接口可能不是您要查找的正确接口-例如,如果您有hamachi或virtualbox,则可能会发生这种情况。另一个解决方案是签出服务器的IP并手动将其提供给脚本中的bind函数。我可以将其绑定到静态IP地址吗?我假设服务器位于NAT后面。如果是,则可以检查本地网络上服务器的IP,将服务器绑定到该IP,然后在路由器上设置端口转发。我相信这应该行得通。“
的意思是不允许。这并不意味着本地主机。绑定到主机名并解析为专用地址并不能解决OP的问题(通过internet进行通信)。