• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Problem beim anpingen eines Servers

ArzaniaEU

Minecrafter
Registriert
24 Dezember 2017
Beiträge
12
Diamanten
300
Hey,
meine Konsole wirft mir seit neuestem einen Error, den ich nicht beheben kann. Wenn ich per Socket auf den Server verbinde, bekomme ich eine NumberFormatException. Ich gebe bei "Port" eine Nummer ein, und bekomme als error:
Code:
For input string: "c"

Meine Klasse um Server anzupingen:
Javascript:
package de.codix.signsystem.utils;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class PingServer {

    public static String motd;
    public static int cPlayers;
    public static int maxPlayers;

    public static void pingServer(String host, int port) throws Exception {
        Socket sock = new Socket();
        try {
            sock.setSoTimeout(4000);
            sock.connect(new InetSocketAddress(host, port), 4000); //genau hier wird der error geworfen.

            DataOutputStream out = new DataOutputStream(sock.getOutputStream());
            DataInputStream in = new DataInputStream(sock.getInputStream());
            out.write(0xFE);

            int b;
            StringBuffer str = new StringBuffer();

            while ((b = in.read()) != -1) {
                if (b != 0 && b > 16 && b != 255 && b != 23 && b != 24) {
                    str.append((char) b);
                }
            }
          
            String[] data = str.toString().split("§");
            motd = data[0];
            cPlayers = Integer.parseInt(data[1]);
            maxPlayers = Integer.parseInt(data[2]);
            sock.close();
        } catch (Exception e) {
            motd = "&4&lOFFLINE";
            cPlayers = 0;
            maxPlayers = 0;
            System.out.println("[SIGN ERROR] "+e.getMessage());
            e.printStackTrace();
        }
    }

    public static void clearPingedThings() {
        motd = "";
        cPlayers = 0;
        maxPlayers = 0;
    }

}

Wie ich drauf zugreife:
Javascript:
try {
                   PingServer.pingServer("localhost", Integer.valueOf(25568).intValue());
                 } catch (Exception e) {
                   e.printStackTrace();
                 }

Der Server den ich anpingen möchte ist Online.
MfG Max
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Wäre sehr schön, wenn du den kompletten Stacktrace posten würdest und nicht nur den Teil, den du für relevanz hälst. Davon ausgehend, dass jedoch diese Zeile

sock.connect(new InetSocketAddress(host, port), 4000); //genau hier wird der error geworfen.

den Fehler erzeugt, so kommt folgendes Problem in Frage: InetSocketAddress ist ein DNS Record, aber dieser wird von Java aufgelöst und ich würde vermuten, dass der Record, der vom DNS Server zurückgegeben wird nicht korrekt formatiert ist. Unter Linux könntest du mit "dig" den entsprechenden Hostname auflösen und genau auf die Ausgaben gucken. Ohne kompletten Stacktrace kann man aber nicht wirklich helfen.
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Verwende doch einfach den Constructor Socket(String host, int port)

Integer.valueOf(25568).intValue() ist völlig sinnlos, hier schreibst du einfach den Wert hin, da Java eine streng typisierte Sprache ist.
Statische Felder zu verwenden ist in der Klasse PingServer völlig ungeeignet. Definiere diese als lokale Variablen.
Die Pings sollten in jedem Fall asynchron durchgeführt werden, damit der Server nicht stillsteht während auf das Timeout gewartet wird. Das Setzen des Texts der Schilder muss dann allerdings wieder synchron erfolgen.

Dein Serverpinger wird nur mit Servern funktionieren, die das alte Ping Protokoll unterstützen. Insbesondere Server mit BungeeCord also nicht.
Aber du musst noch einiges beachten, wenn du den Ping abfragst, als entspricht überhaupt nicht dem Protokoll, was z.B. dazu führen kann, dass du mit "§" an den falschen Stellen aufteilst:
http://wiki.vg/Server_List_Ping#1.6
 
Zuletzt bearbeitet:
Oben