Avatar billede elmoe Juniormester
18. februar 2009 - 00:37 Der er 3 kommentarer og
1 løsning

C# & Java - Client Server - Evt. sende Socket i et stream

Jeg er ved at lave et client-server program, som består af en Java server og C# klienter der forbinder til den. Det er lavet, så klienter bliver accepteret i hver deres socket på java serveren, så serveren kan sende beskeder til alle klienter på samme tid. Jeg har gemt alle de accepterede Sockets i en ArrayList på Java serveren. Det virker fint nok. Nu mangler jeg bare at klienter bliver fjernet når de lukker deres C# klientvindue. Jeg har lavet en event der kører når klienten lukker vinduet. Har tænkt at den event skal give besked om hvilken Socket det er der skal fjernes fra serverens ArrayList, men det kræver jo så lige at den Socket er sendt til klienten for at jeg kan sende den tilbage som indikator på, hvad det er der skal fjernes. Havde også tænkt, at det måske kunne gøres med et id-nr., men det er udelukket da en ArrayList rykker de efterfølgende elementer et hak tilbage i arrayet hvis et foranstående element fjernes. På den måde kan man ikke vide hvilke placeringer de andre elementer efterfølgende får. Jeg er lidt på bar bund, så gode forslag er meget velkomne.

Jeg skal egentlig bare på en eller anden måde have fundet ud af hvad det er for en klient der lukker sit C# vindue og give serveren besked om det, så den kan fjerne klienten fra ArrayList'en.

Her er den C# event, som jeg evt. kan forestille mig skal sende en indikation til serveren om at vinduet lukkes:

// The event handler for application exit
public void OnApplicationExit(object sender, EventArgs e)
{
  //Send a message to the server to let it know to remove this client
  //SEND DATA TO JAVA APPLICATION
  streamWriter = new StreamWriter(networkStream);
  streamWriter.WriteLine("Klient afbryder forbindelse!");
  streamWriter.Flush();
}

Her er så den Java kode der fra serveren afsender en tekstbesked til klienterne. Hvis man evt. på en eller anden måde kunne få afsendt en Socket til klienten, så kunne den evt. bruges til at sende tilbage:

PrintWriter outToClientMessage = new PrintWriter((actualSocket.getOutputStream()), true);
outToClientMessage.println("Besked til klient nr. " + i);

Håber der er hjælp at hente for jeg er løbet tør for idéer :)
Avatar billede arne_v Ekspert
18. februar 2009 - 01:37 #1
Jeg tror at det er den forkerte retning du er på vej ud i.

Hvis client lukker ned, så vil en read eller write på den tilhørende socket på server give en exception.

Mit forslag er derfor at du lader serveren remove sockets den får exception på ved read eller write.

Ved pæn nedlukning bør du få en hurtig exception, ved ikke pæn nedlukning tager det lidt tid.
Avatar billede elmoe Juniormester
18. februar 2009 - 11:23 #2
Okay, tak for svaret. Det afprøver jeg og vender igen senere.
Avatar billede elmoe Juniormester
19. februar 2009 - 20:01 #3
Jeg kan stadig ikke få koden til virke helt efter hensigten. Af en eller anden grund er det kun den c# klient der er åbnet først, som serveren reagerer på. Altså reagerer på lukkes. der må være noget galt i serverens kode, for klienten sender godt nok beskeden når klient-programmet afbrydes.

Her er den java serverkode som skulle slette Socket elementer fra et ArrayList når en klient afbryder:

      public void run()
      {
        System.out.println("Tread is running!");
        String strengFraKlient;
       
        int k = 0;
        while (true)
        {
            if (connectedClients.size() != 0) //If ArrayList contains data
            {
              if (k < 2)
              {
                  actualSocketToRemove = connectedClients.get(k); //Get socket from ArrayList
                  try
                  {
                    bufferedReader = new BufferedReader(new InputStreamReader
                  (actualSocketToRemove.getInputStream()));

                    while ((strengFraKlient = bufferedReader.readLine()) != null)
                    {
                        connectedClients.remove(actualSocketToRemove); //Remove socket from ArrayList
                        System.out.println("Klient fjernet, så nu er der "+connectedClients.size()+" klienter");
                    }
                  }catch (Exception e)
                  {
                    //System.out.println("Der skete en readLine exception for nr. "+k+"! Exception:"+ e);
                  }
              }
              else
              {
                  k = 0;
              }
            }
        }
      }

Jeg har lavet det som en tråd. Ved ikke om det skulle være lavet på en anden måde eller om jeg generelt bare er "helt ude i skoven"..?

Når jeg kører i debug mode kan jeg se at programmet stopper ved den her linie efter første gennemkørsel:
while ((strengFraKlient = bufferedReader.readLine()) != null)

Ved ikke om det kan have noget med det at gøre..
Avatar billede elmoe Juniormester
18. marts 2009 - 21:01 #4
Intet svar efter lang tid.. Lukker spørgsmålet.
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
Kurser inden for grundlæggende programmering

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