Klient-Server kommunikation C#

Permalänk
Medlem

Klient-Server kommunikation C#

Tjenare, har i uppgift att göra en chat där flera klienter kan koppla upp sig till en server och skriva till servern. Servern skall sedan kunna välja vem den ska svara till och skicka tillbaka ett meddelande.

Just nu kan jag koppla upp flera klienter till servern och skicka meddelande till denna, det jag har problem med är alltså för servern att skicka tillbaka meddelande och dessutom till rätt klient, och för klienten att ta emot dessa meddelanden.

https://gist.github.com/4565988
Där är koden till Servern och Klienten.

Tackar för all hjälp jag kan få!

Permalänk
Medlem

Kan du förtydliga "Servern skall sedan kunna välja vem den ska svara till"?

Det låter som att du vill hålla en samling av accepterade klienter och vänta med att stänga dessa tills du valt ut en att skriva ett svar till, men det är lite oklart vad som ska åstadkommas och hur servern är tänkt att "välja" klient?

Visa signatur

Don't be afraid to give up the good to go for the great.

Permalänk
Medlem

Utan att kolla på din kod så bör du ha följande klart för dig;
Serven kan sällan skapa en anslutning till klienten. (Klienten kan vara bakom brandväggar, NAT etc) När din klient däremot anropar servern så får du hålla den anslutningen öppen och använda den för att returnera ett eventuellt svar.

Du borde läsa på om WCF, ifall du inte använder den tekniken redan. Sen beror din lösning lite på hur lång tid klienten kan vara tvungen att vänta på svar. Om det är längre en vad som är lämpligt för ett webbserviceanrop kanske du får ha så att klienten pollar servern efter meddelanden i intervall istället.

Visa signatur

AMD 7700X (EK 240mm AIO) | ROG Strix B650E-F Gaming | Gigabyte RX 6800 XT 16GB OC | Kingston Fury 32GB DDR5 5600mhz | Kingston Fury Renegade M2 2TB | Alienware AW2723DF 280hz

Permalänk
Medlem

Jag kikade hastigt på din kod. Om du inte vill använda WCF och hållla det så basic med en tcpclient så borde du kunna skicka tillbaka data genom samma kanal

theClient.Client.Send(..)

innan du stänger den på rad 91.

Ska svaret ske långt senare så läs mitt svar ovan. Du får tänka på timeouts etc. En tredje lösning vore att hålla tcpClient levande genom att skicka lite ping-pong keepalive-paket under tiden.

Visa signatur

AMD 7700X (EK 240mm AIO) | ROG Strix B650E-F Gaming | Gigabyte RX 6800 XT 16GB OC | Kingston Fury 32GB DDR5 5600mhz | Kingston Fury Renegade M2 2TB | Alienware AW2723DF 280hz

Permalänk
Medlem

Får tyvärr inte använda oss utav WCF :/

För att förklara lite tydligare: Jag startar servern först och denna väntar sedan på att klienter ansluter sig till den, efter att klienterna har skickat meddelande till servern skall den kunna svara tillbaka till vald klient. Det krävs alltså inte att klienterna ska kunna skicka hela tiden utan det räcker med att de alternerar mellan skicka och ta emot meddelande. Servern ska alltså då kunna ta emot varsitt meddelande från klienterna och sedan svara till respektive klient igen.
Allt detta ska köras på en lokal maskin.

Permalänk

Tjenare Euq,

Nu läste jag tyvärr bara ditt fösta inlägg och av någon anledning tog jag för givet att du använde dig av WCF.
Nu när jag andå har slängt ihop det här så kan jag likaväl även posta det, tyvärr hjälper det inte dig. Men här är en början till hur man kan lösa det med hjälp av Windows Communcation Foundation.

http://bambafile.com/Share/Shared/908c153a-4b72-4a51-b80b-0e5...

Permalänk
Medlem
Skrivet av shakeshar:

Tjenare Euq,

Nu läste jag tyvärr bara ditt fösta inlägg och av någon anledning tog jag för givet att du använde dig av WCF.
Nu när jag andå har slängt ihop det här så kan jag likaväl även posta det, tyvärr hjälper det inte dig. Men här är en början till hur man kan lösa det med hjälp av Windows Communcation Foundation.

http://bambafile.com/Share/Shared/908c153a-4b72-4a51-b80b-0e5...

Tack ändå, det blir antagligen till att använda WCF i framtida projekt. Tyvärr var just denna kurs och lärare inget att hänga i granen precis så de vi lärde oss var minimalt, hade läst om WCF innan kurs starten och hoppades på lite föreläsningar eller labbar om detta men tyvärr icke.