对于简单的 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/