连接网络中的两个客户端

时间:2011-03-25 14:59:59

标签: java sockets networking network-programming

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

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

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

6 个答案:

答案 0 :(得分:2)

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

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

您也可以查看广播,但是,该解决方案也存在复杂性。

还有一个想法:根据您的要求,您可以随时考虑利用JXTA等P2P框架。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

在客户端

Socket s = new Socket(hostname, port);

在服务器端

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

Socket s = ss.accept();

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

与套接字API建立连接的唯一方法是让一方监听连接,接受连接,并让另一方连接到它。

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

答案 5 :(得分:0)

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

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