Я делаю это для одного из моих школьных проектов.Я пытаюсь создать многопоточный сервер, который принимает клиентов для работы с базой данных (добавление, удаление записей и т. Д.).Когда я подключаю клиента к серверу, я хочу получить всех студентов в своей базе данных.
Я получаю доступ к базе данных на стороне сервера и сохраняю информацию в ArrayList, который я пытаюсь отправить по нему.сеть.У меня нет никаких знаний о XML-сериализации, поэтому я пытаюсь отправить каждую строку в arrayList клиенту.Когда я отправляю данные с сервера, я иногда получаю все данные в одно и то же время, иногда я не получаю, поэтому мое первое предположение состояло в том, что мне нужно разделить отправляемые данные на пакеты некоторой длины.Я не вижу, как я могу добавить длину в начале пакета.Разве это не было бы то же самое?Может быть, я получаю правильную длину, а может и нет.
Вот мой код;Я еще не пытался отправить длину каждой посылки, потому что понятия не имею, как.Я пытался отправить с сервера длину массива, и много раз считывал из сетевого потока, но это не работает (я получаю все данные в одном пакете).
Сторона сервера:
private void HandleClient(object client)
{
try
{
ClientNo++;
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] bytes = new byte[4096];
int i;
// Robot r = new Robot();
Protocol p = new Protocol();
ArrayList ListaStudentiResponse = p.ExecuteQueryOnStudents("select * from studenti");
byte[] Length = new byte[4];
Length = System.Text.Encoding.ASCII.GetBytes(ListaStudentiResponse.Count.ToString());
clientStream.Write(Length, 0, Length.Length);
foreach ( String s in ListaStudentiResponse)
{
byte[] data = System.Text.Encoding.ASCII.GetBytes(s);
clientStream.Write(data, 0, data.Length);
}
tcpClient.Close();
ClientNo--;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
На клиенте:
private void connectToServerToolStripMenuItem_Click(object sender, EventArgs e)
{
tcpclient = new TcpClient();
NetworkStream netStream;
try
{
tcpclient.Connect("localhost", 8181);
netStream = tcpclient.GetStream();
Byte[] bytes = new Byte[10000];
int readBytes = netStream.Read(bytes, 0, bytes.Length);
int Length =Int32.Parse(Encoding.ASCII.GetString(bytes, 0, readBytes));
MessageBox.Show(Length.ToString());
int i = 0;
while (i < Length)
{
i++;
Byte[] b = new Byte[10000];
readBytes = netStream.Read(bytes, 0, bytes.Length);
String response = Encoding.ASCII.GetString(b, 0, readBytes);
MessageBox.Show(response);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}