【问题标题】:Java sockets: updating on client but not server?Java套接字:在客户端而不是服务器上更新?
【发布时间】:2014-10-05 07:23:35
【问题描述】:

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

在 AsyncTask 中一切正常,但是当我尝试更新 x 和 y 时,只有客户端得到更新。

客户端异步任务:

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);
    }

控制台打印正确的哈希图,但服务器保持它们启动的方式

我已经在服务器端测试过打印,它会打印启动的 hashmap 值...

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

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

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

我尝试将 output.writeObject()s 移动到异步任务,但同样的事情。服务器可以很好地处理哈希图。

【问题讨论】:

    标签: java android sockets serialization


    【解决方案1】:

    序列化返回对象的副本。在本地更新它并不会神奇地更新它来自的对等方的副本。

    NB 您的读取循环不正确。 readObject() 在流结束时不返回 null。它会抛出 EOFException。

    【讨论】:

    • 感谢您的回复!我知道,代码还没有完成,我现在使用 tcpview 关闭套接字。我使用 writeObject 将对象发送到服务器。我知道服务器接收到对象,因为我在服务器端进行了 println,但它打印了启动的 hashmap,例如。 {0=1.0,1=0.0}(以 hashmap.put("0",1) 开始
    • 您可能需要查看 ObjectOutputStream.reset()。
    • 关于循环,我应该在每次没有收到输入时停止循环,还是在确定不应该收到输入时停止循环(例如在 onStop 发送 null)
    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 2017-02-25
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2017-08-23
    相关资源
    最近更新 更多