День добрый. Пытаюсь переслать сериализованный класс через TCP, но получаю косяки. Вот код приема данных на сервере:
| Код | [Serializable] class GameData { public GameData() { } public string str; } ... byte[] byteData;
private void OnAccept(IAsyncResult ar) { try { Socket clientSocket = serverSocket.EndAccept(ar); serverSocket.BeginAccept(new AsyncCallback(OnAccept), null); byteData = new byte[1000]; clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), clientSocket); } catch (Exception ex) { MessageBox.Show(ex.Message, "SGSserverTCP", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void OnReceive(IAsyncResult ar) { try { Socket clientSocket = (Socket)ar.AsyncState; clientSocket.EndReceive(ar);
BinaryFormatter bf = new BinaryFormatter(); MemoryStream mst = new MemoryStream(byteData);
mst.Position = 0; GameData rGd = (GameData)bf.Deserialize(mst);
mst.Close(); byteData = null; txtLog.Text += '\n' + rGd.str;
GameData msgToSend = new GameData(); msgToSend.str = "test";
MemoryStream sGd = new MemoryStream();
bf.Serialize(sGd, msgToSend);
clientSocket.BeginSend(sGd.GetBuffer(), 0, sGd.GetBuffer().Length, SocketFlags.None, new AsyncCallback(OnSend), clientSocket); sGd.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message, "SGSserverTCP", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
|
Данные с клиента отправляю путем:
| Код | GameData msgToSend = new GameData();
msgToSend.str = "starting message"; BinaryFormatter bf = new BinaryFormatter(); System.IO.MemoryStream sGd = new System.IO.MemoryStream(); bf.Serialize(sGd, msgToSend);
//Send it to the server clientSocket.BeginSend(sGd.ToArray(), 0, sGd.ToArray().Length, SocketFlags.None, new AsyncCallback(OnSend), null); sGd.Close();
|
Сервер генерит исключение. В текущим случае - пишет "Недопустимый двоичный формат входного потока. Начало содержимого (в байтах): 00 00 00 00 03 00 00 00 00 00 61 73 64 . . ."
В чем косяк?
ЗЫ И еще вопрос, пока не забыл: будет ли byteData[1000] ограничивать размер класса? т.е. если сериализованный класс будет больше 1кб то он не будет обработан полностью? |