Die spinnen, die Sockets
lima-city → Forum → Programmiersprachen → Java
anfrage
antwort
auftritt
ausgabe
befehl
byte
code
container
fehler
grund
liegen
native
paar
port
programm
run
server
string
swing
zeile
-
Hey,
arbeite mich schon etwas länger in Java ein und bekam gerade folgende Exception um den Kopf gewurfen:
Connection refused: connect
Das das heißt, dass der nicht auf den Server verbinden kann, weiß ich :D
Allerdings läuft der Server 100%ig ( ist ein SA:MP Server ).
Der try / catch - Blog:
try { JLSpacer2.setText("Auflösen der Serverinfos"); String serverip = JTIP.getText(); int serverport = Integer.valueOf(JTPort.getText()).intValue(); SendDebug("Serverip: "+ serverip +", Serverport: "+ serverport); JLSpacer2.setText("Verbinden zum Server"); Socket socketconnection = new Socket(serverip, serverport); JLSpacer2.setText("Befehl senden"); write(socketconnection, packet); JLSpacer1.setText("Befehl gesendet:"); JLSpacer2.setText(JTText.getText()); } catch(Exception e) { JLSpacer1.setText("Fehler:"); JLSpacer2.setText("Siehe Konsole"); SendDebug("Ein Fehler trat auf:"); System.out.println("Error: "+ e.getMessage()); }
Der Debugtext:
Debug: Serverip: 127.0.0.1, Serverport: 7777 Debug: Ein Fehler trat auf: Error: Connection refused: reconnect
Ich hoffe ihr könnt mir helfen, jeder kleine Tipp würde mich voran bringen...
Beim compilen gibt es keinen Error und ( scheinbar ) auch keinen Warning...
Tion -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
:O gibt es in Java auch Pipes ?
Quasi
chroot -R server /home/server > log.txt
Das sind ein paar Zeilen, die ich abtippen müsste... Vielleicht 20 ? :D
Tion -
:S hätte ich eigentlich machen können...
Habe jetzt eine extra Funktion ReportException geschrieben und die Exception geparst usw.
Heraus kam:
java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at SampServerTest.OnButtonGetClicked(SampServerTest.java:92) at SampServerTest$1.actionPerformed(SampServerTest.java:61) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Connection refused: connect
/Edit: Zeile 92 in SampServerTest:
Socket socketconnection = new Socket(serverip, serverport);
Ich weiß 100%ig, dass der Server läuft -.-
Beitrag zuletzt geändert: 3.9.2011 21:09:29 von tion -
Soweit ich das sehe, tritt der Fehler in der Klasse SampServerTest in Zeile 92 auf.
Jetzt wäre noch gut zu wissen, was in dem von dir geposteten Code Zeile 92 ist.
mfg -
/Edit: Zeile 92 in SampServerTest:
Socket socketconnection = new Socket(serverip, serverport);
Ich weiß 100%ig, dass der Server läuft -.-
Kann es an einer Fehlinstallation von Java o.ä. liegen ? -
Kannst du denn mit dem herkömmlichen Weg über einen normalen Client auf diesem Port vverbinden?
Die Exception bedeutet nicht, dass ein Server nicht läuft, sondern einfach, dass keine Antwort auf die Anfrage kam, egal aus welchem Grund. Das heißt es kann auch einfach der Server die Anfrage nicht aktzeptieren, aus welchem Grund auch immer. Vllt verwenden normale Samp-Clients einen entsprechenden User-Agent oder so.
Von einem Fehler auf der Seite von Java würde ich bei sowas erstmal nicht ausgehen. -
Kannst du denn mit dem herkömmlichen Weg über einen normalen Client auf diesem Port vverbinden?
Ja kann ich
Die Exception bedeutet nicht, dass ein Server nicht läuft, sondern einfach, dass keine Antwort auf die Anfrage kam, egal aus welchem Grund.
Darüber habe ich auch schon nachgedacht, allerdings bekam ich diese Exception auch immer bei Minecraft wenn der Server offline war deswegen dachte ich, das heißt, dass der Server nicht erreichbar ist :D
Die "Packetgenerierung" habe ich mir von PHP abgeguckt:
private functionGeneratePacket($ip, $port, $password, $content) { $sPacket = 'SAMP'; $sPacket .= chr(strtok($ip, '.')); $sPacket .= chr(strtok('.')); $sPacket .= chr(strtok('.')); $sPacket .= chr(strtok('.')); $sPacket .= chr($port & 0xFF); $sPacket .= chr($port >> 8 & 0xFF); $sPacket .= 'x'; $sPacket .= chr(strlen($password) & 0xFF); $sPacket .= chr(strlen($password) >> 8 & 0xFF); $sPacket .= $password; $sPacket .= chr(strlen($content) & 0xFF); $sPacket .= chr(strlen($content) >> 8 & 0xFF); $sPacket .= $content; return $sPacket; }
und die Java-Version ( meine Version ):
public static String GeneratePacket(String ip, String port, String password, String content) { String packet = ""; String[] newip = ip.split("\\."); for (char c : "SAMP".toCharArray()) { packet += ((byte) c); } for (String s : newip) { packet += (byte) (char) Integer.parseInt(s); } packet += (byte) (Integer.parseInt(port) & 0xFF); packet += (byte) (Integer.parseInt(port) >> 8 & 0xFF); packet += "x"; packet += (char) (password.length() & 0xFF); packet += (char) (password.length() >> 8 & 0xFF); packet += password; packet += (char) (content.length() & 0xFF); packet += (char) (content.length() >> 8 & 0xFF); packet += content; return packet; }
Ich bin die beiden Versionen ein paar mal durchgegangen und sie sind ( in meinen Augen ) gleich :D -
Hast du denn mal mit var_dump in PHP bzw. print in Java überprüft, ob die beiden Funktionen wirklich dasselbe ausgeben?
Das casten in byte sieht mir nämlich recht verwegen aus, da bei Java alle Datentypen signed sind, das heißt bei dem byte kommen unter Umständen negative Zahlen raus und Byte werden als Zahlen ausgegeben und nicht als deren Zeichenäquvalent.
So hab mir mal die Mühe gemacht das zu testen und siehe da es kommen zwei total unterschiedliche Zeicheketten raus:
PHP SAMPaxblabla2 Java (kann ich wohl wegen utf8 nicht komplett kopieren) 836577801270019730x
Ab dem x ist alles gleich, aber davor happerts.
Allerdings scheint es hier einiges zu geben, was komisch abläuft.
Die Zeile scheint in PHP keine Auswirkungen zu haben, aber in Java wird sie korrekt ausgeführt:
$sPacket .= chr($port >> 8 & 0xFF);
Keine Ahnung warum die 30 bei PHP mit einem leeren String gleichgesetzt wird. Evtl. ein Bug von demjenigen der das PHPscript geschrieben hat und nur bei deinem Beispiel auftritt, weil der Autor des PHPscripts etwas nicht bedacht hat oder so.
Aber probiers einfach mal mit der Javavariante:
public static String GeneratePacket(String ip, String port, String password, String content) { String packet = "SAMP"; String[] newip = ip.split("\\."); for (String s : newip) { packet += (char) Integer.parseInt(s); } packet += (char) (Integer.parseInt(port) & 0xFF); packet += (char) (Integer.parseInt(port) >> 8 & 0xFF); packet += "x"; packet += (char) (password.length() & 0xFF); packet += (char) (password.length() >> 8 & 0xFF); packet += password; packet += (char) (content.length() & 0xFF); packet += (char) (content.length() >> 8 & 0xFF); packet += content; return packet; }
Evtl. liegen aber auch noch ein paar andere Kodierungsfehler drin, da Java Utf8 mit 2 Byte einsetzt und PHP wohl AscII mit 1 Byte.
Beitrag zuletzt geändert: 4.9.2011 13:06:18 von reimann -
Vielleicht sollte ich mich echt einloggen, um zu antworten :D
Dein Code geht leider auch nicht, ich denke mal, dass du recht hast und es genau daran liegt:
Evtl. liegen aber auch noch ein paar andere Kodierungsfehler drin, da Java Utf8 mit 2 Byte einsetzt und PHP wohl AscII mit 1 Byte.
Kann man das iwie ändern ? Es gibt eine App für Android / Symthian, in der auch ein Packet generiert wird... Soll Open Source sein, finde es nur nicht mehr :S
Die App selber hätte ich auf meinem Computer :D
Tion -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage