没有从多线程客户端服务器应用程序返回正确的值

时间:2013-04-23 21:10:34

标签: java multithreading client-server

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

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

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

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

这发生在客户端线程中:movePlayer,向下移动椭圆,检查碰撞 然后将当前的x和y值发送到服务器,然后服务器将这些新值设置为第二个客户端的对手值并获取其他客户端的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个小时没有运气!!

由于

1 个答案:

答案 0 :(得分:0)

  

这个工作正常,直到y值为250 ...由于某种原因,它将其设置为零,而对手只是在屏幕中间消失并从顶部开始。

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

  

将指定的字节写入此输出流。一般   write的合同是写入一个字节   到输出流。要写入的字节是八字节   参数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;

这样的事情。或者您可以使用序列化并直接写shortint