我是学习Java Networking的初学者。我想连接3台或更多台计算机。一个用于服务器,另一个用于客户端(例如A和B)。但我想连接
首先,我想从A或B向服务器发送消息,服务器将存储的数据发送给发送方(例如A),发送方(A)将连接到B.然后A和B将确认消息,A和B将发送数据彼此相对。但是这种情况可以同时发生在A和B.
但我刚学会使用服务器套接字和套接字连接一个服务器和一个客户端的简单代码。所有3台计算机是否都需要为服务器和客户端服务?是否有其他方法来连接客户端。我不知道如何考虑解决计算机之间的数据冲突。如果添加新客户端,我也想满足。如果有人知道解决上述问题,包括数据冲突,请帮助我为服务器和客户端提供简单的示例代码。
答案 0 :(得分:1)
您可以使用套接字。我知道你已经这样做了,但我认为你必须这样做。
服务器强>
ServerSocket server = new ServerSocket(2009); // 2009 is the networkport
while (acceptingClients)
{
Socket socket = server.accept();
ClientHandler handler = new ClientHandler(socket); // ClientHandler, you have to make by yourself
Thread thread = new Thread(handler, "Handler");
/* Use a thread, so you can connect more clients at the same
* time. Of course ClientHandler must implement java.lang.Runnable
*/
thread.start();
}
<强>客户端强>
Socket socket = new Socket(host, 2009); // host is a String with ipadress from the server. Use the same port
此代码必须是试用的。对于通信,您可以使用许多类型的编写者和读者。 在读者和作者中,您必须通过构造添加流参数。这些可以通过调用
来获取socket.getOutputStream();
socket.getInputStream();
请勿关闭编写器,否则连接将关闭。 flush()
可以通过解决方案。
希望这有帮助
答案 1 :(得分:1)
听起来您正在寻找某种类型的群组通信。这可以使用IP多播来完成,而非常方便的Java库是JGroups(增加了可靠性和组成员资格)。如果您不介意抽象IP,您可能需要查看Java Messaging Service,这是许多消息传递实现的标准接口,它为您提供发布 - 订阅和队列类型通信的可靠性和事务。
答案 2 :(得分:0)
期望接收传入呼叫的进程必须作为服务器进行侦听;进行拨出呼叫的进程是用于此目的的客户端。
您可以解决客户端计算机(A,B)在防火墙后面的问题,这会阻止他们通过让每个客户端每隔一段时间轮询服务器以询问是否有任何数据来进行直接连接。这样,当A有B的数据时,它会向服务器发出下一次B连接请求让它知道的请求。
然后等待连接打开,直到B轮询,&amp;被告知存在数据,然后服务器告诉A B已准备好,并且可以充当代理,直到一个或另一个断开连接。