【发布时间】: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