java - DataOutputStream-总是写入服务器?

标签 java networking

对于简单的 2D 游戏,我需要我的客户端程序始终将坐标发送到服务器。

因此,我创建了一个测试,看看是否可以通过从服务器发送和检索值来使两个玩家具有相同的速度。

package main;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class DataSender implements Runnable{

    private DataInputStream fromServer;
    private DataOutputStream toServer; 

    Player player;
    Player opponent;

    public DataSender(DataInputStream fromServer, DataOutputStream toServer, Player player, Player opponent){

        this.fromServer = fromServer;
        this.toServer = toServer; 

        this.player = player;
        this.opponent = opponent;   
    }

    @Override
    public void run() {

        while(true){

                try {
                    toServer.writeInt(player.velX);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                try {
                    opponent.velX = fromServer.readInt();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }   
    }
}

while(true) 循环仅在线程创建时执行一次。如何建立持续的数据流?

最佳答案

您的 readInt 函数可能正在阻塞。如果服务器没有回复客户端对手的位置,则循环将停止,直到从服务器接收到 4 个字节。

或者,它可能是 writeInt 调用。请务必禁用 Nagle's算法。发送如此少量的数据会导致过度的延迟。在Java中,它被称为TCP_NODELAY 。这也可能是代码的问题,您正在写入的字节没有被发送,因为没有足够的数据被写入来导致传输。

如果您完全愿意接受这里的建议,那么最好使用 UDP。 UDP 通常用于游戏编程,因为涉及的数据是实时的,并且仅在短时间内有用。 TCP 会减慢速度,因为您可能正在确认数据包,或者等待接收您不再关心的数据包,因为它们太旧了。 UDP 使您能够对此进行控制。

此外,网络代码中通常有一个用于发送的线程和一个用于接收的线程。我建议您创建 2 个线程,这样就不会出现此类问题。

关于java - DataOutputStream-总是写入服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18179086/

相关文章:

java - 如何使用 Java 和 Selenium 为我的驱动程序传递 headless 选项?

Java-应用程序背后的屏幕捕获

c++ - 如何使用 C++ 判断工作站当前是否连接到域 Controller

android - 如何在我的 Windows 桌面上运行 localhost 的移动设备上运行我的 Angular 站点

c - 为什么 inet_ntop() 和 inet_ntoa() 给出不同的结果?

java - 让 KeyListener 监听不同的 JFrame

java - 当人脸位于所需帧中时,如何实时启动 ML Kit 人脸检测

java - BufferedWriter 类型中的方法 write(int) 不适用于参数 (Long)

Java SE 7 URL 超时在 Java SE 6 中有效吗?

mysql - 从我的应用程序连接到远程 mysql 服务器。问题是Mysql服务器在局域网上