MinYoung Lee Ответов: 0

C# неправильные данные в программировании сокетов


Привет,

Я разрабатывал простую программу удаленного рабочего стола, отправляя, получая изображения экрана между сервером, клиентом и выполняя управление мышью, клавиатурой.
когда я попытался отправить клиенту положение X, Y мыши сервера для управления, клиент получил неверные данные. ex) сервер отправляет данные, которые являются MouseControl $ Position $ 10 (Mouse_X_Position) $ 10 (Mouse_Y_Position) $ 450 (pictureBox.Width) $ 450 (pictureBox.Height). сначала он работает хорошо, клиент получает те же данные, что и сервер. Но через несколько секунд клиент получает данные типа ntrol $ Position $ 10 (Mouse_X_Position) $ 10 (Mouse_Y_Position) $ 450 (pictureBox.Width) $ 450 (pictureBox.Height). Некоторая часть первого слова «MouseControl» исчезает, в то время как сервер по-прежнему отправляет правильные данные «MouseControl $ Position $ 10 (Mouse_X_Position) $ 10 (Mouse_Y_Position) $ 450 (pictureBox.Width) $ 450 (pictureBox.Height)»

Помоги мне выбраться из этой беды. Я хочу знать, почему это происходит
Заранее благодарю вас!

Вот мой код ниже


-сервер
частная пустота StartMouseControl()
{
NetworkStream MouseControlStream = MouseControlDataSock. GetStream();
byte [] buffer = null;

в то время как (правда)
{
Point PointXY = pictureBox1. PointToClient(новая точка (Control.Мышиное положение.X, Контроль.MousePosition.Г));
int MouseX = PointXY. X;
инт мышка = PointXY.Г;

/* когда указатель мыши находится в pictureBox ... */
если ((MouseX и gt;= 0 &&усилителя; MouseX &ЛТ;= имя picturebox1.Ширина) и усилитель; & (Мышиный &ГТ;= 0 &&усилителя; Мышиный &ЛТ;= имя picturebox1.Высота))
{
MouseControlStream.Промывать();
буфер = кодирование.Юникод.GetBytes ("MouseControl$Postion$" + MouseX.ToString () + " $ " + MouseY.ToString () + " $ " + pictureBox1.Width.ToString () + " $ " + pictureBox1.Height.Метод toString());
MouseControlStream.Записи(буфера, 0, буфер.Длина);
MouseControlStream.Промывать();
}

Нить.Сон(400);
}
}




-клиент
частная пустота StartMouseControl()
{
int BUFFERSIZE = 72;
инт читать;
byte[] buffer = новый байт[BUFFERSIZE];

while (MouseControlDataSock.Связанный)
{
/* отделить данные протокола от сервера и сохранить в Sep_message[] */
MouseControlstream = MouseControlDataSock. GetStream();

чтение = 0;
while (read & lt; buffer.Длина)
{
тип int readbyte = MouseControlstream.Читать(буфера, чтение, буфер.Длина-чтение);
if (readbyte == 0)
{
перерыв;
}
read += readbyte;
}
MouseControlstream.Промывать();

строковое сообщение = кодировка.Юникод.GetString(buffer, 0, read);

разделитель строк=" $";
char[] split = splitter.Метод toArray();

string[] Sep_message = сообщение.Split (split, StringSplitOptions.RemoveEmptyEntries);

if (Sep_message[0].Equals ("MouseControl"))
{
if (Sep_message[1].Равно ("Положение"))
{
// Mouse_X_Position, Mouse_Y_Position, элемент управления PictureBox.Ширина, pictureBox.Высота
int MouseX_FromServer = int. Parse(Sep_message[2]);
int MouseY_FromServer = int. Parse(Sep_message[3]);
int PicBoxWidth_FromServer = int. Parse(Sep_message[4]);
int PicBoxHeight_FromServer = int. Parse(Sep_message[5]);
}
}

Нить.Сон(100);
}
}

Что я уже пробовал:

*********************************

Richard MacCutchan

Да, потому что, как и многие новые программисты, вы предполагаете, что вызов приема сокета будет читать полное сообщение каждый раз. Но TCP / IP не работает таким образом; вам нужно продолжать читать входные данные, пока вы не получите полное сообщение. Вам также нужно следить за тем, сколько символов было получено, и убедиться, что вы не переписываете их перед чтением следующей части. Google для "образцов сокетов", и вы найдете множество примеров, которые показывают, как это сделать правильно.

MinYoung Lee

Спасибо, Ричард Маккатчан! Да, как ты и сказал, Я не знал, как это работает. Я расскажу лерану больше о сокете. Спасибо.

0 Ответов