【问题标题】:Java TCP Connection Socket not writing to output streamJava TCP连接套接字未写入输出流
【发布时间】:2018-04-02 07:46:01
【问题描述】:

我正在为我用 java 编码的游戏编写服务器。由于某种原因,输出流实际上不会将信息发送回客户端。我已经尝试了一切,但是关闭套接字最终会导致程序出错,因为套接字在写入输出流之前就关闭了。我不知道为什么。

编辑:我在gist 中放了很多代码。另外,为了澄清起见,即使我没有关闭套接字,响应也根本没有发送。客户只是在等待答复,却没有收到答复。

这是我的代码。

public class ServerThread extends Thread {

private Socket clientSocket;
private List<Player> players;
public Player player = null;

public ServerThread (Socket clientSocket, List<Player> players)
{
    this.clientSocket = clientSocket;
    this.players = players;
}

public void run()
{
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        DataOutputStream os = new DataOutputStream(clientSocket.getOutputStream());

        String req = br.readLine();
        br.close();
        String response = buildResponse(req);

        os.writeBytes(response);
        os.flush();
        System.out.println("Sending [ " + response + " ] to " + clientSocket.getInetAddress().getHostAddress());

        player = addPlayerFromRequest(req);
    } catch (IOException ex) {
        Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
    } 

    try {
        clientSocket.close();
    } catch (IOException ex) {
        Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public String buildResponse(String req)
{
    List<Player> plays;
    plays = players;

    String name = req.split(",")[0];

    String response = "";

    if (plays.size() <= 1) {
        return response;
    }

    for (int i = 0; i < plays.size(); i++) {
        Player p = plays.get(i);
        if (!p.name.equals(name)) {
            response += p.name + "," + p.x + "," + p.y + "," + p.z + "," + p.rx + "," + p.rx + "," + p.rz + ";";
        }
    }
    return response;
}

public Player addPlayerFromRequest (String req)
{
    String[] list = req.split(",");
    String user = list[0];
    float x = Float.parseFloat(list[1]);
    float y = Float.parseFloat(list[2]);
    float z = Float.parseFloat(list[3]);
    float rx = Float.parseFloat(list[4]);
    float ry = Float.parseFloat(list[5]);
    float rz = Float.parseFloat(list[6]);

    return new Player(x, y, z, rx, ry, rz, user);
}
}

【问题讨论】:

  • 在缺少类的情况下很难重现这一点。您可以编辑问题并删除/添加您未在此处包含的参考/类吗?
  • “实际上不会发送”不是问题描述。在发送响应之前,您不应关闭缓冲的阅读器。
  • 我刚刚尝试了您的代码,并且只构建了一个自定义客户端和一个空的 Player-class。它工作得很好。您如何将数据客户端发送到您的服务器?
  • @eli 不知道你是怎么做到的。它应该将SocketException: socket closed 抛出os.writeBytes(response)
  • 当然,我移动了近距离通话。编辑:不,我没有……奇怪。但它确实正确地从客户端读取了一行。但是没有发送响应(之前没有检查过)。

标签: java tcp


【解决方案1】:

由于br.close(),此代码将抛出SocketException: Socket closed,但假设您已将其删除,我建议您的客户端正在读取行但您没有发送行。在消息中添加行终止符,或使用BufferedWriter.newLine()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2010-11-23
    • 2013-05-25
    • 2011-03-29
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多