很抱歉,如果它是一个重复的问题,但我找不到问题的答案。
我有两个客户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.
}
答案 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
}