[英]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.