我想創建一個簡單的應用程序使用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連接。
謝謝!
我在這樣的工作,但你的意思是:「空氣能收集必要的地址和端口爲當前機器建立連接」?因爲當AIR應用連接到其他應用時,它不需要知道它是自己的機器地址! – akmozo 2015-03-05 01:17:27
嗨。客戶需要爲其他客戶分享自己的地址和端口。我可以通過HTTP服務器(PHP + SQLite)共享此信息。但是,如果客戶端位於路由器後面,則來自'NetworkInfo/findInterfaces()'的地址似乎不會公開IP地址,就像您在who.is上看到的那樣。那麼,如何在路由器後面連接兩臺機器? – Aaron 2015-03-05 03:04:39
我加了一點澄清。 – Aaron 2015-03-05 03:11:44