Java 使用多线程和网络时丢失数据
我在多线程和网络方面有问题。如果只有1到2个玩家,这一切都很好。但一旦第三名玩家加入,其中1或2人就会返回一个错误。错误包括无法将字符串解析为int或索引越界异常。我知道为什么这两种情况都会发生,但我不知道如何修复它 这两种情况发生的原因都是因为字符被替换为方框 我认为这与一次发送多件东西有关?不过我并不乐观 我是这样编码的: 每隔1/20秒运行一次此勾选方法Java 使用多线程和网络时丢失数据,java,multithreading,networking,Java,Multithreading,Networking,我在多线程和网络方面有问题。如果只有1到2个玩家,这一切都很好。但一旦第三名玩家加入,其中1或2人就会返回一个错误。错误包括无法将字符串解析为int或索引越界异常。我知道为什么这两种情况都会发生,但我不知道如何修复它 这两种情况发生的原因都是因为字符被替换为方框 我认为这与一次发送多件东西有关?不过我并不乐观 我是这样编码的: 每隔1/20秒运行一次此勾选方法 public void tick() { LinkedList<User> CopyOfUsers = null;
public void tick() {
LinkedList<User> CopyOfUsers = null;
synchronized(getUsers()) {
CopyOfUsers = new LinkedList<User>(getUsers());
}
for(User user : CopyOfUsers) {
try {
user.getOutput().writeUTF("RequestingPosition");
} catch (IOException e) {
user.leave();
break;
}
}
}
然后发送给相应的用户。服务器有一个用户列表,每个用户都有自己的线程。当客户机向服务器发送某个内容时,它实际上只是发送给相应的用户
它将数据发送到除发送数据的客户端之外的所有客户端
public class User implements Runnable {
public void run() {
while(true) {
try {
String message = Input.readUTF();
String[] Data = message.split("/");
if (Data[0].equalsIgnoreCase("PlayerPosition")) {
LinkedList<User> CopyOfUsers = null;
synchronized(server.getUsers()) {
CopyOfUsers = new LinkedList<User>(server.getUsers());
}
for (User user : CopyOfUsers) {
try {
if(user.getPlayerID() != this.getPlayerID()) user.getOutput().writeUTF("PlayerPositions/" + Integer.parseInt(Data[1]) + "/" + Integer.parseInt(Data[2]) + "/" + Integer.parseInt(Data[3]));
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
break;
}
}
}
}
错误总是发生在这一行:
if (p.getPlayerID() == Integer.parseInt(Data[3])) {
是否有一个修复一些字符变成方块
当我在while循环中放入System.out.println(消息)时,我得到的是
(2名玩家)玩家位置/0/0/1
(2名玩家)玩家位置/0/0/1
(2名玩家)玩家位置/0/0/1
(2名玩家)玩家位置/0/0/1
(3名玩家)PlayerPositions/0/0[]Pl看看
数据[3]
(调试器或println)中的内容。同时检查发送的内容…数据[3]打印playerid。当我添加第三个播放器时,它会变成一个类似于此[]的框。它不能被解析为int。它有时也会用[]替换/,这就是为什么有时会出现索引越界异常的原因。这个框只替换了整个消息中的最后几个字母。不知何故,PlayerPositions/112/106/2变成了PlayerPositions/112/1[][]这看起来像是两个线程同时在同一个输出流中写入([[[]]是第二个字符串的长度)哦……可能就是这样,有没有办法修复它?
while(true) {
String message = Input.readUTF();
String[] Data = message.split("/");
if(Data[0].equalsIgnoreCase("PlayerPositions")) {
for (Player p : client.getPlayers()) {
if (p.getPlayerID() == Integer.parseInt(Data[3])) {
p.setXOffset(Integer.parseInt(Data[1]));
p.setYOffset(Integer.parseInt(Data[2]));
}
}
}
}
if (p.getPlayerID() == Integer.parseInt(Data[3])) {