# Socket



## Andre1992 (21. Sep 2011)

Ich habe da mal eine Frage. Vielleicht kann mir ja jemand helfen.

Ich schreibe immoment ein Programm für ein GSM Modem, welches SMS verschicken soll.

Nun ist es so, das es ohne Probleme EINE SMS verschickt.

Jetzt will ich aber mehrer SMSen verschicken.
Aber dies geht nicht.

Ich schließe den Socket immer mit close();

Gibt es irgendeine Methode die den Socket wieder öffnet?
Z.b.: Socket.open(); ? 

Immoment komme ich gar nicht weiter... 
Vielleicht weiß ja jemand so ein Befehl... ( Mit socket.connect(); komme ich auch nicht weiter  )


----------



## Gast2 (21. Sep 2011)

Bekommst du beim zweiten mal ne Exception?
Zeig mal deinen Code.


----------



## Andi_CH (21. Sep 2011)

Warum schliesst du den Socket wenn du ihn noch brauchst?

Öffnen kannst du ihn ja offensichtlich - wenn schliessen nötig ist, öffne ihn doch gleich wie das erste Mal.


----------



## Andre1992 (21. Sep 2011)

```
package GSM_Modem;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.Scanner;

public class Modem
{
	Socket socket = null;
	Scanner scanner = null;
	
	public static void main(String[] args) throws UnknownHostException,IOException, InterruptedException {
		Modem modem = new Modem();
		String text = "Test";
		
		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text)+"(1)");
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		modem.closeSocket();
		
		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(2)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		modem.closeSocket();
		
		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(3)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		modem.closeSocket();
		
		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(4)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		modem.closeSocket();
		
	}

	public void sendMessage(String nummer, String text)throws UnknownHostException, IOException {
		OutputStream out = getSocket().getOutputStream();
		PrintWriter printer = new PrintWriter(out, true);
		System.out.println( "IsConnected: " + getSocket().isConnected());
		System.out.println( "isOutputShutdown: " + getSocket().isOutputShutdown());
		printer.println("<?xml version=\"1.0\"?> <cmgs destaddr=\"" + nummer + "\">" + text + "</cmgs>");
	}

	private String checkTextOfSpecialCharacter(String text)
	{
		if (text == null) 
			text = null; 
		
		List<Tuple> replaceData = new ReplaceCharList().getReplaceData();
		for (Tuple tuple : replaceData) {
			text = text.replaceAll(tuple.getVon(), tuple.getNach());
		}
		return text;		
	}

	public void checkOutput() throws UnknownHostException, IOException, InterruptedException {
		String str = null;
		int timeout = 10;
		
		int i = 0;
		while (getScanner().hasNext() && i < timeout) {
			str = getScanner().nextLine();
			System.out.println("\r\n" + str);
			Thread.sleep(1000);
			i++;
		}

		ErrorCheck(str);
	}

	private void ErrorCheck(String str) {
		if (str.contains("length=\"160\"")) {
			System.out.println("\r\nDie Nachricht wurde zum Teil gesendet! (SMS wurde bis zum 160sten Zeichen versendet. Alle Zeichen darüber wurden nicht versendet!)");
		} else {
			if (str.contains("SMS accepted")) {
				System.out.println("\r\nDie Nachricht wurde gesendet!");
			} else {
				if (str.contains("invalid token")) {
					System.out.println("\r\nDiese Nachricht enthält ungültige Zeichen!");
				} else {
					System.out.println("\r\nunbekannter Fehler");
				}
			}
		}
	}

	private Socket getSocket() throws UnknownHostException, IOException {
		if (socket == null) {
			socket = new Socket("172.29.0.25", 1432);			
		}
		return socket;
	}

	private Scanner getScanner() throws UnknownHostException, IOException {
		if (scanner == null) {
			scanner = new Scanner(getSocket().getInputStream());
		}
		return scanner;
	}

	public void closeSocket() throws UnknownHostException, IOException {
		getSocket().close();
	}

	public void closeScanner() throws UnknownHostException, IOException {
		getScanner().close();
	}
}
```


----------



## Andi_CH (21. Sep 2011)

Was ist ein Tupple? Was ReplaceCharList?


----------



## SlaterB (21. Sep 2011)

ich erstelle mir ein Objekt der Klasse Prozelanladen,
kaufe dort fröhlich ein mit kaufe(),
rufe dann elefantMachtAllesKaputt() auf
und kann danach nicht mehr einfachen,
was ist falsch?

..
close() macht close(), danach geht nix mehr, verzichte auf close() oder öffne einen neuen Socket


----------



## Andi_CH (21. Sep 2011)

```
if (text == null) 
			text = null;
```
ist auch SEHR interessant 

Hab ich ja oben schon gefragt - warum schliessen wenn man den noch braucht .....


----------



## Andre1992 (21. Sep 2011)

Ich bin ja nur Auszubildener und ein Geselle meinte, das ich nicht jedes mal ein neues Socket öffnen soll, weil es Speicherplatz weg nimmt, wen man jedes mal was neues öffnet.

wenn ich jetzt die close() Methoden bei allen SMS außer bei der letzten raus nehme, dann sieht der Code wie folgt aus:

package GSM_Modem;

import java.io.IOException;
import java.iutputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.Scanner;

public class Modem
{
	Socket socket = null;
	Scanner scanner = null;

	public static void main(String[] args) throws UnknownHostException,IOException, InterruptedException {
		Modem modem = new Modem();
		String text = "Test";

		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text)+"(1)");
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();


		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(2)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();


		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(3)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();


		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(4)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		modem.closeSocket();

	}

	public void sendMessage(String nummer, String text)throws UnknownHostException, IOException {
		OutputStream out = getSocket().getOutputStream();
		PrintWriter printer = new PrintWriter(out, true);
		System.out.println( "IsConnected: " + getSocket().isConnected());
		System.out.println( "isOutputShutdown: " + getSocket().isOutputShutdown());
		printer.println("<?xml version=\"1.0\"?> <cmgs destaddr=\"" + nummer + "\">" + text + "</cmgs>");
	}

	private String checkTextOfSpecialCharacter(String text)
	{
		if (text == null) 
			text = null; 

		List<Tuple> replaceData = new ReplaceCharList().getReplaceData();
		for (Tuple tuple : replaceData) {
			text = text.replaceAll(tuple.getVon(), tuple.getNach());
		}
		return text;		
	}

	public void checkOutput() throws UnknownHostException, IOException, InterruptedException {
		String str = null;
		int timeout = 10;

		int i = 0;
		while (getScanner().hasNext() && i < timeout) {
			str = getScanner().nextLine();
			System.out.println("\r\n" + str);
			Thread.sleep(1000);
			i++;
		}

		ErrorCheck(str);
	}

	private void ErrorCheck(String str) {
		if (str.contains("length=\"160\"")) {
			System.out.println("\r\nDie Nachricht wurde zum Teil gesendet! (SMS wurde bis zum 160sten Zeichen versendet. Alle Zeichen darüber wurden nicht versendet!)");
		} else {
			if (str.contains("SMS accepted")) {
				System.out.println("\r\nDie Nachricht wurde gesendet!");
			} else {
				if (str.contains("invalid token")) {
					System.out.println("\r\nDiese Nachricht enthält ungültige Zeichen!");
				} else {
					System.out.println("\r\nunbekannter Fehler");
				}
			}
		}
	}

	private Socket getSocket() throws UnknownHostException, IOException {
		if (socket == null) {
			socket = new Socket("172.29.0.25", 1432);			
		}
		return socket;
	}

	private Scanner getScanner() throws UnknownHostException, IOException {
		if (scanner == null) {
			scanner = new Scanner(getSocket().getInputStream());
		}
		return scanner;
	}

	public void closeSocket() throws UnknownHostException, IOException {
		getSocket().close();
	}

	public void closeScanner() throws UnknownHostException, IOException {
		getScanner().close();
	}
}



Aber jetzt tritt das Problem aus und gibt mir diese Exception


IsConnected: true
isOutputShutdown: false
Test      4

<?xml version="1.0"?><result><cmgs length="7">SMS accepted</cmgs></result>

Die Nachricht wurde gesendet!
IsConnected: true
isOutputShutdown: false
Test      4

Exception in thread "main" java.lang.NullPointerException
	at GSM_Modem.Modem.ErrorCheck(Modem.java:84)
	at GSM_Modem.Modem.checkOutput(Modem.java:80)
	at GSM_Modem.Modem.main(Modem.java:31)


----------



## Andi_CH (21. Sep 2011)

Hallooooo - beachte bitte den dezenten roten Text über dem Eingabefenster - auch ein Azubi kann lesen!


----------



## SlaterB (21. Sep 2011)

und ist doch ziemlich offensichtlich, 
str in checkOutput() ist zunächst null,

die komplizierte Schleife
> while (getScanner().hasNext() && i < timeout) {
hat dem vielleicht nichts hinzuzufügen (immer alles mit System.out.println() abklären, ob ausgeführt usw.)
checkError() mit Parameter null ist dann eben Katastrophe


----------



## Andre1992 (21. Sep 2011)

oh xD


```
package GSM_Modem;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.Scanner;

public class Modem
{
	Socket socket = null;
	Scanner scanner = null;
	
	public static void main(String[] args) throws UnknownHostException,IOException, InterruptedException {
		Modem modem = new Modem();
		String text = "Test";
		
		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text)+"(1)");
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		
		
		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(2)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		
		
		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(3)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		
		
		modem.sendMessage("(meine Telefonnummer)", modem.checkTextOfSpecialCharacter(text+"(4)"));
		System.out.println(text + "      " + text.length());
		Thread.sleep(1000);
		modem.checkOutput();
		modem.closeSocket();
		
	}

	public void sendMessage(String nummer, String text)throws UnknownHostException, IOException {
		OutputStream out = getSocket().getOutputStream();
		PrintWriter printer = new PrintWriter(out, true);
		System.out.println( "IsConnected: " + getSocket().isConnected());
		System.out.println( "isOutputShutdown: " + getSocket().isOutputShutdown());
		printer.println("<?xml version=\"1.0\"?> <cmgs destaddr=\"" + nummer + "\">" + text + "</cmgs>");
	}

	private String checkTextOfSpecialCharacter(String text)
	{
		if (text == null) 
			System.out.println("Eine leere SMS wird versendet!");; 
		
		List<Tuple> replaceData = new ReplaceCharList().getReplaceData();
		for (Tuple tuple : replaceData) {
			text = text.replaceAll(tuple.getVon(), tuple.getNach());
		}
		return text;		
	}

	public void checkOutput() throws UnknownHostException, IOException, InterruptedException {
		String str = null;
		int timeout = 10;
		
		int i = 0;
		while (getScanner().hasNext() && i < timeout) {
			str = getScanner().nextLine();
			System.out.println("\r\n" + str);
			Thread.sleep(1000);
			i++;
		}

		ErrorCheck(str);
	}

	private void ErrorCheck(String str) {
		if (str.contains("length=\"160\"")) {
			System.out.println("\r\nDie Nachricht wurde zum Teil gesendet! (SMS wurde bis zum 160sten Zeichen versendet. Alle Zeichen darüber wurden nicht versendet!)");
		} else {
			if (str.contains("SMS accepted")) {
				System.out.println("\r\nDie Nachricht wurde gesendet!");
			} else {
				if (str.contains("invalid token")) {
					System.out.println("\r\nDiese Nachricht enthält ungültige Zeichen!");
				} else {
					System.out.println("\r\nunbekannter Fehler");
				}
			}
		}
	}

	private Socket getSocket() throws UnknownHostException, IOException {
		if (socket == null) {
			socket = new Socket("172.29.0.25", 1432);			
		}
		return socket;
	}

	private Scanner getScanner() throws UnknownHostException, IOException {
		if (scanner == null) {
			scanner = new Scanner(getSocket().getInputStream());
		}
		return scanner;
	}

	public void closeSocket() throws UnknownHostException, IOException {
		getSocket().close();
	}

	public void closeScanner() throws UnknownHostException, IOException {
		getScanner().close();
	}
}
```


----------



## Andre1992 (21. Sep 2011)

Also befindet sich der Fehler in der selbst geschriebenen Methode: checkOutput() ??

Was muss ich denn ändern damit es funktioniert?


----------



## Andi_CH (21. Sep 2011)

```
List<Tuple> replaceData = new ReplaceCharList().getReplaceData();
```

Was ist Tuple und was ist ReplaceCharList?


----------



## SlaterB (21. Sep 2011)

du brauchst einen Kopf zum Denken, du musst erstmal auf dem Papier überhaupt überlegen was passieren soll,
setzt die Methode zwingend voraus das etwas aus dem Socket zu lesen ist oder was soll exakt passieren wenn nicht

Schritt für Schritt einen Befehl nach den anderen setzen, jeden begründen, jeden loggen/ in der Ausführung nachvollziehen,
Java ist nur die Umsetzung, erst muss ein Konzept bestehen,
ich kenne deins nicht, was soll ich da rumraten


----------



## Andre1992 (21. Sep 2011)

Tuple:


```
package GSM_Modem;

public class Tuple {
	final private String von;
	final private String nach;
	
	public Tuple(String von, String nach) {
		this.von = von;
		this.nach = nach;
	}

	public String getVon() {
		return von;
	}

	public String getNach() {
		return nach;
	}

}
```


ReplaceCharList:

```
package GSM_Modem;

import java.util.ArrayList;
import java.util.List;

/**
 * Gibt die zu ersetzenden Zeichen an
 * @author Aku
 *
 */
public class ReplaceCharList {

	public List<Tuple>getReplaceData() {
		List<Tuple> ret = new ArrayList<Tuple>();
		ret.add(new Tuple("&", "&"));
		ret.add(new Tuple("'", "&apos;"));
		ret.add(new Tuple("<", "<"));
		ret.add(new Tuple(">", ">"));
		ret.add(new Tuple("\"", """));
		ret.add(new Tuple("Ä", "Ä"));
		ret.add(new Tuple("Ö", "Ö"));
		ret.add(new Tuple("Ü", "Ü"));
		ret.add(new Tuple("ä", "ä"));
		ret.add(new Tuple("ö", "ö"));
		ret.add(new Tuple("ü", "ü"));
		ret.add(new Tuple("ß", "ß"));
		ret.add(new Tuple("€", "€"));
		ret.add(new Tuple("§", "§"));	
		ret.add(new Tuple("°", "º"));
		
		ret.add(new Tuple("`", " "));
		ret.add(new Tuple("´", " "));
		ret.add(new Tuple("²", "^2"));
		ret.add(new Tuple("³", "^3"));
		ret.add(new Tuple("µ", "mikro"));

		ret.add(new Tuple("á", "a"));
		ret.add(new Tuple("é", "e"));
		ret.add(new Tuple("í", "i"));
		ret.add(new Tuple("ó", "o"));
		ret.add(new Tuple("ú", "u"));
		ret.add(new Tuple("ý", "y"));
		ret.add(new Tuple("Á", "A"));
		ret.add(new Tuple("É", "E"));
		ret.add(new Tuple("Í", "I"));
		ret.add(new Tuple("Ó", "O"));
		ret.add(new Tuple("Ú", "U"));
		ret.add(new Tuple("Ý", "Y"));
		
		ret.add(new Tuple("à", "a"));
		ret.add(new Tuple("è", "e"));
		ret.add(new Tuple("ì", "i"));
		ret.add(new Tuple("ò", "o"));
		ret.add(new Tuple("ù", "u"));
		ret.add(new Tuple("À", "A"));
		ret.add(new Tuple("È", "E"));
		ret.add(new Tuple("Ì", "I"));
		ret.add(new Tuple("Ò", "O"));
		ret.add(new Tuple("Ù", "U"));

//		ret.add(new Tuple("\\", "\\\\"));
		
		return ret;
	}
}
```

ReplaceCharList ersetzt eigentlich nur die Zeichen die man in XML nicht schicken kann


----------



## Andi_CH (21. Sep 2011)

Mit Kompilationsfehler auf Zeile 19 in Replace ---- da fehlt ein \ 

Ich belästige mal google und mache


```
socket = new Socket("209.85.148.103", 80);
```

aber da blockiert mich

```
str = getScanner().nextLine();
```

auf ewige Zeiten.

Was hast du auf 172.29.0.25 port 1432 am Laufen?


----------



## Andre1992 (22. Sep 2011)

Ein GSM Modem... Das versendet dann die SMS... In diesem Modem ist die Handykarte mit dem Guthaben


----------



## Andi_CH (22. Sep 2011)

Oh schade dass ich den nicht erreiche 

Das Problem dürfte nun die Kommunikation zwischen Programm und Modemsoftware sein - ohne diese zu kenne wird es schwierig zu helfen.

Da wird dir wohl nicht viel übrig bleiben als die Doku der Modemsoftware zu :rtfm:


----------



## Andre1992 (22. Sep 2011)

ok dankeschön


----------

