Esempio n. 1
0
        public void Write(int id, [NotNull] string message, NetworkMessage.NetworkMessageType type = NetworkMessage.NetworkMessageType.Message)
        {
            lock (Socket)
            {
                Socket.Send(id.ToBytes());
                Socket.Send(((int)type).ToBytes());

                byte[] messageBytes = Encoding.UTF8.GetBytes(message);

                Socket.Send(messageBytes.Length.ToBytes());

                if (messageBytes.Length > 0)
                {
                    Socket.Send(messageBytes);
                }
            }
        }
Esempio n. 2
0
        public void ClientThread()
        {
            byte[] intBuffer = new byte[4];

            while (!disposed && Socket != null)
            {
                try
                {
                    int id = networkStream.ReadInt(intBuffer);

                    NetworkMessage.NetworkMessageType typeId = NetworkMessage.TypeFromId(networkStream.ReadInt(intBuffer));

                    int length = networkStream.ReadInt(intBuffer);
                    if (length < 0)
                    {
                        TDHPlugin.WriteError("Error in received message: Invalid message length");
                        continue;
                    }

                    string message = length == 0 ? "" : networkStream.ReadString(length);

                    switch (typeId)
                    {
                    case NetworkMessage.NetworkMessageType.Message:
                        ThreadPool.QueueUserWorkItem(state => requestListener.OnClientMessage(this, new NetworkMessage(id, message)));
                        break;

                    case NetworkMessage.NetworkMessageType.Request:
                        ThreadPool.QueueUserWorkItem(state => SendMessage(requestListener.OnClientRequest(this, new NetworkRequest(id, message))));
                        break;

                    case NetworkMessage.NetworkMessageType.Response:
                        ThreadPool.QueueUserWorkItem(state => requestListener.OnClientResponse(this, new NetworkResponse(id, message)));
                        break;
                    }
                }
                catch (AggregateException)
                {
                    OnDisconnect();
                }
                catch (SocketException)
                {
                    OnDisconnect();
                }
                catch (ObjectDisposedException)
                {
                    OnDisconnect();
                }
                catch (NetworkStreamExtensions.IntegerReadException e)
                {
                    TDHPlugin.WriteError($"Error in {nameof(ClientController)} while receiving an integer:\n{e}");
                }
                catch (NetworkStreamExtensions.StringReadException e)
                {
                    TDHPlugin.WriteError($"Error in {nameof(ClientController)} while receiving a string:\n{e}");
                }
                catch (ThreadAbortException)
                {
                    return;
                }
                catch (Exception e)
                {
                    TDHPlugin.WriteError($"Error in {nameof(ClientController)}:\n{e}");
                }
            }
        }