连接两个客户端使用AS3 ServerSocket和套接字
我想创建一个简单的应用程序使用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连接。
谢谢!
我知道这个问题的2岁的,但对于那些令人摸不着头脑关于它的未来:
我刚收到你的代码,在我结束工作;您需要在服务器的计算机上向前端口。基本上,让您的路由器将任何传入的8888 TCP流量指向运行服务器的计算机(指向计算机的8888端口)。
客户端不需要进行端口转发,因为当服务器回应时,客户端的路由器将其视为“响应”并允许数据包通过。
除此之外,只需将客户端连接到服务器(路由器)的公共IP,您可以通过here找到该IP。
从过去爆炸。 :)你是如何设置服务器端口转发的?手动配置您的路由器,还是通过AIR应用本身?问题是许多P2P应用程序并不要求你惹恼你的路由器,我从来没有想过如何设法做到这一点,如果你可以从AIR应用程序做同样的事情。 – Aaron 2018-01-26 17:12:41
@Aaron我不得不在路由器上设置它。虽然我不是专家,但我认为你所指的可能涉及UDP/TCP打孔这是一个兔子洞,我还没有落下。根据我的经验,唯一合理的解决方案是转发服务器上的端口。 如果您弄清楚如何让AIR应用程序在不干扰路由器的情况下进行操作,请告诉我!但据我所知,工作真的很复杂。 – 2018-02-01 17:17:01
我在这样的工作,但你的意思是:“空气能收集必要的地址和端口为当前机器建立连接”?因为当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