如何使用 Python 中的套接字库将我的服务器连接到其他机器?

How to connect my server to other machine using socket library in Python?

我是套接字库和服务器端编程的新手。我制作了 2 个在我的机器上完美运行的脚本,即 server.pyclient.py。但是当我在两台不同的计算机上测试它时,它不起作用。

What i want is to make my server.py file connected to client.py, where server.py will run on my machine and it will be connected to client.py on a separate machine at any location in the world.

我只知道socket而已。但是如果这个问题可以通过使用其他库来解决,那么也可以。

这是我的代码:

server.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
port = 12048

s.bind((host, port))

s.listen()
print("Server listening @ {}:{}".format(host, port))

while True:
    c, addr = s.accept()
    print("Got connection from", addr)

    c.send(bytes("Thank you", "utf-8"))

client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162'  # The IP printed by the server must be set here
port = 12048

s.connect((socket.gethostname(), port))

msg = s.recv(1024)
print(msg.decode("utf-8"))

我不知道这怎么可能,但如果是的话请回答这个问题。

此外, 我想从 client.py 接收文件到我的机器。是否可以在套接字中或我必须导入任何其他库?

如有任何帮助,我们将不胜感激。

Client.py 中,您将套接字连接到 socket.gethostname() 而不是服务器的 IP 地址。现在,您的客户端正在尝试连接一个服务器,该服务器应该 运行ning 在与客户端相同的 IP 上。从逻辑上讲,当服务器和客户端 运行 在同一 ip 上时,这将起作用,但是当客户端驻留在另一台机器上时,您需要连接到正确的 ip 地址:

s.connect((host, port))

此外,请确保该端口实际打开且未被其他程序阻止。 This 网站帮助我在两台不同的笔记本电脑上打开了端口 7777,并 运行 您在它们上编辑的代码。您可以对端口 12048 执行相同的操作。

  1. 右键单击“开始”按钮。
  2. 点击搜索。
  3. 类型 Windows 防火墙。
  4. 单击 Windows 防火墙。
  5. 点击高级设置。
  6. 单击 window 左侧框架中的入站规则。
  7. 在 window.
  8. 的右侧框架中单击“新建规则...”
  9. 单击端口。
  10. 单击“下一步”。
  11. 单击 TCP 或 UDP。
  12. 单击特定本地端口。
  13. 键入端口号。 (在这种情况下,我们将打开端口 12048。)
  14. 单击“下一步”。
  15. 单击允许连接。
  16. 单击“下一步”。
  17. 单击您要允许连接的任何网络类型。
  18. 单击“下一步”。
  19. 键入规则的名称。
  20. 单击“完成”。

我认为对于套接字,您必须打开 TCP 端口,但如果这不起作用,您也可以为 UDP 端口制定新规则。

客户端将仅连接到同一台计算机上的服务器 运行 的原因是因为您使用的是 s.connect((socket.gethostname(), port)) 而不是 s.connect((host, port))。您的 host IP 变量从未被使用。这个错误意味着客户端将尝试连接到它自己的主机名,这就是它自己,所以这就是它只能在一台计算机上工作的原因。

您应该这样修改 client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.1.162'  # Make sure this is set to the IP of the server
port = 12048

s.connect((host, port))

msg = s.recv(1024)
print(msg.decode("utf-8"))

现在您可以在另一台计算机上连接到服务器 运行。