Java多客户端-服务器消息不显示



我要求客户端编写登录信息,服务器应该将其作为来自客户端的整个消息的第一个单词显示在屏幕上。问题是,当服务器接收到来自客户端的消息时,屏幕上没有显示任何内容。

public class Client {
public static void main(String[] args) throws IOException {
try {
Scanner scanner = new Scanner(System.in);
String ip = "127.0.0.1";
Socket socket = new Socket(ip,7010);
OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Write your login:");
String toSend;
String arr[];
while (true) {
toSend = scanner.nextLine();
arr = toSend.split(" ",2);
System.out.println(Arrays.toString(arr));
out.write("$login " + arr[0]);
out.flush();
}
} catch (IOException exception) {
exception.printStackTrace();
}
}
}

以上是客户代码

public class Server {
public static ArrayList<ClientHandler> clients = new ArrayList<>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(7010);
while (true) {
Socket socket = null;
try {
socket = serverSocket.accept();
System.out.println("A new client is connected");
OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Assigning new thread for this client");
ClientHandler client = new ClientHandler(socket,out,in);
client.start();
clients.add(client);
System.out.println("Hello");
} catch (IOException exception) {
socket.close();
exception.printStackTrace();
}
}
}
}
class ClientHandler extends Thread {
private Socket socekt;
private OutputStreamWriter out;
private BufferedReader in;
public ClientHandler(Socket socket, OutputStreamWriter out, BufferedReader in) {
this.socekt = socket;
this.out = out;
this.in = in;
}
@Override
public void run() {
String receivedName;
try {
receivedName = in.readLine();
System.out.println(receivedName);
} catch (IOException exception) {
exception.printStackTrace();
}
}
}

第二次编辑代码,服务器仍然没有打印登录

托盘,以保持客户端套接字和您的ClientHandler处于活动状态。将所有内容封装到System.out.println("编写登录名:"(进入while循环。还加上";\n〃;因为你在使用readline。接下来,在循环的末尾添加out.flush((,如下所示.

String toSend;
String arr[];
while (true) {
toSend = scanner.nextLine();
arr[] = toSend.split(" ", 2);
System.out.println(Arrays.toString(arr)); // debug
out.write("$login " + arr[0] +  + "n");
out.flush();
}

关于ClientHandler服务器,创建一个全局ArrayList并添加所有创建的客户端。像这样的

public class Server {
ArrayList<ClientHandler> clients = new ArrayList<>();

public void add(ClientHandler c) {
clients.add(c);
System.out.println("Server added client!");
}

public static void main(String[] args) throws IOException {
Server server = new Server();
ServerSocket serverSocket = new ServerSocket(7010);
Socket socket = null;
while (true) {
try {
socket = serverSocket.accept();
OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ClientHandler client = new ClientHandler(socket,out,in);
client.start();
server.add(client);
} catch (IOException exception) {
socket.close();
exception.printStackTrace();
}
}
}

并且在ClientHandler中移除公共静态ArrayList客户端ClientHandler.clients.add(receivedName(

关于输出,我个人喜欢使用OutputStreamWriter。我这样宣布;

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
clientSocket.setSoTimeout(30000); // some time out
OutputStreamWriter out = new OutputStreamWriter(clientSocket.getOutputStream());

最新更新