# client/server kommunikation



## JPook (6. Nov 2005)

hallo,
ich habe mir einen server und einen client geschrieben. der client soll zum server über port 4444 eine verbindung aufnehmen. Dann soll alles was der client in die console eingibt beim server ausgegeben werden. Nur genau das klappt nicht und ich weiß absolut nicht, was an meinem code falsch ist. Compilieren geht, auch die Verbindung herstellen geht, aber die textausgabe beim server funktioniert nicht(oder der text wird erst garnicht in den outputstream des clients geschrieben)

hier mal der code:

Client Code:


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

public class Client 
{
    public static void main(String args[]) throws IOException
    {
        Socket server = null;
        OutputStream out = null;
        try
        {
            server = new Socket("localhost",4444);
            System.out.println("Connected to " + server.getInetAddress() + ":" + server.getPort());
        
            out = server.getOutputStream();
            OutputStreamWriter ou2 = new OutputStreamWriter(out);
            BufferedWriter ou3 = new BufferedWriter(ou2);
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            while (true)
            {    
                line = in.readLine();
                ou3.write(line);
                ou3.flush();
                if (line.equals("exit")) break;
            }
          
        }
        catch (IOException e)
        {
           System.out.println(e); 
        }
        finally
        {
            try
            {
                server.close();
            }    
            catch (IOException e2)
            {
                System.out.println("Verbindung zum Client nicht geschlossen!");
            }               
        }
    }
}
```

Server Code:

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

public class Server 
{
    public static void main(String args[]) throws IOException
    {
        ServerSocket server = null;
        Socket client = null;
        System.out.println("Warte auf Verbindung...");
        
        
        try
        {
            server = new ServerSocket(4444);
            while (true)
            {
                client = server.accept();
                System.out.println("mit Client über Port "+server.getLocalPort()+" verbunden");
                InputStream in = client.getInputStream();
                InputStreamReader inr = new InputStreamReader(in);
                BufferedReader inw = new BufferedReader(inr);
                String line=null;
                line = inw.readLine();
                do
                {
                    if(line != null)
                    {
                       System.out.println(line);
                    }
                } while ((line=inw.readLine()) != null);
              
            }
        }
       	catch(IOException e) 
        {
            System.err.println("Verbindung unterbrochen" + e);
            System.exit(1);
	}
	finally 
        {
            try 
            {
                server.close(); 
            }
            catch(IOException e2)
            {
                
            }
        }
    }
}
```

Wer kann mir helfen?


----------



## Grizzly (6. Nov 2005)

Ich habe mir das mal angeschaut. Hier mal mein leicht umformatierter Code:

```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		ServerSocket server = null;
		Socket client = null;
		InputStream in;
		InputStreamReader inr;
		BufferedReader inw;
		String line;
		
		System.out.println("Warte auf Verbindung...");
		try {
			server = new ServerSocket(4444);
			while (true) {
				client = server.accept();
				System.out.println("mit Client über Port "
					+ server.getLocalPort() + " verbunden");
				System.out.println("1");
				in = client.getInputStream();
				System.out.println("2");
				inr = new InputStreamReader(in);
				System.out.println("3");
				inw = new BufferedReader(inr);
				System.out.println("4");
				while ((line = inw.readLine()) != null) {
					System.out.println(line);
				}
				System.out.println("Verbindung geschlossen.");
			}
		} catch (IOException ioe) {
			System.err.println("Verbindung unterbrochen" + ioe);
			ioe.printStackTrace();
			System.exit(1);
		} finally {
			try {
				server.close();
			} catch (IOException ioe) {
				ioe.printStackTrace();
			}
		}
	}

}
```


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

public class Client {
	public static void main(String[] args) {
		Socket server = null;
		OutputStream out = null;
		OutputStreamWriter ou2;
		BufferedWriter ou3;
		BufferedReader in;
		String line;
		
		try {
			server = new Socket("localhost", 4444);
			System.out.println("Connected to " + server.getInetAddress() + ":"
				+ server.getPort());
			
			out = server.getOutputStream();
			ou2 = new OutputStreamWriter(out);
			ou3 = new BufferedWriter(ou2);
			in = new BufferedReader(new InputStreamReader(System.in));
			do {
				line = in.readLine();
				ou3.write(line + '\n');
				ou3.flush();
				System.out.println("Zeile [" + line + "] gesendet.");
			} while ((line != null) && (!line.equals("exit")));
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			try {
				server.close();
			} catch (IOException ioe) {
				System.out.println("Verbindung zum Client nicht geschlossen!");
				ioe.printStackTrace();
			}
		}
	}
}
```

Und? Die Änderung gefunden? 

Welche Entwicklungsumgebung benutzt Du eigentlich? NetBeans? Borland JBuilder? Eclipse? Zumindest bei Eclipse kann man nämlich sich da JavaDoc zu den Standard Klassen anzeigen lassen. Bei den anderen beiden IDEs müsste das eigentlich auch gehen. Da hättest Du es nämlich unter Umständen gesehen bzw. gelesen. 

Ein weitere Tipp (so mache ich das zumindest):
Wenn etwas funktioniert, am besten jede Menge Debugging Meldung einbauen (siehe auch mein Code). Dann sieht man nämlich sehr schnell, wo es klemmt. Noch besser ist es, eine Logging Bibliothek einzubauen (bspw. Jakarta Commons Logging).


----------



## JPook (6. Nov 2005)

hallo,
ja hab die Änderung gefunden -> ou3.write(line + '\n');
Das \n hat gefehlt, danach gings auch mit meinem originalcode.

Darauf wär ich nun wirklich nie gekommen.

Ich benutze seit heute netbeans.
Habe bis jetzt JOE benutzt, aber JOE hat arge Probs mit Sockets (compilieren geht, aber beim ausführen kommt ne SocketException: socket error 10106). Da saß ich auch erstmal ne Stunde und hätte ich nich google gefragt und erfahren, dass das an dem editor liegt, säße ich wohl noch jezt über dem code.

Jedenfalls danke


----------



## MJA (8. Nov 2005)

Ansonsten, für die Bequemlichkeit, kannst du zum einen PrintStream verwenden. Der bietet dir eine Methode println(), die Automatisch an den Inhalt einen Zeilumbruch anfügt. Außerdem kannst du problemlos alle primitiven Datentypen und Strings damit ausgeben. Eignet sich jedoch nicht für Binärdaten.


```
PrintStream printStream = new PrintStream(socket.getOutputStream());
printStream.println("blabla");
```


----------

