2017-04-13 86 views
0

我有一個server.py和client.py。python連接到同一網絡上的服務器

如果我在同一臺計算機上使用與127.0.0.1相同的端口和主機運行它,它工作正常。

我有另一臺筆記本電腦連接到同一個網絡。我得到我的本地IP地址129.94.209.9並用於服務器。在另一臺筆記本電腦上,我試圖連接到服務器,但我不能。

這是我的代碼,與網絡或我只是使用錯誤的IP地址的問題?

Server.py

HOST = '129.94.209.9' 
PORT = 9999 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
server_socket.bind((HOST, PORT)) 
server_socket.listen(10) 
sockfd, addr = server_socket.accept() 
send and receive messages etc.... 

Client.py

HOST = '129.94.209.9' 
PORT = 9999 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
try: 
    sock.connect((HOST, PORT)) 
except: 
    print("Cannot connect to the server") 
send and receive messages etc... 

客戶端打印出 「無法連接到服務器」

謝謝!

更新:感謝遺憾的意見

1)我做的sockfd,地址= server_socket.accept()我忘了補充它,它是在幾行代碼就進一步下跌。

2)的錯誤是:[錯誤11]資源暫時不可

3)坪確實工作

EDIT:現在工作時我在插兩臺計算機通過以太網電纜到同一網絡。不知道爲什麼當它們彼此相鄰並連接到無線網絡時,我的無法工作。 感謝您的所有建議!我會自己調查網絡問題

+0

首先,你應該刪除'try' /'except'或重新引發exceptin看到實際的錯誤消息。 –

+0

你是否嘗試過改變你的'except:'除了Exception之外的東西',例如:'。這可以讓你更清楚地看到'print(ex)'的異常情況,並且可以提供更多信息 –

+0

從一臺機器到另一臺機器是否可以「ping」? – 2017-04-13 07:47:09

回答

1

使用下面的代碼(當然,我的IP地址而不是你的IP地址),我看到了預期的行爲。

so8srv.py:

import socket 
HOST = '192.168.33.64' 
PORT = 9999 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
server_socket.bind((HOST, PORT)) 
server_socket.listen(10) 
print("Listening") 
s = server_socket.accept() 
print("Connected") 

so8cli.py:

import socket 
HOST = '192.168.33.64' 
PORT = 9999 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
try: 
    sock.connect((HOST, PORT)) 
except Exception as e: 
    print("Cannot connect to the server:", e) 
print("Connected") 

當我運行它,服務器打印"Listening"。當我運行客戶端時,它和服務器都打印"Connected"

您會注意到,與您的代碼不同,我的客戶端不會爲所引發的任何異常打印相同的診斷,而是報告異常。作爲一個良好的實踐,您應該避免使用except條款,因爲無論異常是由編程錯誤還是由用戶操作(如KeyboardInterrupt)引起的,您的程序都將採取相同的操作。

+0

謝謝。看起來我們的代碼很好,但是我的無線接入點或路由器肯定是做了一些壞事。當我使用以太網電纜而不是WiFi連接筆記本電腦時,它現在正在工作 – Friedpanseller

0

同時嘗試使用這種結構來獲得IP地址:

HOST=socket.gethostbyname(socket.gethostname()) 
+0

這通常最終會返回本地主機地址 – holdenweb

+0

請注意這一點。在一臺機器上你應該有'gethostbyname()'和另一個「0.0.0.0」。否則兩者之間的連接將失敗 – 2017-04-13 08:28:52

+0

事實並非如此,聽起來像貨物信息。在服務器套接字上使用「'0.0.0.0'」來偵聽_all available_接口。僅在一個由其IP地址提名的接口上進行監聽是完全有效的。絕對不需要使用主機名 - 它們僅僅是人類用戶的便利。 – holdenweb