Echo Server + Client

  • Themenstarter Themenstarter rd3an
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
R

rd3an

Gast
Hallo,

bin Schüler einer HTL und hab heute von einem Lehrer die Aufgabe bekommen einen Echo Server mit dazupassendem Client zu schreiben, z.B:

Client sendet "Hallo Server"
Server antwortet "Hallo Server"

weiters soll die Antwort des Server noch in einer GUI dargestellt werden, aber das ist nicht das Problem.

Mein derzeitiger Code sieht so aus:

Code:
import java.io.*;
import java.net.*;


public class EchoServer {
	
	private static void handleConnection( Socket client ){ 
		BufferedReader br=null;
		BufferedWriter bw=null;
		try{
		InputStreamReader is = new InputStreamReader(client.getInputStream(),"utf8");
		OutputStreamWriter ow = new OutputStreamWriter(client.getOutputStream(),"utf8");
		
		br = new BufferedReader(is);
		bw = new BufferedWriter(ow);
		
		String reply = br.readLine();
		bw.write(reply);
		bw.flush();
		}
		catch(IOException ioe){
			ioe.getMessage();
		}
		finally{
			if(br!=null) try{br.close();}catch(IOException e){}
			 if(bw!=null) try{bw.close();}catch(IOException e){}
		}
	  } 
	 
	  public static void main( String[] args ) throws IOException { 
	    ServerSocket server = new ServerSocket(1337); 
	 
	    while ( true ){ 
	      Socket client = null;
	      try{ 
	        client = server.accept(); 
	        handleConnection ( client ); 
	      } 
	      catch ( IOException e ) { 
	        e.printStackTrace(); 
	      } 
	      finally { 
	        if ( client != null ) 
	          try { client.close(); } catch ( IOException e ) { } 
	      } 
	    } 
	  } 
}

Bzw. der Client

Code:
import java.net.*; 
import java.io.*; 
 
public class EchoClient{
	
  public static void main( String[] args ) 
  { 
    Socket server = null; 
    
    BufferedReader br=null;
    BufferedWriter bw=null;
    try 
    { 
      server = new Socket( "localhost", 1337 ); 
      InputStreamReader is = new InputStreamReader(server.getInputStream(),"utf8");
      OutputStreamWriter ow = new OutputStreamWriter(server.getOutputStream(),"utf8");
      br= new BufferedReader(is);
      bw= new BufferedWriter(ow); 
      
      bw.write("Hallo Server");
      bw.flush();
    
      String reply=br.readLine();
      System.out.println(reply);
    } 
    catch ( UnknownHostException e ) { 
      e.printStackTrace(); 
    } 
    catch ( IOException e ) { 
      e.printStackTrace(); 
    } 
    finally 
    { 
      if ( server != null )  try { server.close(); } catch ( IOException e ) { } 
	  if(br!=null) try{br.close();}catch(IOException e){}
      if(bw!=null) try{bw.close();}catch(IOException e){}
    } 
  } 
}

Senden funktioniert problemlos, der Server empfängts auch, dann sende ich die Antwort und genau hier ist mein Problem.

Wie man im Code vom Client sieht will ich nachdem ich gesendet hab sofort die Antwort vom Socket einlesen, ich nehme mal stark an ich muss bevor ich lesen kann warten (wäre nur logisch)

Aber wie kann ich das "warten" auf eine Antwort realisieren? (gibts sowas wie server.accept() für normale Sockets ?)

Oder hab ich einen anderen Fehler im Code den ich ganz einfach übersehen hab ? (Zur Info, der Client bleibt mir beim readLine() hängen, danach wird nichts mehr ausgeführt)

Ich hoffe es kann mir jemand helfen, Danke im Vorraus

lg rd3an
 
Code:
		       _ois = new ObjectInputStream(new BufferedInputStream(_socket.getInputStream()));
		        
		       
		       while (_ClientOk) {
		        	
		    
		        	Object object = null;
		      
		        	try {
			            object = _ois.readObject();
                                    if (object instanceof String) {	
                                      String hallo = (String)object;
                                    }
                                } catch (EOFException e) {
		        	
		        			
		        			e.printStackTrace();
		        			
						} catch (IOException ioe) {
				        	
				        	_ois.close();
				        	_socket.close();
				        	break;
						}

}

So müsste das klappen


er bleibt bei readline hängen weil er dort wartet bis etwas in den stream geschrieben wird



EDIT habt das problem gefunden! Es liegt daran das readLine(); eine zeile erwartet. Du deine zeile aber nie schließt. du musst einfach ein \n an dein string anfügen dann klappt das 🙂

Code:
 bw.write("Hallo Server \n");
 
Vielen Dank, dank dem EDIT von dir funktionierts, dann mach ich mich mal an die GUI , schönen abend noch =)!
 
hab ich vergeesen raus zu nehmen. repräsentiert einfach true, das da bei mir in verschiedene threads lief habe ich damit alles anhalten können.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben