繁体   English   中英

Java套接字:在客户端而不在服务器上进行更新?

[英]Java sockets: updating on client but not server?

因此,我尝试使用服务器端的多线程为Android制作游戏,并且尝试通过使用writeObject(x),writeObject(y)(x和y是所有玩家的hashmap来更新玩家的x和y) x / y)。 我一直没有收到任何错误,但是服务器和客户端x有所不同。

一切都在AsyncTask中工作,但是当我尝试更新x和y时,仅客户端得到更新。

客户端AsyncTask:

public class internetRoutesRetrieve extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... arg0) {

        try {

            MyClient = new Socket("myip", myport);

            input = new ObjectInputStream(MyClient.getInputStream());
            output = new ObjectOutputStream(MyClient.getOutputStream());

            while ((fromServer = input.readObject()) != null) {

                if (fromServer.getClass.equals(HashMap.class) {

                    if (((HashMap) fromServer).get(Integer.toString(0)).getClass().equals(Float.class)) {

                        thisFloatArray = (HashMap<String, Float>) fromServer;

                        if (thisFloatArray.get("0").equals((float) 1)) {

                            System.out.println("playerX: " + fromServer);
                            playerX = (HashMap<String, Float>) fromServer;

                        } else if (thisFloatArray.get("0").equals((float) 2)) {

                            System.out.println("playerY: " + fromServer);
                            playerY = (HashMap<String, Float>) fromServer;

                        }

                    } else if (((HashMap) fromServer).get(Integer.toString(0)).getClass().equals(Integer.class)) {

                        thisIntegerArray = (HashMap<String, Integer>) fromServer;

                        if (thisIntegerArray.get("0").equals(clientMax)) {

                            System.out.println("clientArray: " + fromServer);
                            clientArray = thisIntegerArray;
                            init();

                        }
                    }

效果很好。 然后,我尝试更新playerX / Y:

Runnable drawAll = new Runnable() {
    public void run() {
        try {

            if (mode == DRAG) {

                playerX.put(Integer.toString(clientNum), playerX.get(Integer.toString(clientNum))+playerSpeed);
                playerY.put(Integer.toString(clientNum), playerY.get(Integer.toString(clientNum))+playerSpeed);

                DrawView.pMatrixArray.get(Integer.toString(clientNum)).postTranslate(playerX.get(Integer.toString(clientNum)) - playerPrevX.get(Integer.toString(clientNum)), playerY.get(Integer.toString(clientNum)) - playerPrevY.get(Integer.toString(clientNum)));

            }

            DrawView.pMatrixArray.get(Integer.toString(clientNum)).getValues(values);

            playerPrevX.put(Integer.toString(clientNum), playerX.get(Integer.toString(clientNum)));
            playerPrevY.put(Integer.toString(clientNum), playerY.get(Integer.toString(clientNum)));

            playerX.put(Integer.toString(clientNum), values[2]);
            playerY.put(Integer.toString(clientNum), values[5]);


            output.writeObject(playerX);
            output.flush();
            output.writeObject(playerY);
            output.flush();
            System.out.println("playerX OUT: " + playerX);
            System.out.println("playerX OUT: " + playerX);

        } catch (IOException e) {
            e.printStackTrace();
        }
        (findViewById(R.id.the_canvas)).invalidate();
        handler.postDelayed(this, 2000);
    }

控制台会打印正确的哈希图,但服务器仍保持初始化方式

我已经在服务器端测试了打印,它会打印初始化的哈希图值...

while ((inputObj = in.readObject()) != null) {

                System.out.println("input: " + inputObj);

抱歉,不清楚,如果有人想帮助我,我可以将我的完整文件发布到某个地方。

我试过将output.writeObject()移到asynctask,但是还是一样。 服务器可以很好地处理哈希表。

序列化返回对象的副本 在本地更新副本并不能神奇地更新副本的副本来源。

注意:您的读取循环不正确。 readObject()在流的末尾不返回null。 它抛出EOFException。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM