【问题标题】:Java Server - Sending packets out incorrectly?Java Server - 错误地发送数据包?
【发布时间】:2021-04-17 10:12:38
【问题描述】:

目前有一个用 Java 构建的 TCP 服务器,我正在使用其套接字的 OutputStream 向客户端发送消息/数据包:

// Send all player's information to everyone else
outerPlayerIter = players.iterator();
while(outerPlayerIter.hasNext()) {
    Player outerPlayer = outerPlayerIter.next();
       
    Iterator<Player> innerPlayerIter = players.iterator();
    while(innerPlayerIter.hasNext()) {
        Player innerPlayer = innerPlayerIter.next();
        boolean isYou = false;
        if(innerPlayer.equals(outerPlayer)) isYou = true;
        // Send innerPlayer's info to outerPlayer
        Thread.sleep(100);
        dataBuffer.clearBuffer();
        dataBuffer.writeByte(Msgs.mm_toclient.MES_SENDPLAYERINFO);
        dataBuffer.writeBool(isYou);
        dataBuffer.writeBool(innerPlayer.getIsHost());
        dataBuffer.writeString(innerPlayer.getName());
        dataBuffer.writeString(innerPlayer.getPublicIP().getHostAddress());
        dataBuffer.writeShort((short)innerPlayer.getUdpPort());
        outerPlayer.getSocket().getOutputStream().write(dataBuffer.getByteArray());
        outerPlayer.getSocket().getOutputStream().flush();
    }
   
}

但是,有时客户端似乎并未收到所有消息。我无法通过一个套接字同时发送多条消息。

临时解决此问题的一种方法是在我发送另一个数据包之前睡觉。但我不确定为什么需要这样做。

关于我如何发送/写入要发送的数据包,我是否做错了什么?什么可以修复以允许在不休眠的情况下一次正确接收多个数据包?

【问题讨论】:

    标签: java tcp packet outputstream


    【解决方案1】:

    这可能是由于客户端在通信实际完成之前关闭套接字的速度太快了。您能否尝试提高 thread.sleep 值,或者在客户端,如果您使用任何类型的时间,也尝试提高那个值。

    【讨论】:

    • 我发现我的 TCP 客户端 (GameMaker) 有时会在每个异步网络事件中读取多条消息。我从 Java 服务器发送的每个“消息”都是 256 个字节。如果我在每条消息写入输出流之间休眠大量时间,GameMaker 每个事件只会看到 256 个字节。如果我不睡觉,有时它会在一个事件中一次收到多条消息(例如 512 字节而不是 256 字节)。我不知道这是 GameMaker 的错还是 Java 的错。我宁愿一次处理一条消息,而不是解析。有没有办法做到这一点或说出是什么原因造成的?
    • 好吧,看来 GameMaker 出了问题,在一个事件中连接了多个数据包。我必须手动解析消息并确定新消息/数据包在读取缓冲区时从哪里开始。
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多