Java 如何在客户端之间连续发送消息?

Java 如何在客户端之间连续发送消息?,java,sockets,networking,tcp,client-server,Java,Sockets,Networking,Tcp,Client Server,我有一个简单的客户机/服务器应用程序,它将2个客户机分组,使它们相互通信,如果第三个客户机连接,它将无法与其他2个客户机通信,但它将创建另一组2个客户机,以此类推。。。但是,当我从一个客户机发送消息时,问题就出现了,它不会立即将消息发送给另一个客户机,而是等待第一个客户机输入,同时也等待第二个客户机输入,只有当两个客户机都输入了输入时,它才会将它们发送给彼此。任何帮助都是非常感激的 服务器: 公共类聊天服务器{ Socket-previousSocket=null; 公共静态void main(

我有一个简单的客户机/服务器应用程序,它将2个客户机分组,使它们相互通信,如果第三个客户机连接,它将无法与其他2个客户机通信,但它将创建另一组2个客户机,以此类推。。。但是,当我从一个客户机发送消息时,问题就出现了,它不会立即将消息发送给另一个客户机,而是等待第一个客户机输入,同时也等待第二个客户机输入,只有当两个客户机都输入了输入时,它才会将它们发送给彼此。任何帮助都是非常感激的

服务器:

公共类聊天服务器{
Socket-previousSocket=null;
公共静态void main(字符串[]args)引发异常{
ServerSocket ServerSocket=新的ServerSocket(9001);
System.out.println(“聊天服务器正在运行”);
Socket-previousSocket=null;
while(true){
Socket newSocket=serverSocket.accept();
/**
*如果仅连接了1个客户端并将其设置为previousSocket,则会发生if(previousSocket==null)
*我们等待第二个客户端连接,所以同时什么也没发生
* 
*如果第二个客户端加入,我们可以开始2人一组的通信
*/
如果(previousSocket==null){
previousSocket=newSocket;
}否则{
新处理程序(previousSocket,newSocket).start();
新处理程序(newSocket,previousSocket).start();
previousSocket=null;
}
}
}
私有静态类处理程序扩展线程{
私有字符串名称;
专用插座;
专用插座;
私有数据输入流;
私有数据输出流输出;
公共处理程序(套接字、套接字对等套接字){
this.socket=socket;
this.peerSocket=peerSocket;
}
公开募捐{
试一试{
while(true){
in=新的DataInputStream(socket.getInputStream());
out=新的DataOutputStream(peerSocket.getOutputStream());
试一试{
字符串输入=in.readUTF();
out.writeUTF(输入);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
}
客户:

公共类聊天客户端{
公共静态void main(字符串[]args)抛出UnknownHostException、IOException{
新建聊天客户端();
}
public ChatClient()引发UnknownHostException,IOException{
插座=新插座(“127.0.0.1”,9001);
System.out.println(“您可以开始键入:”);
while(true){
扫描仪=新的扫描仪(System.in);
线程输入=新线程(){
@凌驾
公开募捐{
while(true){
试一试{
DataInputStream inputStream=新的DataInputStream(socket.getInputStream());
while(scanner.hasNextLine()){
字符串消息=scanner.nextLine();
System.out.println(消息);
//从服务器读取消息
接收到的字符串=inputStream.readUTF();
系统输出打印项次(已接收);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
};
input.start();
线程输出=新线程(){
公开募捐{
试一试{
DataOutputStream outputStream=新的DataOutputStream(socket.getOutputStream());
while(scanner.hasNextLine()){
字符串消息=scanner.nextLine();
if(message.equalsIgnoreCase(“退出”)){
socket.close();
打破
}
outputStream.writeUTF(消息);
}
}捕获(IOE异常){
e、 printStackTrace();
}
};
};
output.start();
}
}
}

您需要将客户端中的输入和输出流分离为两个单独的线程。问题是,在读取输入之前,客户端正在等待扫描仪的输入。Scanner是一个阻塞调用,所以它需要自己的线程


此外,您应该将循环中数据流的创建转移到构造函数中……这将提高您的效率。

您需要将客户端中的输入和输出流分离到两个单独的线程中。问题是,在读取输入之前,客户端正在等待扫描仪的输入。Scanner是一个阻塞调用,所以它需要自己的线程

此外,还应移动