# Java Client - C Server



## IceTi (28. Mai 2008)

Hallo,

ich habe da einen Client in Java und einen Server in C. 
Der Client sendet dem Server immer Daten über einen Socket. 

Manche Daten (immer nur Zahlen) werden vom Server ausgewertet und dann direkt wieder an den Client, welcher ihm die Daten geschickt hat, zurückgesendet z.B. 1, 5 oder 20, 39. Die Zahlen werde also nur durchgeschleift!

Anderen Daten, nähmlich bestimmte Zahlen wie z.B. 200 oder 300 bewirken, dass allen Clients die zum Server verbunden sind entsprechende andere Daten bekommen. Ich schicke dem Server z.B. 200 und dann eine 3. Nun bekommen alle Clients Daten.

Das funktieniert soweit auch alles bis auf das an alle senden. Hier erstmal mein Client:


```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class Client{

	// Variablen 
	private int port = 4711;	
	private String serverName = "192.168.0.210";
//	private String serverName = "localhost";
	private Socket client;
	private BufferedWriter out;	
	public BufferedReader in;
	
	// Konstruktor
	Client() throws IOException{
		client = new Socket (serverName, port);
		out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
		in = new BufferedReader(new InputStreamReader(client.getInputStream()));
	}
	
	// Sendet Daten an den Server
	public void sendData(String outgoing) throws IOException{
		out.write(outgoing);
		out.newLine();
		out.flush();
	}
}
```

Und hier die Main Klasse wo ich die Daten vom Serverf abrufe:

```
...

		try {
			client = new Client();
		} catch (IOException e3) {		e3.printStackTrace();		}


...

	public void run(){
		while(true){
	    	try {

			incoming = client.in.readLine();
	    	System.out.println("Client empfängt: "+incoming);
	    	
		}
	    	} catch (IOException e) { 	}
		try {
			Thread.sleep(20);
			} catch (InterruptedException e) {	e.printStackTrace();	}
		}

...
```


Also wenn ich Daten zum Server schicke die dann an alle geschickt werden sollen, bekommt ich diese bei System.out erst angezeigt wenn ich dem Server Daten schicke dir nur mir zugesand werden sollen (bzw. einfach durchgeschliefen werde). Die Daten die ich dann bekomme sehe z.B. so aus:






Hoffe das Problem ist klar geworden. Irgendwie Bufferd der InputStream zu lange oder sowas?

Woran kann das liegen?

Achso: Wenn ich mich via Telnet zum Server verbinde und dann Daten an alle schicke, sehe ich die in Telnet sofort und auch ohne die Vier-Ecke.


Könnt ihr mir da helfen ?

DANKEEEEE


----------



## IceTi (28. Mai 2008)

Hat da keiner ne Idee ?


----------



## thE_29 (29. Mai 2008)

Schickt das C Programm den ein \n\r mit? Sodaß readLine() auch gelesen werden kann?


----------



## IceTi (29. Mai 2008)

Leider habe ich den C-Server zur Zeit nicht zur Verfügung, ich ich weiss nur das genau auf die gleiche Art wie nur zu einem Client geschickt wird.

wenn man einfach mal davon ausgeht, dass der Server alles richtig macht. woran könnte es dann am Applet liegen ?


----------



## DamienX (29. Mai 2008)

hmm das kann viele Probleme haben.... vllt baut der broadcast deines Servers
irgendwo mist...

wenn er \n\r weglässt kann das auch durchaus ein Problem sein ( Hatte schon mal Stunden mit diesem 
Fehler verbracht -.- )

Bräuchten n bisschen mehr info um dir zu helfen!

Grüße


----------



## IceTi (29. Mai 2008)

Was denn für Infos ? 
Den Server habe ich leider im mom nicht...


----------



## DocFaust (13. Jun 2008)

Hi IceTi,

Frag den Server doch was er schickt:


```
int char = 0;
while((char=in.read)!=-1)
{
   System.out.println(char)
}
```

Jetzt werden alle Zeichen, die der Server schickt untereinander geschrieben.

Die letzten beiden müssten 13 (CR) und 10 (LF) sein.

Wenn das nicht der Fall ist, kannst Du die Methode readLine nicht verwenden.

Dann musst Du explizit auf eine Endemeldung \r oder \n abfragen.

CU
Doc


----------



## Wildcard (13. Jun 2008)

DocFaust hat gesagt.:
			
		

> Die letzten beiden müssten 13 (CR) und 10 (LF) sein.
> 
> Wenn das nicht der Fall ist, kannst Du die Methode readLine nicht verwenden.
> 
> Dann musst Du explizit auf eine Endemeldung \r oder \n abfragen.


http://java.sun.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()


> Reads a line of text. A line is considered to be terminated by any *one of* a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.


----------



## DocFaust (14. Jun 2008)

Ok, nachlesen bildet. Aber dennoch kannst Du sehen, ob Dein Server überhaupt etwas dergleichen schickt und entsprechend drauf reagieren.


----------

