2014-02-24 61 views
1

我試圖創建一個客戶端輸入服務器的IP地址/端口並連接到它的能力。爲了做到這一點,我需要服務器的公共IP地址/端口。有沒有一個好的方法來做到這一點?我已經試過到目前爲止...查找我的套接字的公共IP地址?

ip_address = urllib.request.urlopen(<my web server>).read() 

只包含PHP腳本的Web服務器:

<?php echo $_SERVER["REMOTE_ADDR"]?> 

而只是存儲從

s.bind(('', port)) 

連接端口到這個IP地址和端口超時。有一個更好的方法嗎?

編輯: 好吧,所以基本上我試圖通過互聯網建立連接,而不知道我的路由器將做什麼。如有必要,我可以使用任何代碼的Web服務器,因爲我可以訪問永久Web空間。這就是我現在所擁有的。

服務器:

import urllib.request 
import threading 
import socket 

socket_list = [] 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

s.bind(('', 0)) 

s.listen(10) 


def listener(socket): 
    while(1): 
     data = socket.recv(1024) 
     print (data) 

def accepter(): 
    while(1): 
     socket, addr = s.accept() 
     socket_list.append(socket) 
     threading.Thread(target = listener, args = (socket,)).start() 

ip_address = (urllib.request.urlopen("<MY WEB SERVER HERE>").read()).decode('utf-8') 
print (ip_address) 
print (s.getsockname()[1]) 

threading.Thread(target = accepter, args =()).start() 

客戶:

import socket 

print ("Enter IP Address") 
ip_address = input() 
print ("Enter Port") 
port = int(input()) 

s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s2.connect((ip_address, port))s2.send("Connected!") 
s2.close() 

當我跑,我進入了由服務器輸出的IP地址和端口的客戶端。不用說,這是行不通的。

+0

所以你需要*你的*公共IP或某些外部服務器?問題有點令人困惑,因爲您正在操作的管道的哪一側。 – roippi

+0

我需要我的IP地址。 – SwiftCore

+0

你是服務器嗎? – Noelkd

回答

1

我認爲這是可以做到這樣的,如果你不想讓你的服務器設置了像你這樣的一個很好的問題有:

""" Easy IP Getter """ 
import json 
import urllib2 

info = json.loads(urllib2.urlopen("http://jsonip.com").read()) 
ip = info["ip"] 
print ip 

這取決於外部服務然而這ISN」最好的,如果他們停止工作,你停止工作。

+0

我想我也應該說我需要端口號?我應該嘗試通過網絡服務器建立連接以確定端口嗎?我有我可以使用的網站空間。 – SwiftCore