【问题标题】: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 是一种面向连接的协议,因此其中一个参与者必须发起连接,而其他人则必须侦听连接。