# Kommunikationsproblem zwischen JAVA-client und C-Server



## RugerRell (10. Okt 2007)

Hi zusammen,

hab eine serveranwendung in c geschrieben, welche steuerkommandos in form eines einfachen strings von einem in java-geschriebenen clienten entgegennimmt.

Danach wird der string verarbeitet, der server führt diverse aktionen durch und schickt die ergebnisse in form von einfachen strings zurück an den clienten, welcher diese ausgibt.

Das prinzip ist dem eines echo-server/-clients sehr ähnlich.

Problem: Ich öffne den clienten, verbinde zum server und schicke meinen string. Soweit läuft alles ok. Danach kann ich keine weiteren kommandos zum server senden. D.h.: Ich kann immer nur 1 kommando senden. Alle weiteren werden ignoriert. Nur ein neustart das java-clients ermöglicht mir wiederrum ein kommando zu schicken. 

Hier der code des java tools:


```
import java.net.*;
import java.io.*;

/**
 * 
 */

/**
 * @author bin4ry
 *
 */
public class echoCl1 {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Socket echoSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;
	
    try
    {
	echoSocket = new Socket("localhost", 31337);
	out = new PrintWriter(echoSocket.getOutputStream(), true);
	in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
    }
    catch (UnknownHostException e)
    {
                System.err.println(e.toString());
	System.exit(1);
    }
    catch (IOException e)
    {
	System.err.println(e.toString());
	System.exit(1);
    }
	
    BufferedReader stdIn =  new BufferedReader(new InputStreamReader(System.in));
    String userInput;
    
    try{
	while ((userInput = stdIn.readLine()) != null)
                {
	    if(userInput.equals("EXIT"))
                    {
	        	break;
	    }
	    System.out.println("userInput: " + userInput);
	    out.println(userInput);
	    System.out.println("echo " + in.readLine());
	}
	out.close();
	in.close();
	stdIn.close();
	echoSocket.close();
    }
    catch (Exception e)
    {
	System.err.println(e.toString());
    }
}
}
```

Wo liegt der fehler? Evtl. doch im server?

Danke.


----------



## RugerRell (10. Okt 2007)

Habs überprüft. liegt nicht am client. Muss am server liegen


----------



## tuxedo (10. Okt 2007)

Wenn du als registrierter User den Thread eröffnet hättest könntest du ihn jetzt als "erledigt" abhaken.

- Alex


----------



## RugerRell (11. Okt 2007)

Hey alex,

ja stimmt, bin aber nicht registriert.

Hab eine weitere frage zum selben thema:

Ich hab das soweit hinbekommen, nun hab ich wieder ein problem mit dem clienten:

Er schickt nun das gewünschte steuerkommando und der server antwortet wie gewünscht darauf. Ich hab den clienten so modifiziert, dass er mehr als nur einen string entgegen nimmt. Jedoch erkennt er irgendwie nicht richtig das "ende" der übermittlung vom server zum clienten. D.h. wenn der server fertig ist mit senden der ergebnisse an den clienten, erkennt der client das ende nicht und springt nicht richtig aus der while-schleife, sodass eine erneute kommunikation erneut behindert wird. 

Kann mir jemand einen tipp geben, wie ich das problem umgehen kann? Hier der neue quellcode des clienten:




```
import java.net.*;
import java.io.*;

/**
 * 
 */

/**
 * @author bin4ry
 *
 */
public class echoCl1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Socket echoSocket = null;
		PrintWriter out = null;
		BufferedReader in = null;
		
		try
		{
			echoSocket = new Socket("localhost", 31337);
			out = new PrintWriter(echoSocket.getOutputStream(), true);
			in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
		}
		catch (UnknownHostException e)
		{
			System.err.println(e.toString());
			System.exit(1);
		}
		catch (IOException e)
		{
			System.err.println(e.toString());
			System.exit(1);
		}
		
		BufferedReader stdIn =  new BufferedReader(new InputStreamReader(System.in));
		String userInput;
		String netInput;
		try{
		while ((userInput = stdIn.readLine()) != null)
		{
			if(userInput.equals("EXIT"))
			{
				break;
			}
			System.out.println("userInput: " + userInput);
			out.println(userInput);
			
        /* Die besagte schleife....das die abbruchbedingung ist wohl nicht korrekt */
        while((netInput = in.readLine()) != null)
			{
				System.out.println(netInput);
			}
			System.out.println("exiting while");
		}
		out.close();
		in.close();
		stdIn.close();
		echoSocket.close();
		}
		catch (Exception e)
		{
			System.err.println(e.toString());
		}
	}
}
```

Es ist bestimmt ein sehr trivialer fehler, aber ich bin recht neu beim thema java.

Danke für hilfe


----------



## tuxedo (11. Okt 2007)

Der Client springt nur aus der Schleife raus, wenn der Server die verbindung kappt. Wenn der Server keine Daten mehr durch den Socket sendet, heisst das ja noch lange nicht dass er fertig ist. Woher soll der Socket denn wissen ob nicht doch noch was kommt?

Entweder du lässt den Server nach dem senden der Antwort die Verbindung schließen, oder der Client weiß aufgrund der "korrekt" eingegangenen Antwort dass "alles da ist" und schließt die Verbindung selbst.

- Alex


----------



## RugerRell (11. Okt 2007)

Hey alex,

ja danke. Hatte auch schon an sowas gedacht, wie du es in deiner 2. lösung vorschlägst:

Ich lass also vom server am ende der übertragung einen definierten string schicken. Und das eingehen dieses strings ist für den clienten die abbruchbedingung?

Ich probier das mal aus.

Bis später


----------

