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.
Und hier ist mein Client Code. Ich habe einen Loopthread der alle 3 Sekunden receiveMessage() aufruft. Vorher rufe ich natürlich auch ConnectToServer auf
Ich bin für jede Idee dankbar...
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...