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