В пакете заголовка tcp это поле, в котором упоминается общий размер пакета. Я выполнил свой сервер, который прослушивает многократным клиент следующим способаC# реализация таймаута для чтения полного пакета tcp сервером
int numberOfClientsYouNeedToConnect = int.Parse(Console.ReadLine());
for (int i = 0; i < numberOfClientsYouNeedToConnect; i++)
{
Thread newThread = new Thread(new ThreadStart(Listeners));
newThread.Start();
}
public static void Listeners()
{
try
{
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
Console.WriteLine("Client : " + socketForClient.RemoteEndPoint + " is now connected to server.");
NetworkStream networkStream = new NetworkStream(socketForClient);
//networkStream.ReadTimeout = 30;
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);
while (true)
{
string theString = streamReader.ReadLine();
//Console.WriteLine(theString);
byte[] input_stream = extra_function.ConvertHexToString(theString);
for (int i = 0; i < input_stream.Length; i++)
{
// Console.WriteLine("hi");
Console.Write(input_stream[i]);
}
if (theString != "exit")
{
// original message from client
Console.WriteLine("------------------------------------------------------------------------------");
Console.WriteLine("Message recieved from client(" + socketForClient.RemoteEndPoint + ") : " + theString);
// ASCII code for the message from client
Console.Write("ASCII Code for message is : ");
foreach (char c in theString)
{
Console.Write(System.Convert.ToInt32(c) + " ");
}
}
}
Но моя проблема заключается в том, что сервер без получения полного пакета он начинает обрабатывать его в то время как другая часть пакета приходит немного позже. Итак, как я могу изменить свой код, чтобы сервер получал полный пакет, а затем обрабатывал его. Размер общего пакета включается в заголовок пакета. Сервер должен дождаться, пока он получит столько байтов от клиента, или дождитесь некоторого времени для получения полного пакета.
Вы используете StreamReader и StreamWriter, поэтому ваш протокол кажется * текстовым *. Поэтому ваш * пакет * - * одна строка *. – I4V
ok фактически протокол не основан на тексте, но он будет отправлять и принимать tcp-пакеты. – prattom
Вы не можете использовать StreamReader и StreamWriter для двоичных данных. Используйте networkStream напрямую. – I4V