Сериализация для передачи по сети
От: JimiKorn Россия  
Дата: 25.03.06 10:39
Оценка:
Вообщем так, нужно написать сервак для передачи сообщений по сети.
пример: используем TcpListner, TcpCLient, NetworkStream, BinaryFormatter.
Проблема: Разные программы не могут открыть один и тот же файл с тем же типом т.к.
подпись программы разная сервер xServer, а клиент xClient.
Часть кода:

//Даже это не помогло!!!!
sealed class DeserealizationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type DeserType = null;

assemblyName = assemblyName.Replace("xClient", "xServer");
typeName = "xMessage";

DeserType = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));

return DeserType;
}
}

enum MessageType
{
INSTRUCTION = 0,
DATA,
PUBLIC_MESSAGE,
PRIVATE_MESSAGE
}

[Serializable]
struct xMessage
{
public MessageType MsgType;
public string Message;
}

//Обрабатываем клиента
static void StartProcess()
{
if (!SocketTerminate)
{
int ClientCount = 0;
while (true)
{
lock (Clients) { ClientCount = Clients.Count; }
if (ClientCount > 0)
{
lock (Clients)
{
foreach (TcpClient Iterr in Clients)
{
NetworkStream ClientStream = Iterr.GetStream();
try
{
RecognizeMessage(ref ClientStream);
}
catch(System.Exception e)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("-{0}({1})", "remove client", e.Message);
WriteMessage(sb.ToString());
Iterr.Close();
Clients.Remove(Iterr);
if (Clients.Count == 0)
{
break;
}
}
finally
{
//Добить
}
}
}
}
else
{
Thread.Sleep(250);
}
}
}
}
//Обрабатываем клиентов
static void RecognizeMessage(ref NetworkStream _NetworkStream)
{
IFormatter BinFmt = new BinaryFormatter();
xMessage Msg = new xMessage();
BinFmt.Binder = new DeserealizationBinder();

Msg = (xMessage)BinFmt.Deserialize(_NetworkStream);

switch (Msg.MsgType)
{
case MessageType.INSTRUCTION:
ExecuteInstruction(ref Msg.Message,ref _NetworkStream);
break;
case MessageType.PRIVATE_MESSAGE:
break;
case MessageType.PUBLIC_MESSAGE:
break;
case MessageType.DATA:
break;
default: break;
}
}
//Выполняем инструкцию
static void ExecuteInstruction(ref string _Instruction, ref NetworkStream _NetworkStream)
{
xMessage Msg = new xMessage();
IFormatter BinFmt = new BinaryFormatter();
BinFmt.Binder = new DeserealizationBinder();

if (_Instruction == "tz")
{
WriteMessage("OK");
//Msg.MsgType = MessageType.PRIVATE_MESSAGE;
//Msg.Message = System.TimeZone.CurrentTimeZone.StandardName;
//BinFmt.Serialize(_NetworkStream, Msg);
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.