You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java开发:为何我的ServerSocket无法接收Socket发送的消息?

问题原因及修复方案

核心问题:数据未及时发送到服务器

在Ship类的initialize方法中,你写完消息后先调用readLine()等待服务器响应,之后才执行flush(),导致缓冲区里的"initialize"消息根本没发送到服务器。服务器端的reader.readLine()会一直阻塞等待换行符,自然接收不到消息。

修复步骤:

  1. 调整flush()的位置:在写完消息并添加换行后,立即调用flush(),确保数据发送到服务器:
bufferedWriter.write("initialize");
bufferedWriter.newLine();
bufferedWriter.flush(); // 移到此处,先发送消息再等待响应
  1. 补充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);
}
  1. 完善异常处理:World类的catch块为空,添加异常打印便于排查问题:
catch (IOException e) {
    e.printStackTrace();
}
  1. 补充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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:10:50