Einfach einzubindender Telnet-Client gesucht

Status
Nicht offen für weitere Antworten.

neo2001

Mitglied
Hallo!

Folgendes: Unser Provider stellt uns einen Server zur verfügung, der SMS versendet. Die Sache ist recht simpel gestaltet: Man verbindet sich via Telnet mit dem Server auf Port 8181 und übergibt dann ein paar Befehle (usr=abcdef, pas=12345, des=0170987654321,...,send). Auf ein erfolgreiches Kommando erhält man "500" als Rückmeldung.

"Manuell" mit Telnet bzw. Putty funktioniert dies auch wunderbar. Nun würde ich aber gern ein kleines Javaprogramm schreiben, um die Sache schneller und einfacher bedienbar zu machen. Dies wäre soweit auch kein Problem - bloß mit der Telnet-Schnittstelle hab ich so meine Probleme.

Ich hab mich mal umgeschaut und z.B. http://www.javatelnet.org und http://jakarta.apache.org/commons/net/ gefunden. Damit kann ich die Verbindung zumindest schonmal aufbauen und wieder beenden. ;) Aber so wie ich das verstehe, arbeiten die aber ansonsten alle mit Streams - und damit tue ich mir offen gesagt etwas schwer. Was ich suche, ist eine Möglichkeit Befehle einfach per Methode abzusetzen - also in dem Sinne:

Code:
telnet.connect("123.123.123.123",8181);
telnet.sendeBefehl("usr=abcdef");
telnet.sendeBefehl("pas=12345");
telnet.sendeBefehl("des="+rufnummer);
[...]
telnet.disconnect;

usw.. so ähnlich wie z.B. auch beim MySQL-Connector.

Eine Rückmeldung in dem Sinne (also Bildschirmtext etc.) brauche ich ja gar nicht (abgesehen vielleicht von dem Code 500 ggf. als boolean-Rückgabewert der Methode - aber das ist kein Muss) - ich möchte ja einfach immer nur die paar Befehle in der festgelegten Reihenfolge absetzen und dann die Verbindung beenden.

Ich wäre sehr dankbar wenn mir da jemand auf die Sprünge helfen könne! :) Gibt es da evtl. schon was - oder hab ich bei den Sachen die ich schon gefunden habe nicht genau genug geschaut?[/code]
 

foobar

Top Contributor
Wenn du einen Outputstream hast kannst du doch einfach eine sendCommand-Methode implementierten:

ous ist der Outputstream den du vond er API bekommst.
Code:
public void sendCommand(String command)
{
  PrintWriter pw = new PrintWriter(ous);
  pw.println(command);
  pw.flush();
  pw.close();
}
 

foobar

Top Contributor
Hast du mal versucht die Verbindung direkt über einen Socket herzustellen? Denn ich glaube du brauchst hier gar keinen Telnetclient.
 

neo2001

Mitglied
Erstmal vielen Dank für Deine Antwort! :)

foobar hat gesagt.:
Hast du mal versucht die Verbindung direkt über einen Socket herzustellen? Denn ich glaube du brauchst hier gar keinen Telnetclient.

Nein, hab ich nicht versucht - wüßte auch nicht wie das geht. :oops:

Ich hab jetzt mal ein wenig rumgebastelt, ist leider schon eine Weile her, dass ich was mit Java gemacht habe :(:

Code:
public class TelnetConnector {
    
    TelnetClient tc = new TelnetClient();
    PrintWriter pw;
    
    /** Creates a new instance of TelnetConnector */
    public TelnetConnector() throws Exception {
        tc.connect("xxx.xxx.xxx.xxx",8181);
        pw = new PrintWriter(tc.getOutputStream());
    }
    
    public void sendCommand(String command) {
        pw.println(command+"\n\r");

    }
    
    public void disconnect() throws Exception {
        pw.flush();
        pw.close();
        tc.disconnect();
    }
    
}

Bin mir nicht sicher, ob ich den "Enter"-Tastendruck am Ende des Befehls so korrekt übermitteln kann. Ebenfalls nicht sicher bin ich, ob ich für jedes Kommando einen neuen Stream "aufmachen" muss oder ob da einer reicht.

Aufgerufen wird das Ganze dann in der GUI-Klasse per Button mit:

Code:
        try {
            TelnetConnector tcon = new TelnetConnector();
            tcon.sendCommand("usr=12345");
            tcon.sendCommand("pas=12345");
            tcon.sendCommand("des=017012345");
            tcon.sendCommand("sms=Test");
            tcon.sendCommand("send");
            tcon.disconnect();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }


Wenn ich das ganze teste, bekomme ich keinen Fehler - ankommen (SMS) tut aber auch nichts.
 

foobar

Top Contributor
Also ich würde das ungefähr so machen:

Code:
import java.io.*;
import java.net.*;


public class SmsWrapper
{
    
    private PrintWriter pw;
    private InputStream ins;
    public SmsWrapper()
    {
        try
        {
            Socket socket = new Socket("127.0.0.1",12345);
            pw = new PrintWriter(socket.getOutputStream());
            ins = socket.getInputStream();                    
            
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    
    public void sendCommand(String user, String passwd, String dest)
    {
        pw.println("usr="+user+", pas="+passwd+", des="+dest+",send");
        pw.flush();
        
        // check return value
        
        try
        {
            int ret = ins.read();
            System.out.println("received " + ret);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        
        // ... handle return value here
    }
    
    public static void main(String[] args)
    {
        new SmsWrapper();
    }
}

Wie sieht denn die genaue Befehlssysntax aus? Ist das alles nur eine Zeile oder pro Befehl eine Zeile?
 

neo2001

Mitglied
Ist pro Befehl eine Zeile. Ich muss also (wenn ich es manuell mache) nach jedem Befehl 1x ENTER drücken.

Werde den von Dir vorgeschlagenen Weg heute Abend mal ausprobieren. :)
 

neo2001

Mitglied
foobar hat gesagt.:
Bei welchem Anbieter bist du denn und was kostet das?

Die Firma heißt Telemaxx - ist ein relativ kleiner lokaler Anbieter im Raum Karlsruhe.

Ich hab jetzt mal Deinen Vorschlag umgesetzt - hänge aber nach wie vor an dem Problem wie ich dem Server nach jeder Eingabe ein ENTER-Tastendruck schicken kann - Die Escape-Sequenzen \r, \n, Kommas, Leerzeichen oder Semikolons funktionieren nicht (hab ich mit einem Telnet-Client bzw. auch im Programmcode mal ausprobiert).
 

foobar

Top Contributor
println hängt automatisch ein Newline an. Haste die Ausgabe mal lokal getestet z.b. mit einer Pipe in ein File oder einem lokalen Server? Was sagt die Spezifikation von denen? Wie muß der String aussehen?
 

neo2001

Mitglied
foobar hat gesagt.:
println hängt automatisch ein Newline an. Haste die Ausgabe mal lokal getestet z.b. mit einer Pipe in ein File oder einem lokalen Server? Was sagt die Spezifikation von denen? Wie muß der String aussehen?

Ich hab es mal einfach ausgeben lassen, da stand alles genau so da, wie es stehen sollte.

Bzgl. Spezifikation oder String kann ich nicht wirklich was zu sagen... - da ich mich per Putty oder z.B. auch mit dem Linux Telnet-Client auf dem Server ganz normal anmelden und die Kommandos am Prompt (jeweils mit einem Druck auf die Enter-Taste) absetzen kann, kann es ja eigentlich nicht so sehr ungewöhnlich sein.
 

neo2001

Mitglied
foobar hat gesagt.:
Was bekommst du denn als Quittung, wenn du die Kommandos über das Javaprogramm absetzt?

Ich erhalte immer nur "87" als Antwort - wohl das "W" von "Welcome to..." - egal ob direkt über den Socket oder die TelnetClient Klasse gehe.

Seit gestern Abend geht es aber sowieso nicht mehr. Wenn ich mich mit meinem Usernamen anmelden will, kommt sofort die Meldung, dass nur eine Session pro Benutzer erlaubt ist und die Verbindung bricht ab. Wahrscheinlich hab ich bei meinen ganzen Experimenten zumindest zeitweise vergessen die Verbindung wieder zu schließen.
 

foobar

Top Contributor
Wofür brauchst du das ganze überhaupt? Hast du dir mal überlegt die SMS über ein Handy zu verschicken, daß an den PC angeschlossen ist? Dann kannste ganz einfach mit AT-Befehlen arbeiten. Dafür gibt es auch schon eine Java-API.
 
G

Guest

Gast
foobar hat gesagt.:
Wenn du einen Outputstream hast kannst du doch einfach eine sendCommand-Methode implementierten:

ous ist der Outputstream den du vond er API bekommst.
Code:
public void sendCommand(String command)
{
  PrintWriter pw = new PrintWriter(ous);
  pw.println(command);
  pw.flush();
  pw.close();
}
 
Status
Nicht offen für weitere Antworten.

Oben