Java开发:为何我的ServerSocket无法接收Socket发送的消息?
问题原因及修复方案
核心问题:数据未及时发送到服务器
在Ship类的initialize方法中,你写完消息后先调用readLine()等待服务器响应,之后才执行flush(),导致缓冲区里的"initialize"消息根本没发送到服务器。服务器端的reader.readLine()会一直阻塞等待换行符,自然接收不到消息。
修复步骤:
- 调整flush()的位置:在写完消息并添加换行后,立即调用flush(),确保数据发送到服务器:
bufferedWriter.write("initialize"); bufferedWriter.newLine(); bufferedWriter.flush(); // 移到此处,先发送消息再等待响应
- 补充World类中缺失的initializeShip方法:服务器收到消息后需要返回响应,否则Ship端的
bufferedReader.readLine()会一直阻塞,导致后续代码无法执行。示例实现:
private String initializeShip(String cmd) { Random random = new Random(); return "SHIP_" + random.nextInt(1000) + " " + random.nextInt(20) + " " + random.nextInt(20); }
- 完善异常处理:World类的catch块为空,添加异常打印便于排查问题:
catch (IOException e) { e.printStackTrace(); }
- 补充Ship类中缺失的坐标计算方法:countRegionY和countRegionX方法需要实现,否则运行会报错,示例实现:
private int countRegionY(int y) { return y / 5; } private int countRegionX(int x) { return x / 5; }
修复后的关键代码片段
Ship类的initialize方法修改后:
public void initialize() { Thread threadShip = new Thread(new Runnable() { @Override public void run() { try { Socket socketToWorld = new Socket("127.0.0.1",2002); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socketToWorld.getOutputStream())); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socketToWorld.getInputStream())); bufferedWriter.write("initialize"); bufferedWriter.newLine(); bufferedWriter.flush(); // 立即发送消息 String str = bufferedReader.readLine(); String[] array = str.split(" "); id = array[0]; y = Integer.parseInt(array[1]); x = Integer.parseInt(array[2]); frameConsole.getPanelConsole().getArrayOfPanelsMain()[countRegionY(y)][countRegionX(x)].getPanels()[y%5][x%5].setShape(1); frameConsole.getPanelConsole().getArrayOfPanelsMain()[countRegionY(y)][countRegionX(x)].getPanels()[y%5][x%5].repaint(); bufferedWriter.close(); bufferedReader.close(); socketToWorld.close(); } catch (IOException e) { e.printStackTrace(); } } }); threadShip.start(); }
World类补充initializeShip方法后:
public class World { ServerSocket serverSocket; Thread threadServer; Random random = new Random(); // ... 原有代码不变 ... private String initializeShip(String cmd) { return "SHIP_" + random.nextInt(1000) + " " + random.nextInt(20) + " " + random.nextInt(20); } }
修改后,服务器就能正常接收"initialize"消息,并且返回响应,Ship端也能完成后续逻辑处理。
内容的提问来源于stack exchange,提问作者banana13
相关产品推荐
相关产品推荐

