06. januar 2009 - 10:41Der 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?
1) laes i en loekke indtil du har modtaget alle data 2) send laengden som de foerste 2 bytes
Synes godt om
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?
//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) }
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.