# Kommunikation zw. Server und mehreren Clints haut nicht hin



## JDuke (23. Apr 2005)

Hellas!

Ich möchte gerne eine Verbindung zwischen einem Server und mehreren Clients herstellen.
Das gehört zu einem kleinen Spiel, das ich programmiere. In dem die Reaktionszeit des Clients getestet wird.
Bei der kommunikation hab ich noch ein kleines Problem.
Der Server registriert zwar dass sich ein Client angemeldet hat, jedoch wenn ich probiere etwas vom Client zum Server zu schicken bekommt dieser nichts!
Als vorlage habe ich den Server - Client Chat von diesem Forum verwendet.


Hier der Quellcode:

:arrow: Client.java

```
package ClickDaPic.client;

import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.*;

public class Client
{
	Socket s;
   	PrintWriter out;
 	BufferedReader in;

   	private String ip;
   	private int port;

   	public Client(String ip, int port) {
      	this.ip=ip;
      	this.port=port;
      	
   	}
   
   	public void startClient()
   	{
   		try
   		{
   		s = new Socket(ip, port);
      		out = new PrintWriter(new DataOutputStream(s.getOutputStream()));  
      		System.out.println ("Starte Client...");
      		new ClientBody(s.getInputStream()).start();   
      		System.out.println("Client gestartet...\n\n");  
   		}
   		catch(UnknownHostException e)
   		{
   			System.out.println ("[ERROR] Host not found\n"+e.getMessage()+" in "+getClass().getName());
   		}
   		catch(IOException e)
   		{
   			System.out.println ("[ERROR] Server not found\n"+e.getMessage()+" in "+getClass().getName());
   		}

   		System.out.println ("Sending test");
   		send("time|mani"+(int)(Math.random()*10)+"|"+(int)(Math.random()*1000));
   		System.out.println ("time|mani"+(int)(Math.random()*10)+"|"+(int)(Math.random()*1000));
   		System.out.println ("Testtime sent!");
	   	
   	}
   	
   	public void send(String msg)
   	{
   		out.println(msg);	
   	}

}
```

:arrow:  ClientBody.java

```
package ClickDaPic.client;

import java.io.*;


public class ClientBody extends Thread
{
	private InputStream i;
	private String msg;
	private BufferedReader in;
   	
   	public ClientBody(InputStream i) {
      	this.i=i;
   	}
	
	public void run()
	{
		String[] result;
		
		try
		{

			in = new BufferedReader(new InputStreamReader(i));
			msg = in.readLine();
			while(!msg.contains("stop"))
			{	System.out.println (msg);
				if(msg.contains("show"))
				{	
					result = msg.split("|");
				}
				
			}
		
		}
		catch(IOException e)
		{
			System.out.println ("[EROOR] IO Error\n"+e.getMessage()+" in "+getClass().getName());
		}
	}
}
```

:arrow: Server.java

```
package ClickDaPic.server;

import java.util.*;
import java.net.*;

public class Server
{
	private int port;
	private Hashtable clients;
	private int counter;
	
	public Server(int port)
	{
		this.port = port;
		clients = new Hashtable();
	}
	
	private void startServerListener() 
	{
    	ServerSocket ss ;
      	try 
      	{
      		ss = new ServerSocket(port);
         	System.out.println("Server gestartet...");
         	while (true)
         	{   
            	new ServerBody(ss.accept(), this).start();
            	System.out.println ("Online Clients: ["+(++counter)+"]");   
      		}	
      	}
      	
      	catch (Exception e) 
      	{
         	System.out.println ("[ERROR] "+e.getMessage()+" "+getClass().getName());
        }
 
   	}
   	
  	public void broadcast(String name, String msg) throws Exception {
   	for (Enumeration e = clients.keys();e.hasMoreElements();)         
     	((ServerBody) clients.get((String) e.nextElement())).send(name + ": " + msg);     
 	}
 	
 	public void send(String name, String targetname, String msg) throws Exception {
      	((ServerBody) clients.get(targetname)).send(name + ": " + msg);     
   	}
   	
   	public void removeClient()
   	{
   		counter--;
   	}
   
     
  	public static void main(String[] args)
	{
		new Server(1234).startServerListener();
	 	
	}
}
```

:arrow:ServerBody.java

```
package ClickDaPic.server;

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

class ServerBody extends Thread{
   	private Socket cs;
   	private Server server;
   	private PrintWriter out;
   	private BufferedReader in;
   	String input;
   	String output;

   	public ServerBody(Socket cs, Server server) {
      	this.cs=cs;
      	this.server=server;
   	}
   	
   	public void run()
   	{

		try 
		{  
         	in = new BufferedReader (new InputStreamReader(cs.getInputStream()));
         	out = new PrintWriter(new DataOutputStream(cs.getOutputStream()));         
        
        	
			System.out.println ("Input?");       //Das wird noch ausgegeben *****
			input = in.readLine();                   //Hier tut sich nichts mehr
			System.out.println ("Received?");  //Wird nicht mehr ausgegeben
			while(!input.contains("stop"))
			{	
				System.out.println (input+" Received");
				String[] substring;
				substring = input.split("|");
				if(substring[0].equals("time"))
					System.out.println ("Recorded Time!");
			}
		
		}		
		catch(Exception e)
                {
			System.out.println ("[ERROR]\n"+e.getMessage()+" in "+getClass().getName());
			server.removeClient();
		}
		         	
   	}
   	
   	public void send(String output) throws Exception {
      	out.println(output);
      	out.flush();
   	}
}
```

Das ist nur ein "dummer" prototyp woduch ich mich ein wenig in die Kommunikation einarbeiten wollte...
**** Ab hier tut sich nichts mehr... ich finds einfach nicht raus warum. Vielleicht hilft ein Blick eines Außenstehenden.

Danke für die Hilfe schon mal im Voraus
Greetz


----------



## mightymop (25. Apr 2005)

die methode readline() und konsorten wie read... sind blockierende calls... dass heißt sie wartet solange bis daten im stream zum lesen bereitstehen... wie deinen kommentaren zu entnehmen ist kommt der irgendwann an der methode an und wartet nun auf daten... 



hast du denn daten geschickt? wenn ja hast du es mal mit haltepunkten versucht? und geschaut ob die verbindung zu dem zeitpunkt wo du daten losgeschickt hast überhaupt noch bestand? am besten immer in der catch anweisung des tryblocks n haltepünktchen setzen... dann siehst du sofort wenn ein fehler aufgetreten ist dass er rausspringt udn kannst der exception variable entnehmen was schief gegangen ist... blabla

mfg 
mightymop


----------



## SebiB90 (25. Apr 2005)

zeig mal die main methode vom client

*Nachtrag:*
fehler gefunden nach out.println() immer *out.flush() *machen!!! sonst wird es nicht abgeschickt, steht auch in den FAQ so.


----------

