Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用多线程和网络时丢失数据_Java_Multithreading_Networking - Fatal编程技术网

Java 使用多线程和网络时丢失数据

Java 使用多线程和网络时丢失数据,java,multithreading,networking,Java,Multithreading,Networking,我在多线程和网络方面有问题。如果只有1到2个玩家,这一切都很好。但一旦第三名玩家加入,其中1或2人就会返回一个错误。错误包括无法将字符串解析为int或索引越界异常。我知道为什么这两种情况都会发生,但我不知道如何修复它 这两种情况发生的原因都是因为字符被替换为方框 我认为这与一次发送多件东西有关?不过我并不乐观 我是这样编码的: 每隔1/20秒运行一次此勾选方法 public void tick() { LinkedList<User> CopyOfUsers = null;

我在多线程和网络方面有问题。如果只有1到2个玩家,这一切都很好。但一旦第三名玩家加入,其中1或2人就会返回一个错误。错误包括无法将字符串解析为int或索引越界异常。我知道为什么这两种情况都会发生,但我不知道如何修复它

这两种情况发生的原因都是因为字符被替换为方框

我认为这与一次发送多件东西有关?不过我并不乐观

我是这样编码的:

每隔1/20秒运行一次此勾选方法

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])) {