Bufferedreader hängt bei Readline()

  • 1 Antworten
  • Letztes Antwortdatum
S

seaside

Neues Mitglied
0
Hallo zusammen,

ich schreibe eine Client-Server Applikation und hänge nun an einem Problem, dass mein Client sich bei Bufferedreader.readline() aufhängt.
Ich habe schon herausgefunden dass readline() so lange liest bis dass End of File erreicht ist und daher alles andere blockiert. Ich weiß aber leider nicht wie ich das Problem lösen kann. Vielleicht hat ja einer von euch eine Idee?

Ich poste auch mal meinen gesamten Server Code weil ich mir nicht sicher bin ob der Fehler vielleicht auch dort liegt.

Code:
public Server() {
		clients = new LinkedList<PrintWriter>();
	}

	// start Server and accept Clients
	public void start() {
		try {
			
			ServerSocket s = new ServerSocket(PORT);
			// accept clients
			for (;;) {
				Socket incoming = s.accept();
				new ClientHandler(this, incoming).start();
			}

		} catch (IOException ioe) {
			System.out.println(ioe);
		} catch (Exception e) {
			System.out.println(e);
		}
	}

	public void removeClient(PrintWriter out) {
		synchronized(clients) {
			System.out.println("Client removed");
		clients.remove(out);
		}
	}

	public void addClient(PrintWriter out) {
		synchronized(clients) {
			System.out.println("Client added");
		clients.add(out);
		}
	}

	public void broadcast(String msg) {
		for (PrintWriter writer : clients) {
			System.out.println("Broadcast MSG");
			writer.println(msg);
			writer.flush();
		}

	}

	public static void main(String[] args) {
		if (args.length > 0) {
            System.out.println(USAGE);
            System.exit(-1);
        }
		
		Server server = new Server();
		server.start();
	}
}

public ClientHandler(Server _server, Socket _incoming) {
		this.server = _server;
		this.incoming = _incoming;
	}

	public void run (){
		PrintWriter out = null; 
		try{
			
			out = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream()));
			
			server.addClient(out);
			
			BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
			for (;;){
				msg = in.readLine();
				if(msg == null){
					System.out.println("Msg = null");
					break; 
				}
				else {
					if(msg.trim().equals("BYE"))
						break;
					
					System.out.println("Recieved Message: "+msg);
					server.broadcast(msg);
				}
				
			}
			
			out.println("Hello"+"\n");
			out.flush();
			incoming.close();
			server.removeClient(out);
		}catch (Exception e){
			if (out != null)
				server.removeClient(out);
			System.out.println("Exception "+e.getMessage());
			//e.printStackTrace();
		}
	}

Und hier ist mein Client Code. Ich habe einen Loopthread der alle 3 Sekunden receiveMessage() aufruft. Vorher rufe ich natürlich auch ConnectToServer auf ;)

Code:
public void connectToServer() {
		Log.d("ConnecntionServer", "connect");
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					socket = new Socket(id, port);
					try {
						in = new BufferedReader(new InputStreamReader(
								socket.getInputStream()));
						out = new PrintWriter(socket.getOutputStream());
					} catch (IOException e) {
						e.printStackTrace();
					}

					 out.println("Hello Server");
					 out.flush();
					 
				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();

	}

	public void recieveMessage() {
		String msg = null;

		if(in != null)
			try {
				msg = in.readLine();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		if (msg != null)
			readMessages(msg);
		else 
			Log.d(TAG, "msg = null");
}


Ich bin für jede Idee dankbar...
 
Sendest du denn auch ein "end of line"?
ansonsten wird readLine() ewig warten.

alternativ kannst du das ganze einzeln lesen mit read().

Ebenso wäre es wahrschienlich besser, wenn du nicht characters bzw strings verschickst sondern nur bytes.
Und dann selbst entscheidest mit welchem CharSet die encodiert werden.

Es ist nämlich möglich, das sich beide Systeme nicht richtig verstehen. Weil sie ein anderes Character encoding verwenden.
Deshalb kommt möglicherweise das "end of line" niemals richtig beim client an.
 
Zurück
Oben Unten