2011-03-25 72 views
3

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

我知道一个可以作为服务器运行,一个可以作为客户端运行,但它们都可以作为客户端吗?两个客户端都不在路由器或防火墙之后,每个客户端都有一个唯一的IP。我正在使用Java,所以我想在两个客户端上使用两个Socket实例,而不是一个ServerSocket,另一个是Socket。

回答

1

有人需要监听某处的连接。一个标准的Socket连接连接到一个主机和监听端口(ServerSocket用于标准Java套接字)。默认情况下,ServerSocket会阻塞,等待传入连接。

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

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

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

1

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

理念,你为什么不集成在两个客户端小HTTP服务器,让你知道你能坚持到HTTP协议(即:Jetty

0

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

0

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

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

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

1

您可以创建一个ServerSocket,接受一个连接。与只创建一个套接字相比,这增加了一行代码,所以它没有太多的代码开销。

在服务器端

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

Socket s = ss.accept(); 

既然你只需要一个连接客户端

Socket s = new Socket(hostname, port); 

,它可能没有任何更复杂,这。

0

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

TCP是一种面向连接的协议,因此参与者必须在其他人监听连接时启动连接。