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

时间:2017-02-06 21:48:44

标签: java multithreading networking

我遇到了多线程和网络问题。如果只有1或2名球员,那么这一切都很好。但是只要添加第3个玩家,其中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;
        }
    }
}

然后将其发送给客户。

while(true) {
    String message = Input.readUTF();

    String[] Data = message.split("/");

    if(Data[0].equalsIgnoreCase("RequestingPosition")) {
        if(client.getPlayer() != null) Output.writeUTF("PlayerPosition" + "/" + client.getXOffset() + "/" + client.getYOffset() + "/" + client.getPlayer().getPlayerID());
    }
}

然后将其发送给相应的用户。服务器有一个用户列表,每个用户都有自己的线程。当客户端向服务器发送内容时,实际上只是发送给相应的用户。

将数据发送给除发送数据之外的所有客户端。

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;
        }
    }
}
}

然后使用x,y和playerid将其发送给客户端。

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

某些角色会变成方框吗?

当我在while循环中放入一个System.out.println(消息)时,我得到了什么。

(2名玩家)PlayerPositions / 0/0/1

(2名玩家)PlayerPositions / 0/0/1

(2名玩家)PlayerPositions / 0/0/1

(2名玩家)PlayerPositions / 0/0/1

(3名玩家)PlayerPositions / 0/0 [] [] Pl

0 个答案:

没有答案