DataOutputStream-总是写入服务器?

时间:2013-08-12 03:15:54

标签: 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)循环仅在创建线程时执行一次。如何建立恒定的数据流?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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