Java Socket聊天应用逻辑异常:连接后无法显示用户名与消息
Java Socket聊天应用无法显示用户名及消息的修复方案
以下是针对代码中导致无法显示用户名和消息问题的具体修复:
1. 当前客户端无法接收任何消息
你的ClientHandler.broadCastMessage方法通过判断排除了当前客户端,导致该用户看不到自己的加入通知和发送的消息。修改后让所有客户端(包括自身)都能收到广播:
public void broadCastMessage(String messageToSend){ for(ClientHandler clientHandler : clientHandlers){ try{ clientHandler.bufferedWriter.write(messageToSend); clientHandler.bufferedWriter.newLine(); clientHandler.bufferedWriter.flush(); } catch(IOException e){ closeEverything(socket, bufferedReader, bufferedWriter); } } }
2. 消息打印无换行导致视觉上“未显示”
Client.listenToMessage中使用System.out.print没有换行,消息会堆叠在一起无法正常显示。替换为println:
public void listenToMessage(){ new Thread(new Runnable(){ public void run(){ String messageFromGroupChat; try { while(socket.isConnected()){ messageFromGroupChat = bufferedReader.readLine(); System.out.println(messageFromGroupChat); } } catch (Exception e) { closeEverything(socket, bufferedReader, bufferedWriter); } } }).start(); }
3. 输入消息被空格截断
Client.sendMessage使用sc.next()只能读取空格前的内容,导致带空格的消息被截断。改为sc.nextLine()读取整行输入:
public void sendMessage(){ try{ bufferedWriter.write(userName); bufferedWriter.newLine(); bufferedWriter.flush(); Scanner sc = new Scanner(System.in); while(socket.isConnected()){ String messageToSend = sc.nextLine(); bufferedWriter.write(userName + ": " + messageToSend); bufferedWriter.newLine(); bufferedWriter.flush(); } } catch(IOException e){ closeEverything(socket, bufferedReader, bufferedWriter); } }
4. 重复移除客户端引发异常
ClientHandler.closeEverything中重复调用removeClientHandler,而run方法的finally块已经执行了该操作,删除重复调用避免异常:
public void closeEverything(Socket socket, BufferedReader bufferedReader, BufferedWriter bufferedWriter ){ try{ if(bufferedReader != null){ bufferedReader.close(); } if(bufferedWriter != null){ bufferedWriter.close(); } if(socket != null){ socket.close(); } } catch(IOException e){ e.printStackTrace(); } }
5. 服务器异常无日志无法排查
Server.startServer捕获异常后没有任何处理,添加异常打印便于排查服务器启动或连接问题:
public void startServer(){ try{ while (!serverSocket.isClosed()) { Socket socket = serverSocket.accept(); System.out.println("A new client has connected"); ClientHandler clientHandler= new ClientHandler(socket); Thread thread = new Thread(clientHandler); thread.start(); System.out.println("Thread started"); } } catch(IOException e){ e.printStackTrace(); closeServerSocket(); } }
内容的提问来源于stack exchange,提问作者Bernard Kingsley
相关产品推荐
相关产品推荐

