我尝试使用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连接。
谢谢!
答案 0 :(得分:0)
我知道这个问题是2岁,但对于那些将来会对此感到头疼的人:
我只是让你的代码在我的最后工作;你需要在服务器的计算机上向前移动。基本上,让路由器将任何传入的8888 TCP流量指向运行服务器的计算机(将其指向计算机的8888端口)。
客户端不需要对其进行端口转发,因为当服务器回复时,客户端的路由器将其视为&#34;响应&#34;并允许数据包通过。
除此之外,只需将客户端连接到服务器(路由器的)公共IP,您可以通过here找到它。