view daemon/IncomingTcpConnection.cs @ 40:7276e3429c99

fix NetworkStream Error
author riono <e165729@ie.u-ryukyu.ac.jp>
date Tue, 25 May 2021 03:02:38 +0900
parents 9217d14cc220
children ce46626dddb1
line wrap: on
line source

using System;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using Christie_net.codegear;
using Christie_net.datagear;
using Christie_net.datagear.command;
using Christie_net.datagear.dg;
using Christie_net.Test.Example.RemoteTake;
using MessagePack;
using Microsoft.VisualBasic;
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() {
        //TODO: Data長がわからないので1024で仮置き → ぴったしで読み込む必要がある
        byte[] streamData = new byte[1024];
        
        try {
            connection.stream.Read(streamData);
        } catch (Exception e) {
            Console.WriteLine(e);
        }

        // if (memoryData == null) {
        //     return;
        // }
        
        while (true) {
            try {
                // データはRemotemessage(Command), length, dataの順で入っている
                //int dataLength = connection.socket.Receive(deserializeCommand);

                // Debug
                //Console.WriteLine("length: " + dataLength);
                
                RemoteMessage msg = MessagePackSerializer.Deserialize<RemoteMessage>(streamData);
                CommandType type = CommandTypeExt.GetCommandTypeFormId(msg.type);
                
                // Debug
                //Console.WriteLine("incoming:" + msg.type);
                byte[] data;
               
                switch (type) {
                    case CommandType.PUT:
                        //data = new byte[MessagePackSerializer.Deserialize<int>(deserializeCommand)];
                        //connection.socket.Receive(data);
                        data = msg.data;

                        try {
                            MessagePackDataGear<object> dg =
                                new MessagePackDataGear<object>(data, Type.GetType(msg.clazz));
                           
                            // Debug
                            // Type t = Type.GetType(msg.clazz);
                            // object obj = MessagePackSerializer.Deserialize<object>(msg.data);
                            // RTCommand cmd = (RTCommand) obj;
                            Console.WriteLine("***type:" + msg.type +  " key:" + msg.key + " fromDgm:" + msg.fromDmgName + " class:" + msg.clazz);
                           // Console.WriteLine("data :" + cmd.line);
                            
                            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);
                        }

                        break;
                    case CommandType.REPLY: // 待っていたwaitlistに渡してcsにセット
                        data = msg.data;
                        
                        // 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 (IOException e) {
                Console.WriteLine(e.StackTrace);
            }
        }
    }
}
}