Esempio n. 1
0
        public void Connect(string host, int port)
        {
            client.BeginConnect(host, port, (args) =>
            {
                client.EndConnect(args);

                new Thread(() =>
                {
                    while (client.Connected)
                    {
                        try
                        {
                            using (BinaryReader reader = new BinaryReader(client.GetStream(), Encoding.UTF8))
                            {
                                byte messageType = reader.ReadByte();

                                if (messageType == (byte)MessageType.QueryResponse)
                                {
                                    Guid callbackGuid = new Guid(reader.ReadString());

                                    int serverCount = reader.ReadInt32();

                                    List <ServerModel> models = new List <ServerModel>();

                                    for (int i = 0; i < serverCount; i++)
                                    {
                                        Guid serverGuid   = new Guid(reader.ReadString());
                                        IPAddress address = new IPAddress(reader.ReadBytes(16));
                                        DateTime lastPing = DateTime.FromBinary(reader.ReadInt64());

                                        ServerModel model = new ServerModel()
                                        {
                                            Id           = serverGuid,
                                            Address      = address,
                                            LastPingTime = lastPing,
                                            ContractData = new Dictionary <string, object>()
                                        };

                                        int dataCount = reader.ReadInt32();

                                        for (int x = 0; x < dataCount; x++)
                                        {
                                            string name       = reader.ReadString();
                                            ContractType type = (ContractType)reader.ReadByte();

                                            switch (type)
                                            {
                                            case ContractType.Int8:
                                                model.ContractData[name] = reader.ReadSByte();
                                                break;

                                            case ContractType.Int16:
                                                model.ContractData[name] = reader.ReadInt16();
                                                break;

                                            case ContractType.Int32:
                                                model.ContractData[name] = reader.ReadInt32();
                                                break;

                                            case ContractType.Int64:
                                                model.ContractData[name] = reader.ReadInt64();
                                                break;

                                            case ContractType.UInt8:
                                                model.ContractData[name] = reader.ReadByte();
                                                break;

                                            case ContractType.UInt16:
                                                model.ContractData[name] = reader.ReadUInt16();
                                                break;

                                            case ContractType.UInt32:
                                                model.ContractData[name] = reader.ReadUInt32();
                                                break;

                                            case ContractType.UInt64:
                                                model.ContractData[name] = reader.ReadUInt64();
                                                break;

                                            case ContractType.String:
                                                model.ContractData[name] = reader.ReadString();
                                                break;

                                            case ContractType.Buffer:
                                                model.ContractData[name] = reader.ReadBytes(reader.ReadInt32());
                                                break;

                                            case ContractType.Guid:
                                                model.ContractData[name] = new Guid(reader.ReadString());
                                                break;

                                            case ContractType.Location:
                                                Geolocation geoLocation  = new Geolocation();
                                                geoLocation.type         = reader.ReadString();
                                                geoLocation.coordinates  = new float[] { reader.ReadSingle(), reader.ReadSingle() };
                                                model.ContractData[name] = geoLocation;
                                                break;
                                            }
                                        }

                                        models.Add(model);
                                    }

                                    if (queryCallbacks.TryGetValue(callbackGuid, out Action <List <ServerModel> > callback))
                                    {
                                        queryCallbacks.Remove(callbackGuid);
                                        callback(models);
                                    }
                                }
                                else if (messageType == (byte)MessageType.RegisterAck)
                                {
                                    registerGuid = new Guid(reader.ReadString());
                                    bool success = reader.ReadBoolean();

                                    if (!success)
                                    {
                                        // TODO: Error
                                    }
                                }
                                else if (messageType == (byte)MessageType.ContractResponse)
                                {
                                    Guid callbackGuid = new Guid(reader.ReadString());
                                    bool success      = reader.ReadBoolean();

                                    if (validationCallbacks.TryGetValue(callbackGuid, out Action <bool> callback))
                                    {
                                        validationCallbacks.Remove(callbackGuid);
                                        callback(success);
                                    }
                                }
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }
                }).Start();
            }, null);
        }
Esempio n. 2
0
        public IAsyncResult Connect(string host, int port)
        {
            return(client.BeginConnect(host, port, (args) =>
            {
                client.EndConnect(args);

                new Thread(() =>
                {
                    while (client.Connected)
                    {
                        try
                        {
                            using (MemoryStream stream = new MemoryStream())
                            {
                                // Buffer to copy between NetworkStream and MemoryStream
                                byte[] buffer = new byte[1024];

                                // Only do when there is data
                                while (client.GetStream().DataAvailable)
                                {
                                    // Read data from the NetworkStream in increments of 1024
                                    int count = client.GetStream().Read(buffer, 0, 1024);

                                    // Write the data to the MemoryStream
                                    stream.Write(buffer, 0, count);
                                }

                                // Set stream at start
                                stream.Position = 0;

                                using (BinaryReader reader = new BinaryReader(stream, Encoding.UTF8))
                                {
                                    byte messageType = reader.ReadByte();

                                    if (messageType == (byte)MessageType.QueryResponse)
                                    {
                                        Guid callbackGuid = new Guid(reader.ReadString());

                                        int serverCount = reader.ReadInt32();

                                        List <ServerModel> models = new List <ServerModel>();

                                        for (int i = 0; i < serverCount; i++)
                                        {
                                            Guid serverGuid = new Guid(reader.ReadString());
                                            IPAddress address = new IPAddress(reader.ReadBytes(16));
                                            DateTime lastPing = DateTime.FromBinary(reader.ReadInt64());

                                            ServerModel model = new ServerModel()
                                            {
                                                Id = serverGuid,
                                                Address = address,
                                                LastPingTime = lastPing,
                                                ContractData = new Dictionary <string, object>()
                                            };

                                            int dataCount = reader.ReadInt32();

                                            for (int x = 0; x < dataCount; x++)
                                            {
                                                string name = reader.ReadString();
                                                ContractType type = (ContractType)reader.ReadByte();

                                                switch (type)
                                                {
                                                case ContractType.Int8:
                                                    model.ContractData[name] = reader.ReadSByte();
                                                    break;

                                                case ContractType.Int16:
                                                    model.ContractData[name] = reader.ReadInt16();
                                                    break;

                                                case ContractType.Int32:
                                                    model.ContractData[name] = reader.ReadInt32();
                                                    break;

                                                case ContractType.Int64:
                                                    model.ContractData[name] = reader.ReadInt64();
                                                    break;

                                                case ContractType.UInt8:
                                                    model.ContractData[name] = reader.ReadByte();
                                                    break;

                                                case ContractType.UInt16:
                                                    model.ContractData[name] = reader.ReadUInt16();
                                                    break;

                                                case ContractType.UInt32:
                                                    model.ContractData[name] = reader.ReadUInt32();
                                                    break;

                                                case ContractType.UInt64:
                                                    model.ContractData[name] = reader.ReadUInt64();
                                                    break;

                                                case ContractType.String:
                                                    model.ContractData[name] = reader.ReadString();
                                                    break;

                                                case ContractType.Buffer:
                                                    model.ContractData[name] = reader.ReadBytes(reader.ReadInt32());
                                                    break;

                                                case ContractType.Guid:
                                                    model.ContractData[name] = new Guid(reader.ReadString());
                                                    break;
                                                }
                                            }

                                            models.Add(model);
                                        }

                                        if (queryCallbacks.TryGetValue(callbackGuid, out Action <List <ServerModel> > callback))
                                        {
                                            queryCallbacks.Remove(callbackGuid);
                                            callback(models);
                                        }
                                    }
                                    else if (messageType == (byte)MessageType.RegisterAck)
                                    {
                                        registerGuid = new Guid(reader.ReadString());
                                        bool success = reader.ReadBoolean();

                                        if (!success)
                                        {
                                            // TODO: Error
                                        }
                                    }
                                    else if (messageType == (byte)MessageType.ContractResponse)
                                    {
                                        Guid callbackGuid = new Guid(reader.ReadString());
                                        bool success = reader.ReadBoolean();

                                        if (validationCallbacks.TryGetValue(callbackGuid, out Action <bool> callback))
                                        {
                                            validationCallbacks.Remove(callbackGuid);
                                            callback(success);
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }
                }).Start();
            }, null));
        }