2015-04-28 61 views
0

我一直在嘗試設置套接字,這些套接字將通過互聯網工作。我通過堆棧溢出來搜索高位和低位,似乎無法找到我需要的答案。Python 3在互聯網上使用套接字

當我運行server.py我收到此錯誤:

Traceback (most recent call last): 
    File "server.py", line 16, in <module> 
    serversocket.bind((host, port)) 
OSError: [WinError 10049] The requested address is not valid in its context 

請注意,下面好像在本地的無線網絡的工作。

服務器代碼:

# server.py 
import socket          

# create a socket object 
serversocket = socket.socket(
      socket.AF_INET, socket.SOCK_STREAM) 


#get ip address 
print("You are the server.") 
print("What is your ip? If you do not know, look up <my ip> on google.") 
host = input(">")       

port = 0           

# bind to the port 
serversocket.bind((host, port))         

# queue up to 5 requests 
serversocket.listen(5) 
clientsocket,addr = serversocket.accept()           

def messenger(): 
    # establish a connection  
    tm = clientsocket.recv(1024) 
    tm = tm.decode('ascii') 

    if tm == "9+10": 
     message = "21" 
    elif tm == "sweg": 
     message = "swegedy swooty feel the booty" 
    else: 
     message = "feggeet" 
    clientsocket.send(message.encode('ascii')) 
    messenger() 
messenger() 

的客戶端代碼:

# client.py 
import socket 

#get ip address 
print("You are the client.") 
print("What is your servers ip?") 
host = input(">") 

# create a socket object 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

port = 0 
s.connect((host, port)) 

# Receive no more than 1024 bytes 
def messenger(): 
    message = input("command:") 
    s.send(message.encode("ascii")) 
    tm = s.recv(1024)          
    print(tm.decode('ascii')) 
    messenger() 
messenger() 

據我瞭解,這應該工作,只要我插入一個公網IP地址。但是,我只是得到了這個錯誤信息。

我在做什麼錯?

+0

請注意,你的'messenger'函數最終會溢出堆棧,因爲你一遍又一遍地從本身調用它。相反,只要將讀/寫邏輯放入一個循環中並在接收到某個特定的字符串時退出循環(以及信使功能)。 – KevinDTimm

+0

好的,我會解決這個問題。謝謝。 –

回答

0

您的服務器只能綁定到它所在的主機地址。 IIRC,你應該綁定到0.0.0.0,這綁定到當前機器上的所有地址。然後,您可以在本地連接客戶端(同一臺機器127.0.0.1,本地機器 - 您需要知道機器的內部IP地址)。

盤整,常用的方法是serversocket.bind((socket.gethostname(), 80))

如果你想從互聯網上訪問你需要知道的第一件事是你機器的互聯網地址。由於您不太可能直接連接到互聯網,因此這將成爲路由器的IP地址。

下一步將允許通過路由器的端口轉發到您的機器 - 再次,可以寫一篇關於此的巨大專着。

+0

我知道互聯網地址,我該如何處理端口轉發? –

+0

這是一個很大的主題,具體到你的路由器 - 從文檔開始,然後進入製造商網站。 IOW,這是系統管理員,而不是編程。 – KevinDTimm

+0

這是製作可通過互聯網工作的Python程序的唯一方法嗎?必須有一個更簡單的方法... –