使用AS3 ServerSocket和Socket连接两个客户端

时间:2015-03-03 05:48:25

标签: actionscript-3 sockets tcp air

我尝试使用AIR创建一个简单的应用程序,它使用套接字将两个客户端相互连接。

我知道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();
    }
}

客户端类:

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()要解决&#34; localhost&#34;上述内容适用于单台计算机。

我有点迷失的是如何在两台连接到互联网的机器之间建立实际连接,但不在同一网络上。由于两台机器(可能)都在路由器后面,我认为我需要路由器的IP地址,并且路由器必须知道将我的应用程序所需的端口(上面的8888)转发到正在运行的机器上ServerSocket?可以从AIR建立此端口转发吗? AIR可以收集当前机器建立连接所需的地址和端口吗?

换句话说,如果一台机器没有直接连接到互联网(它在路由器后面),并且因此没有公共IP地址,另一台机器如何连接到它?显然,这可以通过机器所连接的路由器的必要公共IP地址和路由器[端口?]转发到机器来完成,但是我不清楚如何从AIR设置它甚至它可能在AIR。

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

我可以使用公共域上的Apache服务器在客户端之间共享地址信息,但我希望让客户端建立直接的p2p连接。

谢谢!

1 个答案:

答案 0 :(得分:0)

我知道这个问题是2岁,但对于那些将来会对此感到头疼的人:

我只是让你的代码在我的最后工作;你需要在服务器的计算机上向前移动。基本上,让路由器将任何传入的8888 TCP流量指向运行服务器的计算机(将其指向计算机的8888端口)。

客户端不需要对其进行端口转发,因为当服务器回复时,客户端的路由器将其视为&#34;响应&#34;并允许数据包通过。

除此之外,只需将客户端连接到服务器(路由器的)公共IP,您可以通过here找到它。