Ich habe ein Problem etwas komplizierterer Natur.
Ich schreibe gerade an einer Chatapplikation, wobei ich vorhabe, die Chat-UI dem User als Vaadin-Servlet zur Verfügung zu stellen.
In dem Moment, da die enter-Methode durchlaufen wird (die muss in jedem VaadinServlet implementiert sein), passiert folgendes:
Es wird eine write-Methode aufgerufen, die durch einen Outputstream an einen Serversocket eine Mitteilung schreibt, eine „1+currentUser“. Eins bedeutet dabei, dass der User online ist. Hier die Serverklasse, wie diese funktioniert, bitte den Kommentaren entnehmen.
Sobald sich der User angemeldet habe, habe ich im Clienten eine eventbasierte Art und Weise entwickelt, wie ich dann aus dem Chatfenster Botschaften abgreife, und wenn der User halt ne Nachricht senden will, also auf senden drückt, wird halt wieder die write-Methode aufgerufen.
--> Jetzt habe ich ein riesen Problem: Ich kann im Clientlistener keinen InputstreamReader in einer while(true) Schleife laufen lassen, weil sonst alles blkiert - was soll ich tun? Ich kann auch gerne den gesamten Quellcode posten, wenn das so erwünscht ist.
Ich schreibe gerade an einer Chatapplikation, wobei ich vorhabe, die Chat-UI dem User als Vaadin-Servlet zur Verfügung zu stellen.
In dem Moment, da die enter-Methode durchlaufen wird (die muss in jedem VaadinServlet implementiert sein), passiert folgendes:
Java:
public void enter(ViewChangeEvent event) {
//dispatch
write("1"+":"+(String)UI.getCurrent().getSession().getAttribute("currentUser")+"\n");
//reads everything incoming from the dipatcher
//HOW?????? -> Das ist mein Problem, siehe Erklärung hier im Threadpost.
}
Es wird eine write-Methode aufgerufen, die durch einen Outputstream an einen Serversocket eine Mitteilung schreibt, eine „1+currentUser“. Eins bedeutet dabei, dass der User online ist. Hier die Serverklasse, wie diese funktioniert, bitte den Kommentaren entnehmen.
Java:
package dispatching;
import java.net.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.io.*;
import com.vaadin.ui.Notification;
public class MainServer extends Thread
{
private ServerSocket serverSocket;
private HashMap<String,Socket> dispatch = new HashMap<String,Socket>();
private BufferedReader br = null;
private BufferedWriter bw = null;
public MainServer(int port) throws IOException
{
serverSocket = new ServerSocket(port);
//serverSocket.setSoTimeout(10000);//Kann am Ende weg.
}
public void run()
{
while(true)
{
try
{
Socket server = serverSocket.accept();//Bis hier is klar, ne?
try{
br = new BufferedReader(new InputStreamReader(new DataInputStream(server.getInputStream())));
String line = br.readLine();
if(line.split(":")[0].equals("1")){//Also wenn der Buddy on == 1 ist...
if(line.split(":").length==3){//Also wenn Botschfaten geschrieben warden, dann ist line.split(":")[1] immer der Adressat (addressee) und line.split(":")[2] ist immer die Message.
dodispatch(line.split(":")[1],line.split(":")[2]);
}
}
}catch(IOException e){e.printStackTrace();}
//server.close(); // ???
}catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
private void dodispatch(String addressee, String message){
//Hier will ich eine HashMap aus Benutzern, die Online sind jeweils mit deren akzeptierten Sockets als Values durchlaufen, um die an den jeweiligen Adressaten adressierte Nachricht dem richtigen Mann / Frau zuzustellen, aber erstmal habe ich es so geschrieben, dass alles an den Testuser zurückgeht, wie ein Echo, halt auch über nen Stream, sieht so zwar schlecht aus, dürfte aber klar sein, was gemeint ist.
for(String str : dispatch.keySet()){
//if(str.equals(addressee)){
/*Vorerst:*/if(str.equals("testuser")){
try{
/*Vorerst:*/bw = new BufferedWriter(new OutputStreamWriter(new DataOutputStream(dispatch.get("testuser").getOutputStream())));//This does not go to testuser3, but is echoed back t the testuser.
//bw = new BufferedWriter(new OutputStreamWriter(new DataOutputStream(dispatch.get(addressee).getOutputStream())));
bw.write(message+"\n");//If the message contained an \n, it would a spurious deed to add one more, but it doesn't.
bw.flush();
}catch(IOException e){ e.printStackTrace(); }
}
}
}
//Das ist die Main des Servers.
public static void main(String [] args)
{
try
{
Thread t = new MainServer(8754);
t.start();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Sobald sich der User angemeldet habe, habe ich im Clienten eine eventbasierte Art und Weise entwickelt, wie ich dann aus dem Chatfenster Botschaften abgreife, und wenn der User halt ne Nachricht senden will, also auf senden drückt, wird halt wieder die write-Methode aufgerufen.
--> Jetzt habe ich ein riesen Problem: Ich kann im Clientlistener keinen InputstreamReader in einer while(true) Schleife laufen lassen, weil sonst alles blkiert - was soll ich tun? Ich kann auch gerne den gesamten Quellcode posten, wenn das so erwünscht ist.
Zuletzt bearbeitet von einem Moderator: