Avatar billede Slettet bruger
29. december 2005 - 11:30 Der er 8 kommentarer og
2 løsninger

Flere connections til Socket Server

Hej,
Jeg sidder og arbejder på at lave en socket server, som skal fungere som en licensserver som brugerne logger op på og registrer.
Hvordan gør man så serveren kan håndtere registreringer samtidig, altså flere klienter connecter på samme tid?

Jeg har lavet en timer der får mit serverprogram til at starte en TcpListener hvert x antal millisekund.

Istedet for dette kunne jeg godt tænke mig at den bare tog imod en klient når klienten prøvede at connecte, og så skal den jo så kunne håndtere flere klienter...

Hilfe.
Avatar billede sonurpals Nybegynder
29. december 2005 - 12:00 #1
Du kan lave det som multy tråde server... så laver du serveren som almindelig classe og når en client kommer ind så laves det en server tråde.
Her er et example:
public class ChatServer
{
  static final int PORT = 1234;  // port for this server

  public ChatServer() throws IOException
  // wait for a client connection, spawn a thread, repeat
  {
      try {
      ServerSocket serverSock = new ServerSocket(PORT);
      Socket clientSock;

      while (true) {
        System.out.println("Server started...waiting for a client to connect...");
        clientSock = serverSock.accept();
        // ny tråde til hver client
        new ChatServerHandler(clientSock).start();
      }
    }
    catch(Exception e)
    {  System.out.println(e);  }
  }  // end of ChatServer()

så skal du lave chatServerHandler til at modtage.. det er også nogle ting som du skal tænke på.. lave en gruppe til de clienter som logger på eller hvordan du skal sende besked mellem client og server f.ex. objecter eller string.

her har du links til gode example på hvordan det kan gøres med udp samt tcp.

http://fivedots.coe.psu.ac.th/~ad/jg/ch18/ch18.pdf

http://fivedots.coe.psu.ac.th/~ad/jg/ch19/ch19.pdf

http://fivedots.coe.psu.ac.th/~ad/jg/ch18/index.html

http://fivedots.coe.psu.ac.th/~ad/jg/ch19/index.html

håber at det hjælper lidt.
Avatar billede Slettet bruger
29. december 2005 - 13:39 #2
Hej sonurpals,
Kender du en mulighed for at time en klient ud? hvis jeg connecter til min server via telnet og bare lader den stå, uden at lave noget, kan den stå der en evighed, og det vil jeg gerne undgå.
Avatar billede Slettet bruger
29. december 2005 - 13:47 #3
Min server ser kort sådan her ud:

static void Main(string[] args)
{
  TcpListener tcpListener = new TcpListener(1234);
  tcpListener.Start();

  while(true)
  {
      Socket socketForClient = tcpListener.AcceptSocket();
      if (socketForClient.Connected)
      {
        KeyHandle HandleKey = new KeyHandle();
        Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy HH:mm") + "  Client Connected");
        new KeyHandle().Lyt(socketForClient);
        Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy HH:mm") + "  Client Disconnected");
      }
      socketForClient.Close();           
  }       
}

Hvis jeg laver 2 telnet forbindelser kommer nr2 først igennem når nr1 er smidt af - hvordan undgår jeg det?
Avatar billede Slettet bruger
29. december 2005 - 13:52 #4
"KeyHandle HandleKey = new KeyHandle();"

Var en copy paste fejl
Avatar billede Slettet bruger
29. december 2005 - 14:18 #5
Når den første connecter, ender den inde i min Keyhandle().Lyt, hvor der starter en REadline, og den står jo bare og venter og venter... Kan man lave det på en anden måde?
Avatar billede Slettet bruger
29. december 2005 - 14:46 #6
Her er et forkortet eks på min HAndleKey.Lyt()

    public void Lyt(Socket socketForClient)
    {
        try
        {
            NetworkStream networkStream = new NetworkStream(socketForClient);
            System.IO.StreamWriter streamWriter =
                new System.IO.StreamWriter(networkStream);

            System.IO.StreamReader streamReader =
                new System.IO.StreamReader(networkStream);

            string tes = streamReader.ReadLine();

            streamReader.Close();
            networkStream.Close();
        }
        catch
        {
        }
    }

Og der står den og venter på at der bliver skrevet til serveren, hvis der ikke bliver det skal den time ud efter eks 10 sek.
Avatar billede Slettet bruger
29. december 2005 - 15:10 #7
Timeout løst med:

networkStream.ReadTimeout = 10;
Det bliver angivet i milsek
Avatar billede sonurpals Nybegynder
29. december 2005 - 15:26 #8
du kan også hvis du lalver det til tråde lave et interrupt() til tråden.. så bliver den stopped.
Avatar billede Slettet bruger
29. december 2005 - 16:08 #9
Kan du forklare mig de tråde der, du får lige points nu, da du har hjulpet så meget!
Avatar billede sonurpals Nybegynder
29. december 2005 - 18:09 #10
hvis du laver programmet på den måde at når en client logger på, så startes der en tråde til den.. hvis den tråde har en timer som udløber så laver du et method call interrupt() og den stoppes..
De linker som jeg sendte til dig indeholde example på multithreaded tcp chat server..
Du kan også lave en seperat tråde som virker som timer og f.ex updaterer en int i client programmet hver sec. og hvis den er 0 så bliver clienten disconnected men hvis din løsning virker så er den godt..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester