【问题标题】:Connecting two clients in a network连接网络中的两个客户端
【发布时间】:2011-03-25 14:59:59
【问题描述】:

如果我有两个相互了解的客户端(即,它们知道要使用的端口和各自的主机名),它们可以使用套接字相互连接吗?

我知道一个可以作为服务器运行,一个可以作为客户端运行,但是它们都可以是客户端吗?两个客户端都不在路由器或防火墙后面,并且每个客户端都有一个唯一的 IP。

我也在使用 Java,所以我正在考虑在两个客户端上使用两个 Socket 实例,而不是在一个客户端上使用一个 ServerSocket,在另一个客户端上使用一个 Socket。

【问题讨论】:

    标签: java sockets networking network-programming


    【解决方案1】:

    有人需要在某处监听连接。标准 Socket 连接连接到主机和端口,在该主机和端口上存在活动侦听器(标准 Java 套接字的 ServerSocket)。默认情况下,ServerSocket 会阻塞,等待传入的连接。

    如果您在两个客户端上都添加一个 ServerSocket 连接,您可能希望有一个线程监听连接,而另一个线程尝试建立传出连接。有一些替代方案,例如使用 NIO,它允许您检查传入和传出连接而不会阻塞整个应用程序。

    您也可以研究广播,但是该解决方案也很复杂。

    再想一想:根据您的要求,您始终可以考虑利用 P2P 框架,例如 JXTA。

    【讨论】:

      【解决方案2】:

      不,他们只能通过至少在一侧初始化server socket 来做到这一点。在其中一个客户端建立连接后,您可以实现一个协议以从双方进行写入/读取。 这是“等待”连接的机制,如果服务器套接字没有先初始化,客户端套接字将无法接收连接。

      想法,你为什么不在两个客户端中集成一个小型 HTTP 服务器,这样你就知道你可以坚持使用 HTTP 协议(​​即:Jetty

      【讨论】:

        【解决方案3】:

        你可以创建一个ServerSocket,接受一个连接。与仅创建套接字相比,这增加了一行代码,因此代码开销不大。

        在客户端

        Socket s = new Socket(hostname, port);
        

        在服务器端

        ServerSocket ss = new ServerSocket(port); // can be reused.
        
        Socket s = ss.accept();
        

        由于您只需要一个连接,因此可能不会比这更复杂。

        【讨论】:

          【解决方案4】:

          不,您需要一个 ServerSocket 来监听端口并接受连接。

          【讨论】:

            【解决方案5】:

            简单地说 - 答案是否定的,您不能将两端都用作客户端。没有命令 让两个套接字相互连接。

            使用套接字 API 创建连接的唯一方法是一侧侦听并接受连接,另一侧连接到它。

            这种情况通常的解决方案是任意决定一端是服务器,另一端是客户端。 你在服务器端监听,在客户端连接。

            【讨论】:

              【解决方案6】:

              如果不关心消息的可靠传递,您可以使用无连接 UDP 协议而不是 TCP。

              TCP 是一种面向连接的协议,因此其中一个参与者必须发起连接,而其他人则必须侦听连接。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-02-17
                • 2011-12-26
                • 1970-01-01
                • 2019-05-29
                • 2012-01-18
                • 1970-01-01
                相关资源
                最近更新 更多