1

我目前正在开发一个客户端服务器应用程序,其中 2 个客户端在 JFrame 上有一个椭圆形,他们每个人都可以看到他们的位置。

我的问题是当 Client1 得到 Client2 的位置时,他没有得到正确的值,因为对手在 Frame 上的椭圆位置不对。我决定让两个椭圆都向下移动(增加 y 值)并打印 oppYPos。似乎当 y = 250 时,它又回到了 y = 4。

我能够获得两个客户端的起始位置并在两个窗口上绘制椭圆,但是当我运行线程时,一切都从那里走下坡路......

由于我不能发布图片,这里有一些代码:

这发生在客户端线程中:movePlayer,向下移动椭圆,检查碰撞,然后将当前 x 和 y 值发送​​到服务器,然后服务器将这些新值设置为第二个客户端的 Opponent 值并获取 opp 位置另一个客户

            //This while loop is in the run method
    while(true){
        movePlayer();
        checkForCollisions();
        sendValuesToServer();
        getOppValuesFromServer();
        repaint();

        try {
            Thread.sleep(120);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


   public  void sendValuesToServer()
{
    try {
        outputToServer.write(myXPos);
        outputToServer.write(myYPos);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public  void getOppValuesFromServer(){

    try {
        this.oppXPos = inputFromServer.read();
        this.oppYPos = inputFromServer.read();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

这是服务器端

       //The xStartPos are overriden by the new x and y values from the client
             while (true) {
        synchronized (this) {

            // Getting the new variables back
            try {
                xStartPos = inputFromClient.read();
                yStartPos = inputFromClient.read();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        // Setting the new values for opponents
        synchronized (this) {
            for (SnakeServerThread sst : snakeThreads) {

                if (sst != this) {
                    currentOppXPos = sst.xStartPos;
                    currentOppYPos = sst.yStartPos;
                }

            }
        }

        synchronized (this) {
            try {
                outputToClient.write(currentOppXPos);
                outputToClient.write(currentOppYPos);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

这工作正常,直到 y 值为 250 ......出于某种原因,它将它设置为零,并且对手只是在屏幕的一半消失并从顶部开始。

抱歉,如果我包含的内容太多,但在过去的 2 个小时里我一直在尝试解决这个问题,但没有运气!!

谢谢

4

1 回答 1

0

这工作正常,直到 y 值为 250 ......出于某种原因,它将它设置为零,并且对手只是在屏幕的一半消失并从顶部开始。

您的问题很可能是您试图将一个整数写入服务器,但OutputStream.write(byte)只查看该值的最低 8 位。引用 javadocs:

将指定字节写入此输出流。一般约定write是将一个字节写入输出流。要写入的字节是参数的 8 个低位b。的 24 个高位b被忽略。

一旦超过了字节的 8 个字节,您就会再次滚动到 0。如果您的值高于 255,则需要写入多个字节。您应该将您的位置写为一系列字节:

...write(pos & 0xFF);
...write((pos & 0xFF00) >> 8);
// if the position can be more than 2 bytes
//...write((pos & 0xFF0000) >> 16);
//...write((pos & 0xFF000000) >> 24);

接着:

pos = ...read();
pos |= ...read() << 8;
// if the position can be more than 2 bytes
// pos |= ...read() << 16;
// pos |= ...read() << 24;

类似的东西。或者您可以使用序列化并直接编写 ashort或 an int

于 2013-04-23T21:13:51.660 回答