Mercurial > hg > Database > Christie-sharp
view daemon/IncomingTcpConnection.cs @ 56:dc3f59937772
remote dynamic
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 25 Jan 2022 16:46:26 +0900 |
parents | e75e143b92e7 |
children | 959096e8786b |
line wrap: on
line source
using System; using System.IO; using Christie_net.codegear; using Christie_net.datagear; using Christie_net.datagear.command; using Christie_net.datagear.dg; using MessagePack; using CommandType = Christie_net.datagear.command.CommandType; namespace Christie_net.daemon { public class IncomingTcpConnection { private RemoteDataGearManager manager; private CodeGearManager cgm; private Connection connection; public IncomingTcpConnection(Connection connection) { this.connection = connection; this.cgm = connection.cgm; } public void SetManager(RemoteDataGearManager manager) { this.manager = manager; } public void Run() { while (true) { // データはRemotemessage length, Remotemessage(Command), data length, dataの順で入っている byte[] remoteMessageSizeArray = new byte[1]; byte[] remoteMessage; byte[] dataSizeArray = new byte[1]; byte[] data; int dataLen; int length = 0; try { // get RemoteMessage.class size connection.stream.Read(remoteMessageSizeArray, 0, 1); int remoteMsglen = MessagePackSerializer.Deserialize<int>(remoteMessageSizeArray); remoteMessage = new byte[remoteMsglen]; // get RemoteMessage connection.stream.Read(remoteMessage, 0, remoteMsglen); RemoteMessage msg = MessagePackSerializer.Deserialize<RemoteMessage>(remoteMessage); CommandType type = CommandTypeExt.GetCommandTypeFormId(msg.type); // Debug //Console.WriteLine("length:" + msg.key + " " + msg.type); //Console.WriteLine("call:" + connection.stream.Position); // int dataSize = connection.stream.Read() switch (type) { case CommandType.PUT: // get data size connection.stream.Read(dataSizeArray, 0, 1); dataLen = MessagePackSerializer.Deserialize<int>(dataSizeArray); data = new byte[dataLen]; // get data connection.stream.Read(data, 0, dataLen); //data = msg.data; try { MessagePackDataGear<object> dg = new MessagePackDataGear<object>(data, Type.GetType(msg.clazz)); cgm.GetLocalDGM().Put(msg.key, dg); } catch (TypeLoadException e) { Console.WriteLine(e.StackTrace); } break; case CommandType.REMOTEPEEK: case CommandType.REMOTETAKE: try { Command cm = new CommandBuilder().Init(type).FromDgmName(msg.fromDmgName) .Key(msg.key) .Clazz(Type.GetType(msg.clazz)) .Connection(connection).Build(); cgm.GetLocalDGM().RunCommand(cm); } catch (TypeLoadException e) { Console.WriteLine(e.StackTrace); } catch (Exception e) { Console.WriteLine(e); } break; case CommandType.REPLY: // 待っていたwaitlistに渡してcsにセット // get data size connection.stream.Read(dataSizeArray, 0, 1); dataLen = MessagePackSerializer.Deserialize<int>(dataSizeArray); data = new byte[dataLen]; // get data connection.stream.Read(data, 0, dataLen); // data = new byte[MessagePackSerializer.Deserialize<int>(streamData)]; // connection.socket.Receive(data); try { MessagePackDataGear<object> dg = new MessagePackDataGear<object>(data, Type.GetType(msg.clazz)); cgm.GetDGM(msg.fromDmgName).ResolveWaitCommand(msg.key, dg); } catch (TypeLoadException e) { Console.WriteLine(e.StackTrace); } break; default: break; } } catch (Exception e) { Console.WriteLine(e.StackTrace); } } } } }