Avatar billede Slettet bruger
06. januar 2009 - 10:41 Der er 6 kommentarer og
1 løsning

Sende object med variable størrelse, TCP

Hej

Jeg har en klasse med nogle forskellige felter i. F.eks. til chat med et brugernavn, besked type og besked. Den sender jeg over en socket ved at konvertere klassen til et byte array. Men hvis beskeden er meget lang, og modtageren kun forventer 1024 byte data, så fejler den. Kan jeg på nogen måde lave en header eller lign. der fortæller modtageren hvor meget objektet fylder?
Avatar billede arne_v Ekspert
06. januar 2009 - 11:07 #1
1)  laes i en loekke indtil du har modtaget alle data
2)  send laengden som de foerste 2 bytes
Avatar billede Slettet bruger
06. januar 2009 - 11:39 #2
hvordan kan jeg sende det som de første to bytes når jeg sender et objekt samlet. object.toArray() -> send over socket.

"laes i en loekke indtil du har modtaget alle data"

Når man modtager noget, ligger alt data så ikke i én lang "kø"? altså flere beskeder lige efter hinanden. Hvordan kan jeg se at lige præcis denne besked er slut?
Avatar billede arne_v Ekspert
06. januar 2009 - 11:56 #3
Hvordan ser din kode ud ?
Avatar billede Slettet bruger
06. januar 2009 - 13:06 #4
Det her er klienten:

//Fill the info for the message to be send
Data msgToSend = new Data();
               
msgToSend.strName = strName;
msgToSend.strMessage = txtMessage.Text;
msgToSend.cmdCommand = Command.Message;

byte [] byteData = msgToSend.ToByte();

//Send it to the server
clientSocket.BeginSend (byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnSend), null);



Server der modtager:

Socket clientSocket = (Socket)ar.AsyncState;
clientSocket.EndReceive(ar);

//Transform the array of bytes received from the user into an
//intelligent form of object Data
Data msgReceived = new Data(byteData);



Command objekt:

class Data
    {
        //Default constructor
        public Data()
        {
            this.cmdCommand = Command.Null;
            this.strMessage = null;
            this.strName = null;
        }

        //Converts the bytes into an object of type Data
        public Data(byte[] data)
        {
            //The first four bytes are for the Command
            this.cmdCommand = (Command)BitConverter.ToInt32(data, 0);

            //The next four store the length of the name
            int nameLen = BitConverter.ToInt32(data, 4);

            //The next four store the length of the message
            int msgLen = BitConverter.ToInt32(data, 8);

            //This check makes sure that strName has been passed in the array of bytes
            if (nameLen > 0)
                this.strName = Encoding.UTF8.GetString(data, 12, nameLen);
            else
                this.strName = null;

            //This checks for a null message field
            if (msgLen > 0)
                this.strMessage = Encoding.UTF8.GetString(data, 12 + nameLen, msgLen);
            else
                this.strMessage = null;
        }

        //Converts the Data structure into an array of bytes
        public byte[] ToByte()
        {
            List<byte> result = new List<byte>();

            //First four are for the Command
            result.AddRange(BitConverter.GetBytes((int)cmdCommand));

            //Add the length of the name
            if (strName != null)
                result.AddRange(BitConverter.GetBytes(strName.Length));
            else
                result.AddRange(BitConverter.GetBytes(0));

            //Length of the message
            if (strMessage != null)
                result.AddRange(BitConverter.GetBytes(strMessage.Length));
            else
                result.AddRange(BitConverter.GetBytes(0));

            //Add the name
            if (strName != null)
                result.AddRange(Encoding.UTF8.GetBytes(strName));

            //And, lastly we add the message text to our array of bytes
            if (strMessage != null)
                result.AddRange(Encoding.UTF8.GetBytes(strMessage));

            return result.ToArray();
        }

        public string strName;      //Name by which the client logs into the room
        public string strMessage;  //Message text
        public Command cmdCommand;  //Command type (login, logout, send message, etcetera)
    }
Avatar billede Slettet bruger
08. januar 2009 - 08:31 #5
Havde du en løsning arne v?
Avatar billede Slettet bruger
08. januar 2009 - 12:59 #6
har fundet ud af det, smid et svar
Avatar billede arne_v Ekspert
09. januar 2009 - 02:03 #7
OK
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