我在这里创建了一个客户端/服务器教程,
http://old.haxe.org/doc/neko/client_server,
但是这个例子只适用于本地主机的实用性非常有限的情况。我希望有人可以解释如何将其扩展到连接到远程主机的情况。具体来说,如果有人知道如何修改此示例,以便我可以在家中从笔记本电脑运行服务器代码并让朋友(谁知道我的家庭IP)运行客户端。
客户代码:
// file Client.hx
class Client {
static function main() {
var s = new sys.net.Socket();
s.connect(new sys.net.Host("localhost"),5000);
while( true ) {
var l = s.input.readLine();
trace(l);
if( l == "exit" ) {
s.close();
break;
}
}
}
}
服务器代码:
// file Server.hx
class Server {
static function main() {
var s = new sys.net.Socket();
s.bind(new sys.net.Host("localhost"),5000);
s.listen(1);
trace("Starting server...");
while( true ) {
var c : sys.net.Socket = s.accept();
trace("Client connected...");
c.write("hello\n");
c.write("your IP is "+c.peer().host.toString()+"\n");
c.write("exit");
c.close();
}
}
}
作为免责声明,我对通信协议知之甚少,所以如果问题很愚蠢我会道歉。
编辑:
如果我更换"本地主机"用我的本地IP地址" 192.168.1.254"这仍然有效,但如果我更换" localhost"使用我的公共IP地址" 206.XXX.XXX.XXX,"客户端没有连接(这是我尝试的第一件事)。
我已经为该端口上的传入和传出流量禁用了防火墙,但它似乎没有什么区别。为什么我的客户端实例只能在本地连接到服务器实例?我会改变客户端代码以使用计算机的公共IP地址通过路由器路由请求。
编辑:
事实证明它实际上与公共IP地址一起工作,但无论出于何种原因它无法从我的本地网络连接到路由器的公共IP(我仍然不明白为什么这是一个问题 - 也许是一些奇怪的路由器特定NAT问题)。使用此实用程序:
http://www.yougetsignal.com/tools/open-ports/
我能够验证相关端口是否已打开并连接到我的服务器程序。
答案 0 :(得分:3)
在客户端下面的代码中,将“localhost”替换为您的IP地址:
s.connect(new sys.net.Host("localhost"),5000);
http://api.haxe.org/sys/net/Host.html
创建新主机:名称可以是“127.0.0.1”形式的IP或主机名,例如“google.com”,在这种情况下,使用DNS解析相应的IP地址。如果找不到主机名,则会发生异常。
答案 1 :(得分:0)
这实际上取决于您的家庭设置。一般来说,只需在你的家庭ip上打开一些东西就有安全风险,所以这需要你自担风险。
您很可能会从isp获得动态IP地址。这意味着每次连接到您的isp时,您的公共IP可能会有所不同。它常见的是使用第三方服务来解决这类问题。许多路由器都内置了与这些提供程序集成的功能,但也可以安装本机应用程序。有许多服务是免费的,有些服务取决于你想要什么和你信任谁,例如http://www.noip.com/,http://dyn.com/dns/。这些服务将有入门指南。
当它工作时,您可以将客户端代码从localhost
更改为公共IP地址和端口,您可以设置动态DNS服务以进行公开。