Serwer na Socketach

Dyskusje na temat Javy.
Vektor
Nowicjusz
Posty: 1
Dołączył(a): poniedziałek, 12 listopada 2012, 19:57

Serwer na Socketach

Post przez Vektor »

Z pomocą kursów, książki o javie i informacji zebranych z netu, dałem radę napisać malutki serwer. Dzięki wątkom mogę po uruchomieniu zalogować się do niego z kilku klientów ( np telnetem ) w moim przypadku:

Code: Zaznacz cały

telnet localhost 8189

Wszystko działa. Loguję się, wpisuję jakiś ciąg znaków i serwer mi odpowiada tym samym. Ja jednak chciałbym uruchomić kilka sesji telnet-u i uzyskać efekt taki aby z jednego klienta wysłać jakiś ciąg znaków a serwer odpowiedział do wszystkich, tak aby na wszystkich zalogowanych klientach pojawił się tekst odpowiedzi.
Kombinowałem aby dynamicznie tworzyć PrintWriter'a ale zielonego pojęcia nie mam jak sprawdzić ilu klientów jest zalogowanych ... gdzieś by musiała być jakaś tablica po której trzeba by się przelecieć ... Ale zupełnie nie mam pomysłu gdzie jej szukać i jak adresować taki message do wszystkich klientów ?
Czy ktoś z kolegów podpowie mi jak to zrobić ?

Code: Zaznacz cały

import java.io.*;
import java.net.*;
import java.util.*;    

public class RadioSerwer {

    public static void main(String[] args) {
    try{
        int i =1;
        ServerSocket s = new ServerSocket(8189);
        
        while(true){
            Socket incoming = s.accept();
            System.out.println("Klient nr "+i);
            Runnable r = new Nasluch(incoming, i);
            Thread t = new Thread(r);
            t.start();
           i++;
        }
    }    
    catch(IOException e)       
    {
    System.out.println("Błąd IOException: "+ e);
    }
    }
}
class Nasluch implements Runnable {
public Nasluch (Socket i, int c)
{
    incoming = i; counter = c;
}
    @Override
    public void run()
{
    try
    {
      try
      {
        InputStream inStream = incoming.getInputStream();
        OutputStream outStream = incoming.getOutputStream();
        Scanner in = new Scanner(inStream);
        PrintWriter out = new PrintWriter(outStream,true /*autoFlush*/);
              
        out.println("Połączono");
        boolean done = false;
        while(!done && in.hasNextLine())
        {
            String line = in.nextLine();
            System.out.println("Echo: "+line);
            out.println("Odp z serwera: "+line);
            System.out.println(""+counter);
            System.out.println(""+incoming);
            System.out.println(""+outStream);           
                
            if(line.trim().equals("0"))
            done=true;
            System.out.println();
            
        }
        
    }
    finally
    {
        incoming.close();
    }
}        
catch(IOException e)
{
    System.out.println("Błąd IOException: "+ e);
}
}
private Socket incoming;
private int counter;
}
Dariss
Nowicjusz
Posty: 1
Dołączył(a): niedziela, 2 grudnia 2012, 13:25

Re: Serwer na Socketach

Post przez Dariss »

SQL jest odpowiedzia na twoje pytanie :)
Najlatwiej byloby Ci dodac, kolumne "Online" do tabeli users, ktora pewnie posiadasz.
Po zalogowaniu, zmieniasz wartosc kolumny Online, dla danego usera na 1. Po wylogowaniu sie, zakonczeniu sesji, zmieniasz wartosc na 0.
W celu wyliczenia ilosci userow, ktorzy sa online, piszesz proste zapytanie SQL-owe, do bazy danych, ktore zlicza ilosc userow z wartoscia 1.

Simple as that :)
Post Reply