【问题标题】:How could we establish connection between server and client through socket programming(Python) with server and client on different networks?我们如何通过套接字编程(Python)与不同网络上的服务器和客户端建立服务器和客户端之间的连接?
【发布时间】:2021-08-08 07:31:54
【问题描述】:

我们如何通过套接字编程(Python)与不同设备和不同网络上的服务器和客户端建立服务器和客户端之间的连接?当我们使用 i/p 地址和端口创建套接字时 如果两个设备都连接在同一网络上,则服务器、服务器和客户端的连接。但是对于不同的网络,情况并非如此。需要做什么来连接它们?

import socket
def server_program():
    host = socket.gethostname()
    port = 5000 
    server_socket = socket.socket()  
    server_socket.bind((host, port)) 
    server_socket.listen(2)
    conn, address = server_socket.accept()  
    print("Connection from: " + str(address))
    while True:
        data = conn.recv(1024).decode()
        if not data:
            break
        print("from connected user: " + str(data))
        data = input(' -> ')
        conn.send(data.encode())  
    conn.close()  

if __name__ == '__main__':
    server_program()
import socket
def client_program():
    host = socket.gethostname()   // used ngrok i/p here
    port = 5000                   // used ngrok port no
    client_socket = socket.socket()  
    client_socket.connect((host, port))
    message = input(" -> ") 

    while message.lower().strip() != 'bye':
        client_socket.send(message.encode()) 
        data = client_socket.recv(1024).decode() 

        print('Received from server: ' + data)

        message = input(" -> ") 
    client_socket.close() 

if __name__ == '__main__':
    client_program()

【问题讨论】:

  • “但不同网络的情况并非如此。” - 不同的网络不是问题,即可以轻松拥有内部客户端和互联网上的一些外部服务器。这就是浏览器和 Web 服务器之间的正常通信以及类似的工作方式。 Python 也可以做到这一点。问题仅在于网络内的系统可以相互访问,或者是否存在限制连接性的防火墙或路由。 解决连接问题的方法取决于具体问题,但可能涉及防火墙设置、端口转发或使用外部帮助程序。

标签: python sockets networking


【解决方案1】:

要在不同网络上的服务器和客户端之间建立连接,您需要使用port forwarding,或者您可以借助一些外部软件,例如ngrok

你是如何使用 ngrok 的?

  1. 首先您需要注册。
  2. 下载 ngrok 软件
  3. 现在你会得到这样的屏幕

  1. 复制./ ngrok authtoken .........这一行

  2. 打开 cmd 并 cd 进入你下载 ngrok 的文件夹

  3. 粘贴复制的命令(注意-如果您在 Windows 上,请从命令的开头删除 ./)并按 Enter 键

  4. 输入以下命令

ngrok tcp [Port on which your server is listening]

例如 - 如果您的服务器正在侦听端口 65432,那么您必须输入以下命令

ngrok tcp 65432

您现在应该会看到这样的窗口

  1. 从窗口复制x.tcp.ngrok......(在上图中突出显示)
  2. 打开cmd并输入ping [copied text here] 输出应该是这样的:
Pinging x.tcp.ngrok...... [ip here] with 32 bytes of data:
....
....
....
  1. 复制ip

  2. 现在在您的 client.py 文件中将 ip 替换为您复制的 ip

  3. 从 ngrok 窗口复制端口(在上图中突出显示的文本旁边,在我的例子中是 11171)

  4. 用你复制的端口替换client.py文件中的端口

  5. server.py中将主机改为"0.0.0.0"

  6. 您现在可以出发了!客户现在可以从全球各地连接到您的服务器

【讨论】:

  • 当我输入“ping x.tcp.....”时,我得到 100% 的数据包丢失。因此,当我最终在 client.py 中使用该 I/P 和端口号时,在 ngrok Windows 中,当服务器和客户端连接但数据/消息未在服务器/客户端之间相互发送时,我可以看到 connection = 1
  • 能否在您的问题中添加client.pyserver.py 代码?
  • 顺便说一句,100% 丢包是预期的情况
  • 我已经添加了client.py和server.py。
  • 我的错,你还需要在server.py中将主机更改为"0.0.0.0"
猜你喜欢
  • 2012-04-24
  • 2011-02-10
  • 2011-05-20
  • 1970-01-01
  • 2018-06-10
  • 2013-11-11
  • 2015-11-09
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多