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); }
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)); }