我遇到了多线程和网络问题。如果只有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