2015-03-03 142 views
1

我想創建一個簡單的應用程序使用AIR,使用套接字將兩個客戶端連接到彼此。連接兩個客戶端使用AS3 ServerSocket和套接字

據我所知,ServerSocket類可用於偵聽TCP連接,並且您可以使用Socket類進行TCP連接請求。事實上,連接到自身或其他測試程序一個簡單的測試應用程序正常工作在localhost:

服務器類:

private var server:ServerSocket; 
private var clients:Vector.<Socket> = new Vector.<Socket>; 

public function create() { 
    server = new ServerSocket(); 
    server.bind(8888); 
    server.addEventListener(ServerSocketConnectEvent.CONNECT, serverConnectHandler); 
    server.listen(); 
} 

private function serverConnectHandler(e:ServerSocketConnectEvent):void { 
    var socket:Socket = e.socket; 
    clients.push(socket); 
    socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 
} 

private function socketDataHandler(e:ProgressEvent):void { 
    var socket:Socket = e.currentTarget as Socket; 
    var data:Object = socket.readObject(); 
    trace("Data received:", data); 
} 

public function send(data:Object):void { 
    for each(var client:Socket in clients){ 
     client.writeObject(data); 
     client.flush(); 
    } 
} 

Client類:

private var socket:Socket; 

public function create() { 
    socket = new Socket(); 
    socket.addEventListener(Event.CONNECT, connectHandler); 
    socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 
} 

public function connect(address:String):void { 
    socket.connect(address, 8888); 
} 

private function connectHandler(e:Event):void { 
    trace(e); 
} 

private function socketDataHandler(e:ProgressEvent):void { 
    var data:Object = socket.readObject(); 
    trace("Data received:", data); 
} 

public function send(data:Object):void { 
    socket.writeObject(data); 
    socket.flush(); 
} 

一臺機器,如果在上述工作我需要connect()來解決「localhost」問題。

我有點失落的地方是如何建立兩臺機器之間的實際連接,這兩臺機器都連接到互聯網,但不在同一個網絡上。由於這兩臺機器都可能位於路由器後面,我認爲我需要路由器的IP地址,路由器必須知道將我的應用所需的端口(上面的8888)轉發給運行ServerSocket的機器?這個端口轉發可以從AIR建立嗎? AIR是否可以收集當前機器的必要地址和端口以建立連接?換句話說,如果一臺機器沒有直接連接到互聯網(它位於路由器的後面),並且因此沒有公共IP地址,另一臺機器如何連接到它?顯然這可以通過機器連接的路由器的必要的公共IP地址和路由器[端口?]轉發到機器來完成,但我不清楚如何從AIR設置它,甚至在AIR中可能。

例如,NetworkInfo/findInterfaces()返回一個LAN地址列表,但不是在who.is上顯示的公共IP地址。

我可以在公共域上使用Apache服務器來共享客戶端之間的地址信息,但我希望讓客戶端建立一個直接的p2p連接。

謝謝!

+0

我在這樣的工作,但你的意思是:「空氣能收集必要的地址和端口爲當前機器建立連接」?因爲當AIR應用連接到其他應用時,它不需要知道它是自己的機器地址! – akmozo 2015-03-05 01:17:27

+0

嗨。客戶需要爲其他客戶分享自己的地址和端口。我可以通過HTTP服務器(PHP + SQLite)共享此信息。但是,如果客戶端位於路由器後面,則來自'NetworkInfo/findInterfaces()'的地址似乎不會公開IP地址,就像您在who.is上看到的那樣。那麼,如何在路由器後面連接兩臺機器? – Aaron 2015-03-05 03:04:39

+0

我加了一點澄清。 – Aaron 2015-03-05 03:11:44

回答

0

我知道這個問題的2歲的,但對於那些令人摸不着頭腦關於它的未來:

我剛收到你的代碼,在我結束工作;您需要在服務器的計算機上向前端口。基本上,讓您的路由器將任何傳入的8888 TCP流量指向運行服務器的計算機(指向計算機的8888端口)。

客戶端不需要進行端口轉發,因爲當服務器迴應時,客戶端的路由器將其視爲「響應」並允許數據包通過。

除此之外,只需將客戶端連接到服務器(路由器)的公共IP,您可以通過here找到該IP。

+0

從過去爆炸。 :)你是如何設置服務器端口轉發的?手動配置您的路由器,還是通過AIR應用本身?問題是許多P2P應用程序並不要求你惹惱你的路由器,我從來沒有想過如何設法做到這一點,如果你可以從AIR應用程序做同樣的事情。 – Aaron 2018-01-26 17:12:41

+0

@Aaron我不得不在路由器上設置它。雖然我不是專家,但我認爲你所指的可能涉及UDP/TCP打孔這是一個兔子洞,我還沒有落下。根據我的經驗,唯一合理的解決方案是轉發服務器上的端口。 如果您弄清楚如何讓AIR應用程序在不干擾路由器的情況下進行操作,請告訴我!但據我所知,工作真的很複雜。 – 2018-02-01 17:17:01

相關問題