多人游戏(Java socket Java.io.StreamCorruptedException:无效类型代码:00)
客户端和服务器通过两个流(ObjectOutputStream、ObjectInputStream)进行通信 多线程服务器每秒发送播放器的数据,以使客户端与服务器同步。并将每个玩家的行为数据发送给客户端 在这个循环中,客户机接收数据并决定如何处理它们。 有时在这一行多人游戏(Java socket Java.io.StreamCorruptedException:无效类型代码:00),java,sockets,objectinputstream,Java,Sockets,Objectinputstream,客户端和服务器通过两个流(ObjectOutputStream、ObjectInputStream)进行通信 多线程服务器每秒发送播放器的数据,以使客户端与服务器同步。并将每个玩家的行为数据发送给客户端 在这个循环中,客户机接收数据并决定如何处理它们。 有时在这一行Object data=in.readObject()中有一个错误 我认为,当服务器上的两个线程同时尝试向客户端发送数据时,就会发生错误。这是真的吗 while(true) { Object data = in.readObj
Object data=in.readObject()中有一个错误代码>
我认为,当服务器上的两个线程同时尝试向客户端发送数据时,就会发生错误。这是真的吗
while(true) {
Object data = in.readObject();
if (data instanceof ControlShareData) {
ControlShareData c = (ControlShareData)data;
if (c.playerId == Game.player.id) {
Game.player.keyChange(c);
}
else {
for (Player p: Game.enemies) {
if (c.playerId == p.id) {
p.keyChange(c);
}
}
}
}
else if (data instanceof ShareData) {
ShareData sd = (ShareData)data;
Game.syncing(sd);
}
}
服务器端如下所示:
第一个线程:(对所有客户端每秒执行一次)
和玩家线程(一个玩家-一个线程):
是的,您是正确的-要解决此问题,您可以同步对每个ObjectOutputStream
的访问。顺便说一句,每个客户端应该只有一个。没有办法说,因为你没有提供服务器代码。好的,我添加了一些服务器代码。服务器上有多少ObjectOutputStreams??每个客户端一个流。正确的解决方案是为每个客户端创建一个队列吗?并从不同的线程向其中添加数据以发送到客户端。
p.out.writeObject(new ShareData(players, Wrd.boxes));
p.out.flush();
public void sendInfoAboutKey(int keyCode, boolean value) {
try {
for (Player p: Game.players) {
p.out.writeObject(new ControlShareData(keyCode, value, id));
p.out.flush();
}
} catch (IOException e) {
Server.removePlayer(this);
}
}