18. februar 2009 - 00:37Der 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 :)
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)
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.