Ir para conteúdo
  • 0

java.io.EOFException


LuizB

Pergunta

Bem, toda vez que eu tenho pegar o número de jogadores de todos os servidores, do bungeecord da java.io.EOFException

Stacktrace completo:

 

java.io.EOFException
[15:59:32] [Server thread/WARN]: 	at java.io.DataInputStream.readUnsignedShort(Unknown Source)
[15:59:32] [Server thread/WARN]: 	at java.io.DataInputStream.readUTF(Unknown Source)
[15:59:32] [Server thread/WARN]: 	at java.io.DataInputStream.readUTF(Unknown Source)
[15:59:32] [Server thread/WARN]: 	at me.cuthmf.lobbyl.Lobby.onPluginMessageReceived(Lobby.java:43)
[15:59:32] [Server thread/WARN]: 	at org.bukkit.plugin.messaging.StandardMessenger.dispatchIncomingMessage(StandardMessenger.java:427)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:2114)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.PacketPlayInCustomPayload.a(SourceFile:55)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.PacketPlayInCustomPayload.a(SourceFile:8)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13)
[15:59:32] [Server thread/WARN]: 	at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[15:59:32] [Server thread/WARN]: 	at java.util.concurrent.FutureTask.run(Unknown Source)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654)
[15:59:32] [Server thread/WARN]: 	at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557)
[15:59:32] [Server thread/WARN]: 	at java.lang.Thread.run(Unknown Source)

Isso só acontece quando eu uso thread ou Runnable

Se eu colocar por comando, funciona normal.

Código:

private  static Map<String, Integer> players = new HashMap<>();
	 @Override
     public void onPluginMessageReceived(String channel, Player player, byte[] message) {
             if (!channel.equals("BungeeCord")) return;
            
             try {
                     DataInputStream in = new DataInputStream(new ByteArrayInputStream(message));
                     String command = in.readUTF();
                    
                     if (command.equals("PlayerCount")) {
                             String server = in.readUTF().toString();
                             int playerCount = in.readInt();
                             players.clear();
                            players.put(server, playerCount);
                     }
             } catch (Exception e) {
                     e.printStackTrace();
             }
     }


 

  
	  public static String getNumberofplays(String server) {
		  try {
              ByteArrayOutputStream b = new ByteArrayOutputStream();
              DataOutputStream out = new DataOutputStream(b);

              out.writeUTF("PlayerCount");
              out.writeUTF(server);
              Bukkit.getServer().sendPluginMessage(Lobby.getPlugin(Lobby.class), "BungeeCord", b.toByteArray());
              return Integer.toString(players.get(server));
      } catch (Exception e) {
    	  return "0";
      }
}
Editado por Cuthmf
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

Bom, eu nunca mexi com bungee, então... fui só pela lógica.

 

Onde tava o erro do código dele?

Ordem, ele tava pegando uma coisa que ainda não tinha acontecido, bungeecord é assim mesmo, as mensagens do bungeecord somente são enviadas quando um player entra/sai(se não me falha a memória), ai ele tava limpando a Map e colocando ao receber a mensagem, só que GET dele, ele já tava tentando retornar sem ao menos o servidor ter recebido a mensagem, apenas enviado, por este motivo o messaging do bungeecord tem a função de enviar por player e por servidor, por player ele retorna pra tu continuar a tua função a partir daquele player especifico, e o servidor é o servidor kk

Link para o comentário
Compartilhar em outros sites

public static String getNumberofplays(String server)
 

 

 

Esse servidor aqui String server tá online?

 

Ta, e o servidor é ALL, que é só o lobby, quando eu uso o comando ele retorna o número, já em uma thread ou runnable da esse erro.

 

@EDIT 

 

È só o ALL, que é pra pegar todos os jogadores conectado.

Editado por Cuthmf
Link para o comentário
Compartilhar em outros sites

Ta dando erro pq n tem mais coisa pra ler...

 

Tu ta escrevendo isso

 

out.writeUTF("PlayerCount");
out.writeUTF(server);

 

mas ta lendo isso

 

String command = in.readUTF();

String server = in.readUTF().toString();
int playerCount = in.readInt(); // ????? esqueceu de escrever isso?

Link para o comentário
Compartilhar em outros sites

Ta dando erro pq n tem mais coisa pra ler...

 

Tu ta escrevendo isso

 

out.writeUTF("PlayerCount");

out.writeUTF(server);

 

mas ta lendo isso

 

String command = in.readUTF();

String server = in.readUTF().toString();

int playerCount = in.readInt(); // ????? esqueceu de escrever isso?

Entendi nada '-'

 

@EDIT 

 

Sò a parte que n tem mais coisa pra ler

Editado por Cuthmf
Link para o comentário
Compartilhar em outros sites

Tu ta escrevendo 2 coisas no buffer e ta lendo 3.....

Esse teu código n faz sentido, oq tu ta tentando fazer?

ainda n entendi, estou querendo pegar todos os jogadores de todos os servidor do bungeecord

Link para o comentário
Compartilhar em outros sites

Tu ta escrevendo 2 coisas no buffer e ta lendo 3.....

Esse teu código n faz sentido, oq tu ta tentando fazer?

Técnicamente o código dele ta certo, o primeiro que escreve no buffer é o bungeecord, que no caso é o subChannel, no caso seria o primeiro argumento que o cara escreveu, PlayerCount, o bungee já escreve o segundo argumento, o nome do servidor, que o dev já escreveu no segundo argumento, e o bungeecord retorna o valor que o dev pediu no terceiro argumento, logo o dev não precisa escrever o terceiro argumento, pois é a response do que o dev solicitou, o bungeecord respondeu

 

@Topic

 	@Override
 	public void onPluginMessageReceived(String channel, Player player, byte[] message) {
             if (!channel.equals("BungeeCord")) return;
             try {
                     DataInputStream in = new DataInputStream(new ByteArrayInputStream(message));
                     String sub = in.readUTF();
                     if (sub.equals("PlayerCount")) {
		 	String server = in.readUTF();
		 	int pCount = in.readInt();
			player.sendMessage(String.format("Players online %s", pCount));
		     }	
             } catch (Exception e) {
		   e.printStackTrace();
             }
 	}
	
  	private static void getPlayersCount(String server, Player p) {
           try {
              ByteArrayOutputStream b = new ByteArrayOutputStream();
              DataOutputStream out = new DataOutputStream(b);
              out.writeUTF("PlayerCount");
              out.writeUTF(server);
              p.sendPluginMessage(Lobby.getPlugin(Lobby.class), "BungeeCord", b.toByteArray());
	   } catch (Exception e) {
              e.printStackTrace();
	   }
	}
	
	@Override
	public boolean execute(CommandSender sender, String label, String[] args){
		getPlayersCount("ALL", ((Player)sender));
		return true;
	}
Editado por MikeSantos
Link para o comentário
Compartilhar em outros sites

 

Técnicamente o código dele ta certo, o primeiro que escreve no buffer é o bungeecord, que no caso é o subChannel, no caso seria o primeiro argumento que o cara escreveu, PlayerCount, o bungee já escreve o segundo argumento, o nome do servidor, que o dev já escreveu no segundo argumento, e o bungeecord retorna o valor que o dev pediu no terceiro argumento, logo o dev não precisa escrever o terceiro argumento, pois é a response do que o dev solicitou, o bungeecord respondeu

 

@Topic

 	@Override
 	public void onPluginMessageReceived(String channel, Player player, byte[] message) {
             if (!channel.equals("BungeeCord")) return;
             try {
                     DataInputStream in = new DataInputStream(new ByteArrayInputStream(message));
                     String sub = in.readUTF();
                     if (sub.equals("PlayerCount")) {
		 	String server = in.readUTF();
		 	int pCount = in.readInt();
			player.sendMessage(String.format("Players online %s", pCount));
		     }	
             } catch (Exception e) {
		   e.printStackTrace();
             }
 	}
	
  	private static void getPlayersCount(String server, Player p) {
           try {
              ByteArrayOutputStream b = new ByteArrayOutputStream();
              DataOutputStream out = new DataOutputStream(b);
              out.writeUTF("PlayerCount");
              out.writeUTF(server);
              p.sendPluginMessage(Lobby.getPlugin(Lobby.class), "BungeeCord", b.toByteArray());
	   } catch (Exception e) {
              e.printStackTrace();
	   }
	}
	
	@Override
	public boolean execute(CommandSender sender, String label, String[] args){
		getPlayersCount("ALL", ((Player)sender));
		return true;
	}

 

Bom, eu nunca mexi com bungee, então... fui só pela lógica.

 

Onde tava o erro do código dele?

Link para o comentário
Compartilhar em outros sites

Ordem, ele tava pegando uma coisa que ainda não tinha acontecido, bungeecord é assim mesmo, as mensagens do bungeecord somente são enviadas quando um player entra/sai(se não me falha a memória), ai ele tava limpando a Map e colocando ao receber a mensagem, só que GET dele, ele já tava tentando retornar sem ao menos o servidor ter recebido a mensagem, apenas enviado, por este motivo o messaging do bungeecord tem a função de enviar por player e por servidor, por player ele retorna pra tu continuar a tua função a partir daquele player especifico, e o servidor é o servidor kk

Vlw, consegui resolver com sua resposta.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...