Java 访问NAT背后的免费糕点计划

Java 访问NAT背后的免费糕点计划,java,networking,p2p,Java,Networking,P2p,我正在尝试连接到我的程序,该程序在NAT后面使用免费糕点,但在哪里都找不到。mIP是我的公共IP,mBootport和mBindport是50001。我已经将路由器中的这些端口预装到我的计算机上,但它仍然无法工作。我禁用了防火墙,但什么都没有。我断开了路由器的连接,直接连接到互联网,但它仍然无法工作。唯一一次它在我的本地网络上工作。因此,在配置文件的代码中可能存在一些错误,但我看不出有什么错误 Environment env = new Environment();

我正在尝试连接到我的程序,该程序在NAT后面使用免费糕点,但在哪里都找不到。mIP是我的公共IP,mBootport和mBindport是50001。我已经将路由器中的这些端口预装到我的计算机上,但它仍然无法工作。我禁用了防火墙,但什么都没有。我断开了路由器的连接,直接连接到互联网,但它仍然无法工作。唯一一次它在我的本地网络上工作。因此,在配置文件的代码中可能存在一些错误,但我看不出有什么错误

        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