1

对于简单的 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)线程创建时执行一次。如何建立恒定的数据流?

4

2 回答 2

0

您的readInt功能可能是阻塞的。如果服务器没有用对手的位置回复客户端,那么循环将停止,直到从服务器接收到 4 个字节。

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

更好的是,如果您完全愿意接受此处的建议,请改用 UDP。UDP 通常用于游戏编程,因为所涉及的数据是实时的,并且仅在短时间内有用。TCP 减慢了这一速度,因为您可能正在确认数据包,或者等待接收您不再关心的数据包,因为它们太旧了。UDP 让您可以控制它。

此外,通常有一个用于发送的线程和一个用于接收网络代码的线程。我建议你创建 2 个线程,这样你就不会遇到这种问题。

于 2013-08-12T03:19:52.207 回答
0

在这种情况下,我建议使用单独的线程来写入数据。例如,当通过用户输入改变速度时,发送速度/位置数据包。使用这样的线程不断读取(并阻止)对手的速度/位置。

于 2013-08-12T03:23:23.507 回答