因此,我试图在服务器端使用多线程为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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句