2015-03-03 143 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

相关问题