Hmm, na początku dobrze byłoby pomyśleć, jak zbudować "pakiet".
Zajmiemy się najprostszą wersją, tj nasz pakiet będzie wyglądał tak:
struct Pakiet
{
UInt16 MsgLength;
String Message; // String w UTF8
}
Łączna wielkość pakietu to 2 bajty + MsgLength bajtów (+ 1 na każdy jeden polski znak)
Żeby taką wiadomość utworzyć i zamienić na nasz Pakiet (myśląc abstrakcyjnie; nasz Pakiet to po prostu tablica bajtów, zróbmy tak:
byte[] ConvertToBytes(string msg)
{
System.IO.MemoryStream DataStream = new System.IO.MemoryStream();
UInt16 MsgLength = (UInt16)Encoding.UTF8.GetByteCount(msg);
byte[] tmp_data = BitConverter.GetBytes(MsgLength);
DataStream.Write(tmp_data, 0, 2);
tmp_data = Encoding.UTF8.GetBytes(msg);
DataStream.Write(tmp_data, 0, MsgLength);
return DataStream.GetBuffer(); // albo .ToArray(), o ile pamiętam te dwie metody miały coś spieprzonego w sobie : P
}
void SendDataToSocket(System.Net.Sockets.Socket sock, byte[] data)
{
String przykladowa_wiadomosc = "wiadomość testowa";
sock.Send(ConvertToBytes(przykladowa_wiadomosc));
}
void ReadMessageFromBytes(byte[] data)
{
//Tutaj czytamy wiadomość z otrzymanych bajtów
System.IO.MemoryStream DataStream = new System.IO.MemoryStream(data);
byte[] tmp_data = new byte[2]; // Robimy miejsce dla dwóch bajtów dla Uint16
DataStream.Read(tmp_data, 0, 2);
UInt16 MsgLength = BitConverter.ToUInt16(tmp_data, 0);
tmp_data = new byte[MsgLength];
DataStream.Read(tmp_data, 0, MsgLength);
String Message = Encoding.UTF8.GetString(tmp_data);
//Odebraliśmy wiadomość, teraz można z nią robic co sie chce (np. Broadcast(...))
}
Powyższe metody to szkielet Twojego programu. Polecam Ci poczytać tutoriale i obejrzeć kod na stronie, której link podałem w pierwszym poście.
Oczywiście sam pakiet nie może tak wyglądać, wypadałoby umieścić jeszcze nagłówek - jakaś suma kontrolna (ile bajtow ma ogólnie cały pakiet z nagłówkiem), jakieś zabezpieczenia, żeby ktoś nie wysyłał Ci pakietów które nie są zgodne z protokołem itd. Powyższy kod nie ma wielu metod sprawdzania poprawności również w tym sensie, że być może nie caly pakiet doszedł (wtedy możesz czytać bajty... których jeszcze nie ma).
Polecam Ci korzystanie z klasy Socket, a nie TcpClient/TcpListener (moim zdaniem jest większa kontrola nad tym co sie dzieje, ale może jestem w błędzie).
Metoda Receive klasy Socket odbiera bajty które ma dostępne do tablicy, którą wcześniej utworzyłeś.
Poczytaj o tym.