# Problem beim Senden von Client zu Server



## avus17 (27. Apr 2014)

Also ich bin gerade dabei mich in die Netzwerkprogrammierung einzuarbeiten. Daher programmiere ich gerade ein Chat. Jedoch habe ich nun immer ein Problem mit dem Versenden der Daten. Ich versende mit:

```
try {
					
					out.write(input.getText());
					out.newLine();
					out.flush();
					//sock.shutdownOutput();

				} catch (IOException e2) {
					e2.printStackTrace();
				}
```
Nun habe ich das Problem dass das Senden nur funktioniert wenn ich "sock.shutdownOutput();" 
dahinter schreibe. Jedoch kann ich dann ja nur einmal twas versenden und nicht mehrmals. Lasse ich es weg, passiert eigentlich garnichts.
Kann mir einer sagen woran das liegt, und wie man das lösen kann???
Ich wäre über Hilfe sehr dankbar.


----------



## turtle (27. Apr 2014)

> passiert eigentlich garnichts


Und was passiert wirklich?

Du musst uns jedenfalls mehr von deinem Code zeigen, damit wir helfen können.


----------



## avus17 (27. Apr 2014)

Ok dann poste ich nochmal etwas mehr on dem Code:

Beim drücken des "start"-Buttons werden die Reader, und der Socket ... erstellt.
Server-IP und Port werden vorher in einem Menü eingegeben und in den Variablen
serverIP und serverPort gespeichert.
Der Inhalt aus der JTextArea "input" soll bein drücken des senden-Buttons an den server gesendet werden.


```
public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand()== send.getActionCommand()){
			try {	
				out.write(input.getText());
				out.newLine();
				out.flush();
				//sock.shutdownOutput();
			} catch (IOException e2) {
				e2.printStackTrace();
			}
		         input.setText("");
		}

                .......

		if(e.getActionCommand()== start.getActionCommand()){
			try {
				started = true;
				// create socket, Input and output stream
				InetAddress Server_IP = InetAddress.getByName(serverIP);
				sock = new Socket(Server_IP,serverPort);
				in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
				out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
				// start Thread to receive from server
				reciever = new Thread(this);
				reciever.start();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
```

Außerdem wird beim drücken des "start"-Buttons ein Thread gestartet, welcher auf Nachrichten vom server wartet, und diese anzeigt:


```
public void run() {
		while(started){
			try {			
				String tmp = in.readLine();
					if (tmp != null){
						addToOutput(tmp + "\n");
						setOutput();
					}
			}	
			 catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}
```

Wenn ich mit "socket.shutdownOutput()" das Programm starte, gibt der Server die Nachricht aus.
Wenn ich es aber weglasse ist nichts zu sehen, auch keine Fehlermeldungen in der Konsole etc.


----------



## anti-held (28. Apr 2014)

Versuche doch mal mit dem Debugger zu schauen, wo der Thread hängen bleibt.


----------



## avus17 (28. Apr 2014)

Also ich habe das ganze jetzt mal durch den Debugger von Eclipse laufen lassen. 
Eigentlich läuft alles genau so ab, wie es soll, nur dass eben nichts gesendet wird. 
Die Eingegebenen Zeichen kann man im Debugger auch im BufferedWriter finden, sie werden nur nicht gesendet. Kann es sein dass das flush() nicht richtig funktioniert??? Wenn es hilft kann ich auch nochmal den kompletten Code hochladen.

EDIT:

Ich habe gerade noch mal den Server durch den Debugger laufen lassen, und dort kommt absolut nichts an. Vondaher denke ich mal es wird irgendwie am flush() liegen oder???


----------



## anti-held (28. Apr 2014)

Versuche doch mal anstatt dem BufferedWriter direkt Bytes in den Outputstream zu schreiben.


----------



## avus17 (28. Apr 2014)

Ok danke für den Tipp, das werde ich gleich mal testen.


----------



## avus17 (28. Apr 2014)

Also ich habs nochmal getestet, diesmal so: 

```
public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand()== send.getActionCommand()){
			
				try {
					inputString = input.getText();
					outputSt.write(inputString.getBytes());
					outputSt.flush();
					/*out.write(input.getText());
					out.newLine();
					out.flush();
					//sock.shutdownOutput();
					  */
					

				} catch (IOException e2) {
					e2.printStackTrace();
				}
			input.setText("");
		}
		
...

		if(e.getActionCommand()== start.getActionCommand()){
			try {
				started = true;
				// create socket, Input and output stream
				InetAddress Server_IP = InetAddress.getByName(serverIP);
				sock = new Socket(Server_IP,serverPort);
				in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
				out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
				outputSt = sock.getOutputStream();
				// start Thread to receive from server
				reciever = new Thread(this);
				reciever.start();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
```

Jedoch erhalte ich imernoch nur eine Nachricht am Server wenn ich ein sock.shutdownOutput();
dahinter setze. Ich hab es auch schon ohen flush(); getestet, funktioniert aber auch nicht.


Ich habe mal im Anhang den ganzen Code hochgeladen. Beim Server sind einige Buttons und ein Eingabefeld das nicht genutzt wird, also einfach wegdenken. Vor dem Start muss man beim Server oben im Menü den Port angeben, und beim Client muss man vor dem starten die Server-IP und den Server-Port eingeben.


----------



## avus17 (29. Apr 2014)

Ich habe das Programm gerade noch einmal gestestet, und festgestellt, dass ich vom Server zu Client senden kann. Kann es sein dass der socket vom client irgendwie durch das ständige warten auf servernachrichten blockiert wird???

Das warten habe ich so realisiert:

```
public void run() {
            while(started){
                try {          
                    String tmp = in.readLine();
                        if (tmp != null){
                            addToOutput(tmp + "\n");
                            setOutput();
                        }
                }  
                 catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
```


----------



## anti-held (30. Apr 2014)

Wenn das Warten und das Senden in verschiedenen Threads passieren, blockieren sie sich nicht gegenseitig.

Schreibe dein Programm so um, dass nach jedem gesendetem Text der Socket geschlossen wird.
Für jeden Text gibt es einen eigenen Socket.
Der Server wartet sowiso in der Schleife auf anfragen.
Und da anscheinend bei einem [c]socket.close();[/c] alles versendet wird sollte es funktionieren.


----------



## avus17 (3. Mai 2014)

Danke für den Tipp, ich habe es jetzt ungeschrieben und jetzt funktioniert es endlich.


----------

