2011-04-19 31 views
4

服務器:Python的插座只接受本地連接

import socket 

host = "" 
port = 4242 
backlog = 5 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
client, address = s.accept() 
while 1: 

    data = client.recv(size) 
    if data: 
     client.send(data) 
     print(data.decode("utf-8")) 

客戶:

import socket 
import sys 

host = sys.argv[1] 
port = 4242 
size = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host,port)) 
while True: 
    line = input("What to say: ") 
    s.send(line.encode("utf-8")) 

好了,我在這裏有點糊塗了。我開始學習套接字,所以我開始使用簡單的echo服務器。我在上面發佈的代碼在服務器運行在Arch Linux或Ubuntu上時運行得非常漂亮。然而,當它在Windows 7上時,它只接受本地連接。事情是,我沒有運行防火牆。我不確定Python是否有單獨的WinSock實現或者什麼,但我很困惑!請,如果你願意,我很清楚,這是非常設計(只接受客戶端!),但我只想知道爲什麼Windows不接受遠程連接。

如果有幫助,在Arch和Ubuntu上,我運行在Python 3.1上,而在Win 7上它運行在3.2上。

回答

8

聽起來像host=''是默認綁定到Win 7下的本地主機(127.0.0.1)(我目前無法訪問Win 7機器)。

爲了讓您的服務器的主機上的所有(IPv4)的接口訪問,這應該在Linux,Windows,Mac上,工作等:

host = '0.0.0.0' 
s.bind((host, 8080)) 

爲了驗證該地址的套接字綁定到你可以做這個:

>>> s.getsockname() 
('0.0.0.0', 8080) 
0

由於文檔Socket狀態:

有些行爲可能是與平臺相關的,因爲調用操作系統插座 API進行的。

我不熟悉的Win32網絡編程,但我會大膽地猜測,這可能是當你不綁定到一個地址創建一個套接字是引發了實施的具體行爲。

我的建議是向上移動一個抽象級別並使用SocketServer

+0

當然,我以後每次都想升到更高的水平,但我只是想從低位開始走高。無論如何,我仍然想象Python找到了一種方法來獲得在Windows上工作的標準套接字庫。 – 2011-04-19 01:20:53

+0

是的,但我想''host =「」'會觸發實現的特定行爲,例如在Windows上綁定到''localhost:4242''的套接字,並在Linux上綁定''::4242''。 – Sean 2011-04-19 01:24:26