簡體   English   中英

如何使用 Python 中的套接字庫將我的服務器連接到其他機器?

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

我是套接字庫和服務器端編程的新手。 我制作了 2 個在我的機器上完美運行的腳本,即server.pyclient.py 但是當我在兩台不同的計算機上測試它時,它不起作用。

我想要的是讓我的server.py文件連接到client.py ,其中server.py將在我的機器上運行,它將連接到世界上任何位置的單獨機器上的client.py

我只知道套接字。 但是如果這個問題可以通過使用其他庫來解決,那也沒關系。

這是我的代碼:

服務器.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"))

客戶端.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 地址。 現在,您的客戶端正在嘗試使用與客戶端在同一 IP 上運行的服務器。 從邏輯上講,當服務器和客戶端運行在同一個 ip 上時,這將起作用,但是當客戶端駐留在另一台機器上時,您需要連接到正確的 ip 地址:

s.connect((host, port))

另外,請確保該端口實際上是打開的並且未被其他程序阻止。 網站幫助我在兩台不同的筆記本電腦上打開端口 7777 並在它們上運行您編輯過的代碼。 您可以對端口 12048 執行相同操作。

  1. 右鍵單擊“開始”按鈕。
  2. 單擊搜索。
  3. 鍵入 Windows 防火牆。
  4. 單擊 Windows 防火牆。
  5. 單擊高級設置。
  6. 單擊窗口左側框架中的入站規則。
  7. 單擊窗口右側框架中的新建規則...。
  8. 單擊端口。
  9. 點擊下一步。
  10. 單擊 TCP 或 UDP。
  11. 單擊特定本地端口。
  12. 鍵入端口號。 (在這種情況下,我們將打開端口 12048。)
  13. 點擊下一步。
  14. 單擊允許連接。
  15. 點擊下一步。
  16. 單擊您希望允許連接的任何網絡類型。
  17. 點擊下一步。
  18. 鍵入規則的名稱。
  19. 單擊完成。

我相信對於套接字,您必須打開 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"))

現在,您將能夠連接到在另一台計算機上運行的服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM