通过socket进行通信:一个服务器和两个客户端

时间:2012-01-12 23:41:01

标签: java

我有三个实体:A,B和C.A是服务器,B和C是客户端。 A是使用java.net

中的类实现的多线程服务器

我会实现一种通信,其中B向A发送消息,A向C发送消息,C发送消息B.我的问题是:客户端C必须是服务器,或者必须只是客户端转发消息?

public class ServerA{

public static void main(String[] args){

    boolean listening = true;
    int port_number = 8888;

    try{

        ServerSocket ss = new ServerSocket(port_number);

        System.out.println("Waiting for incoming connection...");

        while(listening){

            new Thread(new ServerThread(ss.accept())).start();

        }

    }
    catch(IOException ioe){ioe.printStackTrace();}
}
}

public class ServerThread implements Runnable{

    @Override
    public void run(){

    }

}

1 个答案:

答案 0 :(得分:1)

您是否有任何特殊原因可以像这样设计您的架构?

回答你的问题:让我们思考一下。从客户端C向客户端B发送消息需要什么?你想怎么实现它?您在评论中提到了一个频道 - 但您在两个客户端之间打开“频道”的确需要什么?你需要知道它(客户端B)的位置和端口客户端B正在监听消息(最坏的情况是每个客户端知道所有/其他客户端,更好的方法是查询主服务器以获取其他客户端列表/与所有客户有一些注册表)。此外,显然,客户端B需要打开一个端口并等待消息。

因此,基本上客户端C查询服务器A的某些内容,获取响应,然后(通过套接字)向客户端B发送消息,客户端B必须正在监听(就像客户端A一样)。这基本上就是服务器客户端所做的事情。

如果您知道它将在LAN或类似的东西中,那么您可以考虑使用UDP而不是TCP,但是您需要自己管理更多的东西,因为它不那么可靠。

这种架构让我想起了更多的点对点网络(其中所有“客户端”更像是客户端+服务器组合),单个服务器可以从某个地方获取数据/进行一些计算。