两个客户端与服务器java套接字通信和交换消息

时间:2015-03-06 13:30:49

标签: java sockets

很抱歉,如果它是一个重复的问题,但我找不到问题的答案。

我有两个客户A.java和B.java。服务器如何知道两个客户端中的哪一个在不使用Thread的情况下发送了消息?

服务器代码:

      try {

           ServerSocket ServerSocket=new ServerSocket(25000);
           System.out.println("Connect to the port 25000");

           while(true)
           {

               Socket socket=ServerSocket.accept();
               BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
               String str = br.readLine();//msg from client A or B
               System.out.println(str);

           }
       }

       catch (Exception e)
       {
           System.out.println("Error");
       }

客户端代码:(两个客户端在其类中具有相同的代码(ClientA.java或ClientB.java))

    try {
        Socket socket=new Socket("localhost",25000);

        DataOutputStream outToServer=new DataOutputStream(socket.getOutputStream());
        outToServer.writeBytes("Hello from ClientA" + '\n');(or Client B)

    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }

2 个答案:

答案 0 :(得分:1)

您至少有一个线程可以获取连接,一个线程可以接收消息。 另外,您的应用程序被阻止等待新连接,您不能做任何其他事情。 但是你不需要为每个客户提供一个线程。如果将套接字添加到每个连接客户端的列表中,则可以使用与此类似的代码遍历所有客户端:

for (int i = 0; i < sockets.size(); i++) {
    try {
        Socket socket = sockets.get(i);
        if (socket.getInputStream().available() > 0) {
            // TODO: read data from socket
        }
    } catch (Exception e) {
        // TODO: Handle the exception
    }
}

答案 1 :(得分:0)

您可以使用具有异步功能的NIO。

在服务器端:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(8888));
serverSocketChannel.configureBlocking(false);
for (;;) {
    SocketChannel socketChannel = serverSocketChannel.accept();
    if (socketChannel != null){
      //here you can use socketChannel
    }
}

在客户方面:

SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("localhost", 8888));
while(! socketChannel.finishConnect() ){
    //wait here to finish and do something
}