【发布时间】:2020-12-18 08:10:15
【问题描述】:
我有一个简单的客户端/服务器应用程序,它将 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();
}
}
}
【问题讨论】:
标签: java sockets networking tcp client-server