Witam. Pisząc własny komunikator (w C#) tak już bardziej na poważnie z początku odczytywałem sobie tak byle jak ze strumienia sieciowego, ale teraz przydałoby się jakoś w miarę fachowo to napisać, mianowicie wysyłanie i odbieranie pakietów. Na razie robię tak:
private string Read(TcpClient client)
{
// Tak robiłem wcześniej (dł. pakietu max 255, stąd 1 bajt odbieram):
//client.GetStream().ReadTimeout = ReadTimeout;
//byte[] data = new byte[client.GetStream().];
//client.GetStream().Read(data, 0, data.Length);
//return UTF8Encoding.UTF8.GetString(data);
// teraz zrobiłem dł. pakietu max 65535 (stąd 2 bajty odbieram)
client.GetStream().ReadTimeout = ReadTimeout;
short length = BitConverter.ToInt16(
new byte[2] { (byte)client.GetStream().ReadByte(), (byte)client.GetStream().ReadByte() }, 0);
byte[] data = new byte[length];
client.GetStream().Read(data, 0, length);
return UTF8Encoding.UTF8.GetString(data);
}
private void Send(TcpClient client, string value)
{
//byte[] data = UTF8Encoding.UTF8.GetBytes(value);
//client.GetStream().WriteByte((byte)data.Length);
//client.GetStream().Write(data, 0, data.Length);
client.GetStream().WriteTimeout = WriteTimeout;
short length = (short)UTF8Encoding.UTF8.GetByteCount(value);
client.GetStream().Write(BitConverter.GetBytes(length), 0, 2);
byte[] data = UTF8Encoding.UTF8.GetBytes(value);
Array.Resize<byte>(ref data, length);
client.GetStream().Write(data, 0, length);
}
Czy takie odb. i wys. może być czy jakoś to ładniej da się zrobić? Prosił bym o Wasze zdania.