如何解决如何在客户端之间连续发送消息?
我有一个简单的客户端/服务器应用程序,该应用程序将2个客户端进行分组,并使它们彼此通信,如果连接了第三个客户端,它将无法与其他2个客户端通信,但是它将创建另一组2个客户端,并且依此类推...但是,当我从客户端发送消息时,并没有立即将其发送到其他客户端,而是等待第一个客户端输入,并且还等待第二个客户端输入,并且仅当两者都出现时,才会出现问题客户已输入输入,将其发送给彼此。任何帮助都非常有用。
服务器:
public class ChatServer {
Socket previousSocket = null;
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9001);
System.out.println("The chat server is running.");
Socket previousSocket = null;
while (true) {
Socket newSocket = serverSocket.accept();
/**
* if (previousSocket == null) occurs if only 1 client is connected and its being set as a previousSocket
* and we wait for a second client to connect so meanwhile nothing happens
*
* if second clients joins in we can start communicating in groups of 2
*/
if (previousSocket == null) {
previousSocket = newSocket;
} else {
new Handler(previousSocket,newSocket).start();
new Handler(newSocket,previousSocket).start();
previousSocket = null;
}
}
}
private static class Handler extends Thread {
private String name;
private Socket socket;
private Socket peerSocket;
private DataInputStream in;
private DataOutputStream out;
public Handler(Socket socket,Socket peerSocket) {
this.socket = socket;
this.peerSocket = peerSocket;
}
public void run() {
try {
while (true) {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(peerSocket.getOutputStream());
try {
String input = in.readUTF();
out.writeUTF(input);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
客户:
public class ChatClient {
public static void main(String[] args) throws UnknownHostException,IOException {
new ChatClient();
}
public ChatClient() throws UnknownHostException,IOException {
Socket socket = new Socket("127.0.0.1",9001);
System.out.println("You can start typing:");
while(true) {
Scanner scanner = new Scanner(System.in);
Thread input = new Thread() {
@Override
public void run() {
while(true) {
try {
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
while(scanner.hasNextLine()) {
String message = scanner.nextLine();
System.out.println(message);
//reading messages from server
String received = inputStream.readUTF();
System.out.println(received);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
input.start();
Thread output = new Thread() {
public void run() {
try {
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
while(scanner.hasNextLine()) {
String message = scanner.nextLine();
if(message.equalsIgnoreCase("quit")) {
socket.close();
break;
}
outputStream.writeUTF(message);
}
} catch (IOException e) {
e.printStackTrace();
}
};
};
output.start();
}
}
}
解决方法
在客户端中从服务器读取数据时,删除顶级Promise
循环并删除HttpClient
。
我已经在下面更新了您的客户代码,这应该可以正常工作。
while
,
您需要将客户端中的输入和输出流分成两个单独的线程。问题是您的客户端在读取输入之前正在等待扫描仪的输入。扫描程序是一个阻止调用,因此它需要自己的线程。
此外,您应该将循环中数据流的创建移至构造函数中……这将提高效率。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。