Multiclient Chat

  • Themenstarter Themenstarter fluxy
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
F

fluxy

Gast
Hallo ich habe mir vorgenommen, einen multiclient Chat zu programmieren. Allerdings klappt das nicht so ganz. Es werden zwar meine Clienten abgenommen und über den Telnet kommt auch eine Willkommensnachricht an, allerdings funktioniert weder das senden noch das Empfangen.


Vom Prinzip her mache ich folgendes:


In meiner Serverklasse richte ich die Sockets ein:

Code:
    //Server.java
    
    // hier eben die Membervariablen der Serverklasse
    private ServerSocket mainSocket;
    private Socket waitSocket;
    private final int PORT = 12344;
    private final String IP = "127.0.0.1";
    private final int nPosClients = 10000;
    private User userPool[];
    private int nClients;

    public Server() throws IOException
    {

        nClients = 0;
        userPool = new User[nPosClients];
        mainSocket = new ServerSocket(PORT);
        waitForClients(waitSocket, "Willkommen.");
    }


und starte dann einen neuen Thread, und zwar für jeden User:

Code:
    //Server.java

    private void waitForClients(Socket waitSocket, String welcomeMessage) 
    throws IOException
    {

        while (true)
        {

            waitSocket = mainSocket.accept();
            System.out.println("New Client connected");

            // Starte neuen Userthread
            // =========================
            userPool[nClients] = new User(waitSocket);
            userPool[nClients].statup("Willkommen");
            userPool[nClients].start();
            nClients++;

        }


hiermit soll für jeden Client ein neuer Thread erzeugt werden. Die startup methode erzeugt dann die Streams und gibt eine Willkommensnachricht an den Clienten zurück (über das Socket)

Code:
    //Users.java

    public void statup(String welcomeMessage) throws IOException
    {

        m_outputStream = new BufferedOutputStream(m_userSocket.getOutputStream());
        m_inputStream = new BufferedInputStream(m_userSocket.getInputStream());

        m_outputStream.write(welcomeMessage.getBytes());
        m_outputStream.flush();  

    }



Jetzt habe ich mir gedacht kann ich in meinem Thread (Die Userklasse ist von Thread abgeleitet deshalb auch die start-methode) in einer Endlosschleife immer wieder den selben String an den Client senden (aber es kommt hier nix an:

Code:
    //User.java

    public void run()
    {

        StringBuffer tmp = new StringBuffer(64);
        StringBuffer msg = new StringBuffer(64);
        tmp.append("Neuer User connected:  ");
        tmp.append("TESTUSER");
        System.out.println(tmp);

        while (true)
        {

            try
            {
                StringBuffer test = new StringBuffer (64);
                msg.append("test");
                m_outputStream.write(test.toString().getBytes());
                m_outputStream.flush();  
                //sleep(1000);

            }
           
            catch (IOException e)
            {
            }

        }

    }



Information: Im Client starte ich analog dazu einen Thread, der für das Empfangen zuständig ist. Mache ich konzeptionell irgendwas falsch oder ist im Code ein Fehler? Ich bin mir noch nicht ganz sicher, wie ich das realisieren sollte, vielleicht kann sich das ja mal jemand anschauen.


Gruß
 
Kann es sein, das du auf Client-Seite eine ganze Zeile lesen willst (readLine())? Du sendest nämlich keinen Zeilenumbruch...
 
Nein ich konnte beim Clienten irgendwie keinen BufferedInput(Output)Stream erzeugen, darum habe ich es noch ungebuffered. Hier die Run-Methode des Client-Threads:


Code:
public void run ()
	{
	    while (true)
	    {
	        StringBuffer revMessage = new StringBuffer (64);
	        int nrev = 0; 
	        while (nrev != -1)
	        {
	            try
                {
                    nrev = inputData.read();
                    revMessage.append(nrev);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
	        }
	        
	        
	        //String ausgeben
	        String msg = revMessage.toString();
	        System.out.println("Neuer String empfangen: " + msg);
	        display.add(msg);
	        
	    }
	}
 
hmmm laso direkt mal eine Frage:



Du machst deine Streamobjekte so:


BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));




ich habe jetzt:


Code:
m_outputStream = new BufferedOutputStream(m_userSocket.getOutputStream()); 
        m_inputStream = new BufferedInputStream(m_userSocket.getInputStream()); 
/code]


gemacht. Macht das einen Unterschied? Ich meine es sind ja beides BufferedStreams, obwohl du nen Expliziten Writer hast.
 
API lesen.

Versuche mal mit deiner Variante eine ganze Zeile zu lesen, einen String zu schreiben, oder überhaupt nen Char.
 
hmmm also ich habe jetzt mal deine genommen und bei mir klappt jetzt überhaupt nix mehr
 
Hallo,


ich habe es jetzt wieder hinbekommen das das senden wieder klappt. Allerdings klappt der Client noch nicht so ganz. Muss ich eigendlich kein bind () und accept () machen?! bei dir im tut steht davon nix....
 
server:

Code:
ServerSocket ss = new ServerSocket(1234);
Socket s;

s = ss.accept();

Client:

Code:
Socket s = new Socket("ip vom server", 1234);
 
hmm ich habe es es war ein anderes problem danke für eure hilfe!!!
 
Und wo lag das Problem nun???
Bin momentan selbst auch an sowas ähnlichem Beschäftigt und würde das gerne wissen damit mir das im laufe der entwicklung nicht auch passiert!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben