Java 访问NAT背后的免费糕点计划
我正在尝试连接到我的程序,该程序在NAT后面使用免费糕点,但在哪里都找不到。mIP是我的公共IP,mBootport和mBindport是50001。我已经将路由器中的这些端口预装到我的计算机上,但它仍然无法工作。我禁用了防火墙,但什么都没有。我断开了路由器的连接,直接连接到互联网,但它仍然无法工作。唯一一次它在我的本地网络上工作。因此,在配置文件的代码中可能存在一些错误,但我看不出有什么错误Java 访问NAT背后的免费糕点计划,java,networking,p2p,Java,Networking,P2p,我正在尝试连接到我的程序,该程序在NAT后面使用免费糕点,但在哪里都找不到。mIP是我的公共IP,mBootport和mBindport是50001。我已经将路由器中的这些端口预装到我的计算机上,但它仍然无法工作。我禁用了防火墙,但什么都没有。我断开了路由器的连接,直接连接到互联网,但它仍然无法工作。唯一一次它在我的本地网络上工作。因此,在配置文件的代码中可能存在一些错误,但我看不出有什么错误 Environment env = new Environment();
Environment env = new Environment();
InetSocketAddress bootaddress = new InetSocketAddress(mIP, mBootport);
NodeIdFactory nidFactory = new RandomNodeIdFactory(env);
PastryNodeFactory factory = new SocketPastryNodeFactory(nidFactory, mBindport, env);
for (int curNode = 0; curNode < mNumNodes; curNode++) {
PastryNode node = factory.newNode();
NetworkHandler app = new NetworkHandler(node, mLog);
apps.add(app);
node.boot(bootaddress);
synchronized(node) {
while(!node.isReady() && !node.joinFailed()) {
node.wait(500);
if (node.joinFailed()) {
throw new IOException("Could not join the FreePastry ring. Reason:"+node.joinFailedReason());
}
}
}
System.out.println("Finished creating new node: " + node);
mLog.append("Finished creating new node: " + node + "\n");
}
Iterator<NetworkHandler> i = apps.iterator();
NetworkHandler app = (NetworkHandler) i.next();
app.subscribe();
public class NetworkHandler implements ScribeClient, Application {
int seqNum = 0;
CancellableTask publishTask;
Scribe myScribe;
Topic myTopic;
JTextArea mLog;
protected Endpoint endpoint;
public NetworkHandler(Node node, JTextArea log) {
this.endpoint = node.buildEndpoint(this, "myinstance");
mLog = log;
myScribe = new ScribeImpl(node,"myScribeInstance");
myTopic = new Topic(new PastryIdFactory(node.getEnvironment()), "example topic");
System.out.println("myTopic = "+myTopic);
mLog.append("myTopic = "+myTopic + "\n");
endpoint.register();
}
public void subscribe() {
myScribe.subscribe(myTopic, this);
}
}
编辑:与wireshark确认消息确实到达计算机freepastry只是不接受连接。不确定“不工作”是什么意思。要测试客户端和服务器(位于NAT后面)之间的连接,您只需要在客户端执行类似“telnet mIP mBindport”的操作,假设您有一个telnet实用程序(Linux和Mac上的默认设置是,您可以在windows上安装一个,如nc(“netcat”)
如果端口转发设置正确,则在与服务器建立TCP连接时,您应该会看到如下内容
Connected to localhost.
Escape character is '^]'.
一旦TCP会话设置正确,您就可以停止“telnet”程序,并使用真正的客户机(java)与服务器对话,它应该可以正常工作
如果TCP会话未设置,您可能需要在服务器端进行检查。使用wireshark或tcpdump捕获带有过滤器“tcp端口50001”的数据包,并运行上面的telnet命令检查是否有tcp数据包进入
如果wireshark或tcpdump中没有显示任何内容,则表明防火墙(如portforwarding)设置不正确
如果TCP数据包确实出现在wireshark或tcpdump中,则您的服务器程序可能出现故障。使用命令(linux)检查绑定到的IP地址:
(在windows上,命令略有不同)
通常,它应该绑定到IP地址0.0.0.0(所有IP),如果没有,您应该检查它绑定到的IP是否具有到外部世界(NAT外部)的连接/路由
祝你好运。我会尝试将你的IP设置为本地,因为免费糕点正在运行。听起来好像电脑正在获取信息,但免费糕点正在另一个地址上寻找信息。如果您将mIP设置为本地,我认为它会起作用。如果它位于路由器/NAT后面,则会出现这种情况
端口转发将数据包从端口50001上的公共IP转发到您设置的任何端口(通常为相同的50001)上的内部计算机IP。如果您将程序设置为在公共IP上侦听,则它无法访问该程序,因此它不会接受任何数据包/消息。设置为在计算机IP或0.0.0.0/localhost上侦听,它应该接受该端口上的任何数据包/消息。在修改代码之前,请尝试查看两台计算机是否可以交换数据包,而不考虑这些数据包。可能使用Netcat()发送一些数据包。我知道这是一篇旧帖子,但是你收到的错误是什么?我无法启动引导节点。即使在我启动ring的第一个节点时,它也显示我已完成创建新节点PastryNode[SNH:/XXX MacBook Pro.local/10.0.0.7:10001]
Connected to localhost.
Escape character is '^]'.
netstat -antp | grep 50001