static void ReceivedEvent(Session session, byte[] bytes) { switch (ProtoMaker.GetProtoType(bytes)) { case ProtoType.Admin: var admin = ProtoMaker.Unpack <Client2Server.Admin>(bytes); Console.WriteLine(admin.Message); break; case ProtoType.UserAuth: var auth = ProtoMaker.Unpack <Client2Server.UserAuth>(bytes); Console.WriteLine("Username : {0}, Password : {1}", auth.Username, auth.Password); // TODO : DBから認証情報をチェック session.userInfo.Auth(); session.userInfo.Username = auth.Username; session.Send(ProtoMaker.Pack(new Server2Client.UserAuth { Username = session.userInfo.Username, })); break; case ProtoType.UserInfo: var info = new Server2Client.UserInfo(); info.numUser = sessions.Count; info.Username = new string[sessions.Count]; for (var i = 0; i < sessions.Count; ++i) { info.Username[i] = sessions[i].userInfo.Username; } session.Send(ProtoMaker.Pack(info)); break; case ProtoType.UserChat: var c2sChat = ProtoMaker.Unpack <Client2Server.UserChat>(bytes); var s2CChat = ProtoMaker.Pack(new Server2Client.UserChat { Username = session.userInfo.Username, Message = c2sChat.Message }); // 全員配信 for (var i = 0; i < sessions.Count; ++i) { sessions[i].Send(s2CChat); } break; case ProtoType.CmdMove: // 全員配信 var s2CMove = ProtoMaker.Pack(ProtoType.UserMove); for (var i = 0; i < sessions.Count; ++i) { sessions[i].Send(s2CMove); } break; } }
static void TaskReceive(TcpListener listener) { while (true) { // 接続要求あるかどうか確認 if (listener.Pending()) { // 接続要求を処理する var client = listener.AcceptTcpClient(); sessions.Add(new Session(client, ReceivedEvent)); Console.WriteLine("AcceptTcpClient : {0}", client.Client.RemoteEndPoint); } // 受信処理 foreach (var session in sessions) { session.Poll(); } // 接続切断したものがあれば削除 if (sessions.RemoveAll(s => s.Disconnected) > 0) { // TODO : 以下コピペーなのでリファクタリング var info = new Server2Client.UserInfo(); info.numUser = sessions.Count; info.Username = new string[sessions.Count]; for (var i = 0; i < sessions.Count; ++i) { info.Username[i] = sessions[i].userInfo.Username; } // 削除されたものがあるので情報を再送信 foreach (var session in sessions) { session.Send(ProtoMaker.Pack(info)); } } Task.Delay(16).Wait(); } }