# Sockets



## Antibus (17. Aug 2007)

hallo,
ich wollte ma wieder seit langem nen bischen java proggen. Hier ma der Code

Clien.java

```
package myfristSocketpckg;

import java.io.BufferedReader;
//import java.io.DataInputStream;
//import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Socket client = null;
		//DataInputStream in = null;
		BufferedReader inputline = null; 
		PrintWriter out = null;
		Scanner scanner = new Scanner(System.in); // java.util.Scanner
		boolean ok = true;
		String line;
		Server server = new Server();
		server.start();
		
		System.out.println("... Client started");
		
		try {
			client = new Socket("localhost",130);
			//in = new DataInputStream(client.getInputStream());
			inputline = new BufferedReader(new InputStreamReader(client.getInputStream()));
			//out = new DataOutputStream(client.getOutputStream());
			out = new PrintWriter(client.getOutputStream(), true);
		} catch (Exception e) {
			System.out.println("Connection faild");
			System.out.println(e);
			ok = false;
		}
	
		while (ok){
			System.out.print("Client : ");
			line = scanner.nextLine();
			if (line.equals("exit") | line.equals("Exit")) ok = false;
			try {
				out.write(line);
				System.out.println(inputline.readLine());
			} catch (Exception e) {
				System.out.print(e);
				ok = false;
			}
		}

		try {
			client.close();
			server.start();
			inputline.close();
			out.close();
		} catch (Exception e) {
			System.out.print(e);
		}
	}
}
```

Server.java

```
package myfristSocketpckg;

import java.io.BufferedReader;
//import java.io.DataInputStream;
//import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread{

	/**
	 * @param args
	 */
	public void run() {
		ServerSocket server = null;
		Socket client = null;
		//DataInputStream in = null;
		BufferedReader inputline = null;
		PrintWriter out = null;
		boolean ok = true;
		String line;
		
		System.out.println("... Server started");
		
		try {
			server = new ServerSocket(130);
			client = server.accept();
			//in = new DataInputStream(client.getInputStream());
			inputline = new BufferedReader(new InputStreamReader(client.getInputStream()));
			//out = new DataOutputStream(client.getOutputStream());
			out = new PrintWriter(client.getOutputStream(), true);
			out.flush();
		} catch (Exception e) {
			System.out.print("Acception faild");
			System.out.println(e);
			ok = false;
		}
	
		while (ok){
			try {
				line = "Server : " + inputline.readLine();
				out.write(line);
			} catch (Exception e) {
				System.out.print(e);
				ok = false;
			}
		}
		
		try {
			client.close();
			server.close();
			inputline.close();
			out.close();
		} catch (Exception e) {
			System.out.println(e);
		}
	}

}
```

Im Grunde ist es ziemlich simpel. Der Client startet den Server und wartet dann auf eine Eingabe. Diese Eingabe schickt der dann zum Server. Der Server schickt dann diesen Text zurück und der Client gibt es dann wieder aus.
So sollte es theoretisch funktionieren. Aber leider funktioniert es nicht ganz. Der Server bekommt die Nachricht gar nicht.
Könnt ihr mir sagen, wo mein Fehler ist??

mfg Antibus


----------



## SlaterB (17. Aug 2007)

> und der Client gibt es dann wieder aus

wo genau findet das statt?

du scheinst den Client direkt nach dem Absenden der ersten Nachricht an den Server zu schließen,
dass beendet dann auch die Connection, lass dem Server doch ein paar Millisekunden, um die Nachricht zu erhalten 

schau dir mal die Beispiele hier an:
http://www.galileocomputing.de/openbook/javainsel6/javainsel_16_008.htm
16.8 Client/Server-Kommunikation


----------



## Antibus (17. Aug 2007)

SlaterB hat gesagt.:
			
		

> > und der Client gibt es dann wieder aus
> 
> wo genau findet das statt?
> 
> ...



hier : 

Client.java

```
...
      while (ok){
         System.out.print("Client : ");
         line = scanner.nextLine();
         if (line.equals("exit") | line.equals("Exit")) ok = false;
         try {
            out.write(line);
            System.out.println(inputline.readLine());
         } catch (Exception e) {
            System.out.print(e);
            ok = false;
         }
      } 
...
```

Server.java


```
...
      while (ok){
         try {
            line = "Server : " + inputline.readLine();
            out.write(line);
         } catch (Exception e) {
            System.out.print(e);
            ok = false;
         }
      } 
...
```

Wenn man nicht gleich Exit oder exit eingibt, dann wird weder Client noch der Sever beendet sondern befinden sich dann in einer endlos Schleife. 
Danke für den Link.. werd ich mir ma anschaun.

mfg Antibus


----------



## SlaterB (17. Aug 2007)

jaja, ich seh schon dass ich mal wieder viel zu schnell geantwortet habe  , 
dafür schaue ich es mir mal genauer an, schon seltsam


----------



## SlaterB (17. Aug 2007)

zwei Fehler (hab viel ausgetauscht, weiß nicht was alles wofür verantwortlicht ist):

1.
BufferedReader.readLine() wartet brav, bis endlich eine ganze Zeile mit Zeileumbruch \n am Ende gelesen wird,
lies lieber in ein byte[]/ char[] oder achte auf \n bei jeder Nachricht


2.
autoFlush hilft nicht für write:


> * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
> *                    <tt>printf</tt>, or <tt>format</tt> methods will
> *                    flush the output buffer


out.flush();
nach jeder Nachricht tut aber auch nicht weh

oder println verwenden, das löst anscheinend beide Probleme gleichzeitig?


----------



## Antibus (17. Aug 2007)

Wenn ich Enter drücke müsste doch aber theoretisch "\n" mit gesendet werden oder??


----------



## SlaterB (17. Aug 2007)

wenn du von der Konsole alle Zeichen einlesen würdest, ja,
aber Scanner schneidet das \n ab
(mit System.out.println(line) zu testen)

genau wie der BufferedReader das beim Empfäger auch wieder abschneiden würde, Ruhm und \n sind vergänglich..


----------



## Antibus (17. Aug 2007)

Scanner schneidet das \n ab!?!?! Frechheit!! 
... ok, daran wirds wohl liegen^^
Heißen Danke.. werd ich gleich ma probieren.


----------



## SlaterB (17. Aug 2007)

und am Flush, also gleich println, das fügt automatisch ein \n an!

und bitte noch mal ein Lob für meinen Spruch 'Ruhm und \n sind vergänglich..'


----------



## Antibus (17. Aug 2007)

Großes Lob^^
Ok, werd ich ma probieren. Danke.. 
Theoretisch müsste ich das ja alles noch können. Hab ich ja alles in meinem Studium gerlent... theoretisch.^^


----------



## Antibus (17. Aug 2007)

ok, danke jetzt funktionierts...
ich musste beides machen.. 
1. das "\n" ran hängen
2. nach jedem senden flush auf rufen..

dann hats geklappt. 
also nochmal vielen dank.


----------

