using System; using System.Net.Sockets; using System.Text; using MafiaCommon.Packets; using MafiaServer.Events; namespace MafiaServer { public class PlayerSocketWorker { private Socket _socket; public readonly string PlayerName; public event OnDisconnectByErrorEvent OnDisconnectByErrorEvent; public event OnPlayerSendMessageEvent OnPlayerSendMessageEvent; public int Id; public PlayerSocketWorker(Socket socket) { _socket = socket; StringBuilder builder = new StringBuilder(); int bytes = 0; byte[] data = new byte[256]; do { bytes = _socket.Receive(data); builder.Append(Encoding.UTF8.GetString(data, 0, bytes)); } while (_socket.Available>0); var packet = PacketConverter.toPacket(builder.ToString()); if (packet.GetType() == typeof(ConnectPacket)) { PlayerName = ((ConnectPacket) packet).Name; MafiaServer.Game.ConnectPlayer(this); } else { _socket.Close(); } } public void sendPacket(Packet packet) { _socket.Send(PacketConverter.toBytes(packet)); } public void disconnect() { _socket.Close(); } public void run() { while (_socket.Connected) { try { StringBuilder builder = new StringBuilder(); int bytes = 0; byte[] data = new byte[256]; do { bytes = _socket.Receive(data); builder.Append(Encoding.UTF8.GetString(data, 0, bytes)); } while (_socket.Available > 0); Console.WriteLine(builder.ToString()); Packet packet = PacketConverter.toPacket(builder.ToString()); switch (packet.PacketType) { case PacketType.MessageSendPacket: OnPlayerSendMessageEvent.Invoke(this,((MessageSendPacket)packet).ChatType,((MessageSendPacket)packet).Text); break; } } catch (SocketException e) { OnDisconnectByErrorEvent.Invoke(this); } } } } }