У меня есть клиент tcp, который отправляет разные типы сообщений, и я немного смущен, как это сделать. Сначала клиент отправляет строку (преобразованную в byte []), и это работает нормально, но затем я пытаюсь отправить сериализованный объект, и я не знаю, как это сделать, и как заставить сервер понять, что сообщение isn Строка. Объект, который я пытаюсь отправить, - это открытый ключ алгоритма RSA
IFormatter formatter=new BinaryFormatter();
formatter.Serialize(client.GetStream(),RSAParameterskeyinfo);
но я не знаю, как заставить сервер понять, что это сообщение не байт [].
Чтобы ваш сервер понял, какой тип объекта он должен будет вычислить, вы должны совместно использовать dll между клиентом и сервером. Жесткая часть здесь - обрабатывать версию этой DLL (когда вы делаете изменения на объекте, который хотите разделить между клиентом и сервером, вам придется обновлять dll с каждой стороны)
Затем используйте BinaryFormatter
для сериализации/десериализации вашего объекта. Сначала на стороне клиента сериализуйте свой объект с чем-то вроде:
MyMessage msg = new MyMessage("My custom message")
byte[] data;
using(var ms = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, msg);
data = ms.ToArray();
/*
* Send to stream
*/
}
Затем на размер сервера вы должны десериализовать его так:
/*
* Get the network stream
*/
BinaryFormatter formatter = new BinaryFormatter();
MyMessage msg = (MyMessage) formatter.Deserialize(myStream);
Поскольку они используют одну и ту же DLL, каждая сторона знает объект Message
.
Дополнительные сведения о BinaryFormatter
см. По адресу: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter(v=vs.110).aspx