Avatar billede bomann Nybegynder
25. september 2007 - 14:54 Der er 8 kommentarer og
1 løsning

Eksempel på server med flere trådede klienter

Jeg skal lave en server hvor til flere trådede klienter kan connecte og sende filer via en socket forbindelse.

Klienten skal kunne overføre store filer og tekst, og serveren skal selvfølgelig kunne skelne mellem klienterne samt hvilken type data det er den modtager.

Har du et link til en demo app der kan ovenstående eller har du selv lavet noget lignende!!?
Avatar billede arne_v Ekspert
25. september 2007 - 15:18 #1
Ofte koder man det ligesom:

        TcpListener srv = new TcpListener(IPAddress.Any, port);
        srv.Start();
        while(true) {
            TcpClient cli = srv.AcceptTcpClient();
            ClientHandler ch = new ClientHandler(cli);
            (new Thread(new ThreadStart(ch.Run))).Start();
        }

hvor hver ClientHandler haandterer en klient, constructor for TcpClient over med
connection til klient og Run metoden processer.

Metoden er ikke god til rigtigt mange connections, men den kan klare en del og
kode maessigt er det ret nemt at styre.
Avatar billede sherlock Nybegynder
25. september 2007 - 15:22 #2
Jeg tror at dette vil hjælpe dig..

http://www.codeproject.com/dotnet/dotnettcp.asp
Avatar billede bomann Nybegynder
26. september 2007 - 11:01 #3
Lige et tillægsspørgsmål, hvis man sender data via en NetworkStream og på serversiden samler dataene, hvordan ved man så hvornår den sidste byte er modtaget?
Findes der en event eller et flag der fortæller at dette er den sidste del af pakken!?

#### CLIENT ################

  FileStream fs = new FileStream(_filename, FileMode.Open, FileAccess.Read);
  BinaryReader br = new BinaryReader(fs);
  networkStream = new NetworkStream(m_clientSocket);
  byte[] bread = new byte[fs.Length];
  br.Read(bread, 0, Convert.ToInt32(fs.Length));
  networkStream.Write(bread, 0, Convert.ToInt32(fs.Length));

#### SERVER ################

public void OnDataReceived(IAsyncResult asyn)
{
  try
  { 
    SocketPacket socketData = (SocketPacket)asyn.AsyncState;
    int iRx = socketData.m_currentSocket.EndReceive(asyn);
    byte[] brev = new byte[iRx];
    brev = socketData.dataBuffer;

    FileStream fs = new FileStream("C:\\Temp\\"+filename, FileMode.Append);
    BinaryWriter br = new BinaryWriter(fs);

    brev = socketData.dataBuffer;

    br.Write(brev,0,iRx);
    fs.Close();
    br.Close();
  }
  WaitForData(socketData.m_currentSocket, socketData.m_clientNumber);
}
Avatar billede arne_v Ekspert
26. september 2007 - 15:15 #4
De to mest oplagte muligheder er:

binaere data:

lav en lille protokol hvor du sender:
  2 bytes med laengde
  N data bytes

text data:

genbrug de klassiske linier:
  data
  <CR><LF>

(hvis det wrappes i StreamReader/StreamWriter er det nemt !)
Avatar billede bomann Nybegynder
26. september 2007 - 15:28 #5
Jeg sender filesize med i en header pakke og checker efterfølgende på hvornår bytes received er lig filesize. Troede bare at der blev fyret en event når sidste pakke var læst.

Jeg har fået svar nok til at komme videre - tak!
Avatar billede arne_v Ekspert
27. september 2007 - 00:41 #6
Det eneste som modtager kan fange er hvis sender lukker forbindelsen.
Avatar billede arne_v Ekspert
18. november 2007 - 23:36 #7
Tid at få afsluttet her ?
Avatar billede bomann Nybegynder
19. november 2007 - 13:30 #8
Jep!
Avatar billede arne_v Ekspert
20. november 2007 - 02:22 #9
et svar fra mig
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