Java 套接字服务器-客户端 2 路聊天程序未获得预期结果



我是Java NIO的新手,我正在使用NIO2编写一个简单的服务器 - 客户端2路通信程序。服务器和客户端在本地运行。我无法得到我预期的结果,任何人都可以帮忙检查代码吗?多谢。

服务器端:

public class Server 
{
public static void main( String[] args )
{
try (AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open()) {
server.bind(new InetSocketAddress("127.0.0.1", 2001));
Future<AsynchronousSocketChannel> acceptCon = server.accept();
AsynchronousSocketChannel client = acceptCon.get(20, TimeUnit.SECONDS);
if ((client != null) && (client.isOpen())) {
Thread.sleep(50); // *** if I do not sleep 50 milsec here, I will get empty string
ByteBuffer buffer = ByteBuffer.allocate(1024);
Future<Integer> readval = client.read(buffer);
String msg = new String(buffer.array()).trim();
System.out.println("Received from client: " + msg);
readval.get();
buffer.flip();
String str = "I am fine! Thanks.";
Future<Integer> writeVal = client.write(ByteBuffer.wrap(str.getBytes()));
System.out.println("Writing back to client: " + str);
writeVal.get();
buffer.clear();
}
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Client 
{
public static void main( String[] args )
{
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
try (AsynchronousSocketChannel client = AsynchronousSocketChannel.open()) {
Future<Void> result = client.connect(new InetSocketAddress("127.0.0.1", 2001));
result.get();
String str = "Hello! How are you?";
ByteBuffer buffer = ByteBuffer.wrap(str.getBytes());
Future<Integer> writeval = client.write(buffer);
System.out.println("Writing to server: " + str);
writeval.get();
buffer.flip(); 

Thread.sleep(100); // If I do not sleep 100 milsec here, most of the time, I will get empty string for svrMsg
Future<Integer> readval = client.read(readBuffer);
String svrMsg = new String(readBuffer.array()).trim();
System.out.println("Received from server: " + svrMsg);
readval.get();
readBuffer.clear();
buffer.clear();
} catch (ExecutionException | IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
System.out.println("Disconnected from the server.");
}
}
}

我希望得到类似的东西: 服务器:

Received from client: Hello! How are you?
Writing back to client: I am fine! Thanks.

客户:

Writing to server: Hello! How are you?
Received from server: I am fine! Thanks.

但相反,我得到了:

Received from client: Hello! How are you? | (If do not use sleep, it is empty string here)
Writing back to client: I am fine! Thanks.

客户:

Writing to server: Hello! How are you?
Received from server: I am fine! Thanks.(If do not use sleep, empty string here)

我的问题是: 1. 我正在使用 Eclipse,当我通过断点调试服务器和客户端项目时,我得到了预期的结果。但是当我在客户端运行服务器和客户端时,如果我不使用 Thread.sleep(100(,它将显示"从服务器接收:"的空字符串,为什么? 2.对于服务器端,如果我不休眠50密秒,大多数时候,"从客户端接收:"的输出也将是空字符串,有什么提示吗?

非常感谢你们的帮助。

client.read(buffer);

是一个异步操作。对未来的get调用可确保操作成功完成。

ByteBuffer buffer = ByteBuffer.allocate(1024);
Future<Integer> readval = client.read(buffer);
readval.get();
String msg = new String(buffer.array()).trim();
System.out.println("Received from client: " + msg);

相关内容

最新更新