public static void Connect(ESocket socket, string id, bool GameUser = true) { lock (lockobject) { // Socket -> String if (!session_string.ContainsKey(socket)) { session_string.Add(socket, id); } // String -> Socket if (!session.ContainsKey(id)) { session[id] = new List <ESocket>(); } if (GameUser) { session[id].Insert(0, socket); } else { session[id].Add(socket); } List <JObject> message = PostSystem.GetMessage(id); if (message != null) { foreach (JObject json in message) { socket.Send(json); } } } }
public async Task Login( string hostName, ushort port, string account, string password) { int loginSessionId = ++this.sessionId; // 登录realm var tcpClient = new TcpClient(); await tcpClient.ConnectAsync(hostName, port); Tuple <string, ushort, SRP6Client> realmInfo = null; // ip, port, K using (var realmSession = new RealmSession(loginSessionId, new TcpChannel(tcpClient))) { realmInfo = await realmSession.Login(account, password); Logger.Trace("session: {0}, login success!", realmSession.ID); } // 登录gate var eSocket = new ESocket(this.ioService); await eSocket.ConnectAsync(realmInfo.Item1, realmInfo.Item2); this.GateSession = new GateSession(loginSessionId, new ENetChannel(eSocket)); await this.GateSession.Login(realmInfo.Item3); }
private static void Server_FileInfoReceive(ESocket socket, JObject Message, NetworkFile file) { if (!Directory.Exists("files")) { Directory.CreateDirectory("files"); } string name; do { name = DateTime.Now.ToString("yyyy-MM-dd") + file.FileName.GetHashCode() + new Random().Next(0, 1000000); }while (File.Exists("files/" + name)); file.Success += delegate(NetworkFile files) { // Mysql에 등록. 알려줌 MysqlNode node = new MysqlNode(private_data.mysqlOption, "INSERT INTO file(name,size,path,owner,date) VALUES (?name,?size,?path,?owner,?date)"); node["name"] = files.FileName; node["size"] = files.FileSize; node["path"] = "files/" + name; node["owner"] = User.Items[socket].ID; node["date"] = DateTime.Now; long no = node.ExecuteInsertQuery(); User.Items[socket].AddFileItem((int)no); }; file.Accept("files/" + name); }
public static void GetFile(ESocket socket, JObject message) { // 파일 다운로드는 게임에서만 지원 if (User.Items.ContainsKey(socket)) { User user = User.Items[socket]; // 요청한 파일, 우편이 실제 있는지 확인 MysqlNode node = new MysqlNode(private_data.mysqlOption, "SELECT 'true' FROM post WHERE no=?no and file=?file_no and receiver=?id"); node["no"] = (int)message["post_no"]; node["file_no"] = (int)message["file_no"]; node["id"] = user.ID; using (node.ExecuteReader()) { if (node.Read()) { if (user.AddFileItem((int)message["file_no"])) { NetworkMessageList.TipMessage(socket, "우편함의 첨부파일이 인벤토리에 추가되었습니다."); } else { NetworkMessageList.TipMessage(socket, "파일이 이미 인벤토리에 존재합니다."); } } else { NetworkMessageList.TipMessage(socket, "잘못된 요청입니다."); } } } }
private static void Server_Exit(ESocket socket) { GachonSocket.Exit(socket); if (User.Items.ContainsKey(socket)) { User.Items[socket].Dispose(); } }
private static void Server_FileInfoReceive(ESocket socket, JObject Message, NetworkFile file) { file.Process += delegate(NetworkFile file56) { Console.WriteLine("받은 바이트" + ((double)file56.FinishByte / (double)file56.FileSize)); }; file.Accept("./다운.png"); }
private static void Server_Connect(ESocket socket) { LogSystem.AddLog(-1, "Program", "새로운 소켓이 연결되었습니다."); lock (users) { users.Add(socket, new OnlineUser(socket)); } }
public static void SendMessageResult(ESocket socket, bool result) { JObject json = new JObject(); json["type"] = NetworkProtocol.SendPost; json["result"] = result; socket.Send(json); }
private static void Server_Exit(ESocket socket) { LogSystem.AddLog(-1, "Program", "기존 소켓의 연결이 해제되었습니다."); lock (users) { users.Remove(socket); } }
public static void TipMessage(ESocket socket, string message) { JObject json = new JObject(); json["type"] = NetworkProtocol.TipMessage; json["message"] = message; socket.Send(json); }
public static void Login(ESocket socket, string id, string password, bool GameLogin = true) { #region 입력값이 비어있는지 체크 if (id.Trim() == "") { NetworkMessageList.TipMessage(socket, "아이디를 입력해주세요."); return; } if (password.Trim() == "") { NetworkMessageList.TipMessage(socket, "비밀번호를 입력해주세요."); return; } #endregion // 해당 입력값을 기준으로 GachonUser.GetObject 함수를 실행시킵니다. // 유효한 로그인일경우 GachonUser 클래스를 통해 실제 가천대 웹사이트와 세션이 연결되며, // 유효하지 않은 로그인일 경우 NULL값을 반환합니다. GachonUser gachonAccount = GachonUser.GetObject(id, password); if (gachonAccount == null) { NetworkMessageList.TipMessage(socket, "로그인에 실패했습니다."); return; } // 만약 게임에서 이 로그인을 요청한 경우 (안드로이드가 아닌) if (GameLogin) { // 게임 오브젝트로 관리될 새로운 User 클래스를 만들고, 소켓과 GachonUser 객체를 연결시킵니다. User user = null; try { user = new User(socket, gachonAccount); } catch (DuplicationError e) // User 클래스는 같은 GachonUser 에 대해 중복으로 생성될수 없기때문에 발생하는 에러입니다. { NetworkMessageList.TipMessage(socket, "이 계정은 다른 클라이언트에서 접속중입니다."); return; } // 유저의 위치를 임의값으로 설정 (시작 포인트) user.position = new Vector4(-69.30f, 5.33f, 47.17f, 0f); // 접속 성공 메세지 전송 JObject json = new JObject(); json["type"] = NetworkProtocol.EnterWorld; json["no"] = user.no; // 플레이어를 나타내는 객체가 무엇인지 알려준다. (서버에서 관리되는 고유 번호) socket.Send(json); } else { // 로그인 성공 메세지를 보내준다. JObject json = new JObject(); json["type"] = AndroidProtocol.Login; json["data"] = id + ":" + password; socket.Send(json); } // 가천 소켓에 이 세션을 연결시킨다. GachonSocket.Connect(socket, id, true); }
/// <summary> /// 유저에게 새로운 홈워크 정보를 알립니다. /// </summary> public static void AddHomework(ESocket socket, string course_name, string title, DateTime end) { JObject item = new JObject(); item["type"] = NetworkProtocol.Homework_Add; item["title"] = "[" + course_name + "] " + title; item["date"] = end; socket.Send(item); }
private static void Server_Exit(ESocket socket) { Console.WriteLine("누군가 종료함"); GachonSocket.Exit(socket); if (User.Items.ContainsKey(socket)) { User.Items[socket].Dispose(); } }
private static void Server_Receive_Try(ESocket socket, JObject Message) { try { Server_Receive(socket, Message); } catch (Exception e) { Console.WriteLine(e.Message + "\r\n" + e.StackTrace); } }
/// <summary> /// 해당 소켓의 로그인 권한을 얻고싶을때 사용합니다. /// </summary> /// <param name="socket"></param> /// <returns></returns> public static string GetId(ESocket socket) { lock (lockobject) { if (session_string.ContainsKey(socket)) { return(session_string[socket]); } } return(null); }
private static async void Echo(ESocket eSocket) { for (int i = 0; i < pingPangCount; ++i) { var bytes = await eSocket.ReadAsync(); CollectionAssert.AreEqual("0123456789".ToByteArray(), bytes); eSocket.WriteAsync("9876543210".ToByteArray()); } }
private static void Server_Receive(ESocket socket, Newtonsoft.Json.Linq.JObject Message) { switch ((int)Message["type"]) { case NetworkProtocol.Login: Function.Login(socket, (string)Message["id"], (string)Message["password"]); break; case NetworkProtocol.EnterWorld: User.Items[socket].Start(); break; case NetworkProtocol.Move: User.Items[socket].Move(new Vector4((float)Message["x"], (float)Message["y"], (float)Message["z"], (float)Message["q"])); break; case NetworkProtocol.Chat: User.Items[socket].ChatMessage((string)Message["message"], ChatType.Normal); break; case NetworkProtocol.Action: Function.NPC_Action((NPC)GameObject.Items[(int)Message["no"]], User.Items[socket]); break; case NetworkProtocol.Post_Open: PostSystem.GetPage(User.Items[socket], (int)Message["page"]); break; case NetworkProtocol.Post_Detail: PostSystem.GetItem(User.Items[socket], (int)Message["no"]); break; case NetworkProtocol.NewStudy: StudySystem.NewStudy(User.Items[socket], Message); break; case NetworkProtocol.Keyword_Remove: KeywordSystem.RemoveItem(User.Items[socket], (string)Message["keyword"]); break; case NetworkProtocol.Keyword_Add: KeywordSystem.AddItem(User.Items[socket], (string)Message["keyword"]); break; case NetworkProtocol.Inventory_Remove: User.Items[socket].RemoveItem((int)Message["no"]); break; case NetworkProtocol.File_Download: User.Items[socket].DownloadItem((int)Message["no"], (string)Message["path"]); break; } }
private static void Server_FileInfoReceive(ESocket socket, JObject Message, NetworkFile file) { string name = FileSystem.GetRandomName(file.FileName); file.Success += delegate(NetworkFile files) { // Mysql에 등록. 알려줌 long no = FileSystem.FileQuery(name, file.FileName, User.Items[socket]); User.Items[socket].AddFileItem((int)no); }; file.Accept(name); }
private static void Server_Receive(ESocket socket, JObject Message) { if ((int)Message["type"] == 0) { JObject json = new JObject(); json["type"] = 0; json["message"] = list[socket].name + " : " + Message["message"]; foreach (ESocket item in list.Keys) { item.Send(json); } Console.WriteLine(json["message"]); } }
public static void ReturnInfo(ESocket socket) { string id = GachonSocket.GetId(socket); if (id != null) { JObject json = new JObject(); json["type"] = AndroidProtocol.Info; json["name"] = GachonObjects.AllUser[id].Name; json["department"] = GachonObjects.AllUser[id].Department; json["number"] = GachonObjects.AllUser[id].StudentNumber; socket.Send(json); } }
private void Server_FileInfoReceive(ESocket socket, JObject Message, NetworkFile file) { // 파일에 대해 진행바 딜리게이트 연결 SocketFile.NewFile(file); if ((bool)Message["open"]) // 내가 파일 오픈을 요청했는지 여부가 담겨있다. { // 성공적으로 파일을 받았을 경우 실행되는 이벤트 file.Success += delegate(NetworkFile files) { System.Diagnostics.Process.Start(files.Path); }; } file.Accept((string)Message["path"]); }
private static void Server_FileInfoReceive(ESocket socket, JObject Message, NetworkFile file) { Console.WriteLine(Message.ToString()); file.Accept("./U" + file.FileName); if (file.FileName == "3.png") { file.End += delegate(NetworkFile file5) { Console.WriteLine("3번 파일 전송 끝"); NServerFile newfile = new NServerFile(socket, "./U7.png"); newfile.Process += delegate(NetworkFile file56) { Console.WriteLine("받은 바이트" + ((double)newfile.FinishByte / (double)newfile.FileSize)); }; socket.SendFile(Message, newfile); }; } }
public User(ESocket socket, GachonUser user) { lock (Items) { foreach (User item in Items.Values) { if (item.gachonAccount == user) { throw new DuplicationError("중복 로그인"); } } this.socket = socket; gachonAccount = user; Items.Add(socket, this); name = gachonAccount.Name; skin = "Eve"; } }
public static void Exit(ESocket socket) { lock (lockobject) { // Socket -> String if (session_string.ContainsKey(socket)) { string id = session_string[socket]; session_string.Remove(socket); session[id].Remove(socket); if (session[id].Count == 0) { session.Remove(id); } } } }
/// <summary> /// 가천 라이브러리에서 새로운 게시글이 올라오면 이 함수를 이벤트로 실행시킵니다. /// </summary> /// <param name="gclass">게시글이 올라온 강의</param> /// <param name="postItem">게시글</param> public static void NewPost(GachonClass gclass, PostItem postItem) { MysqlNode node = new MysqlNode(private_data.mysqlOption, "SELECT * FROM keyword"); JArray array = new JArray(); string ignore_id = ""; using (node.ExecuteReader()) { while (node.Read()) { if (ignore_id == node.GetString("student_id")) { continue; } string keyword = node.GetString("keyword"); if (CheckValid(keyword, gclass.Title, postItem.Title)) { ignore_id = node.GetString("student_id"); PostSystem.SendPost( string.Format("[{0}] 새로운 게시글 등록", gclass.Title), string.Format("[게시글 정보]\r\n{0} - {1}\r\n\r\n{2}\r\n\r\nURL : {3}", postItem.Title, postItem.Publisher, postItem.Content, postItem.url), "admin_keyword", ignore_id , false); ESocket socket = GachonSocket.GetOnlineUser(ignore_id); if (socket != null) { if (User.Items.ContainsKey(socket)) { User.Items[socket].ToChatMessage("[" + gclass.Title + "] 에 새로운 게시글이 등록되었습니다.", ChatType.System); if (postItem.posttype == BoardType.PostType.Homework) { NetworkMessageList.AddHomework(socket, gclass.Title, postItem.Title, postItem.e_time); } } } } } } }
private static async void ServerEvent(EService service, Barrier barrier) { barrier.SignalAndWait(); bool isRunning = true; while (isRunning) { Log.Debug("start accept"); var eSocket = new ESocket(service); await eSocket.AcceptAsync(); eSocket.Disconnect += ev => { isRunning = false; service.Stop(); }; Echo(eSocket); } }
public User(ESocket socket, GachonUser user) { // 쓰레드 충돌을 막기위한 lock lock (Items) { // 이미 같은 아이디로 로그인한 유저가 있으면 에러 발생 foreach (User item in Items.Values) { if (item.gachonAccount == user) { throw new DuplicationError("중복 로그인"); } } this.socket = socket; gachonAccount = user; Items.Add(socket, this); name = gachonAccount.Name; group = gachonAccount.StudentNumber.Substring(2, 2); // 이름 앞에 뜨는 그룹을 학번으로 표시 ( 201735861 -> 17) skin = "Eve"; // 기본 스킨 } }
public static void SendPost(string title, string content, string sender, string receiver, bool notice = true) { DateTime date = DateTime.Now; MysqlNode Node = new MysqlNode(private_data.mysqlOption, "INSERT INTO post(title, content, sender, receiver, date) VALUES (?title, ?content, ?sender, ?receiver, ?date)"); Node["title"] = title; Node["content"] = content; Node["sender"] = sender; Node["receiver"] = receiver; Node["date"] = date.ToString("yyyy-MM-dd HH:mm:ss"); Node.ExecuteNonQuery(); JObject json = new JObject(); json["type"] = NetworkProtocol.PostAlarm; json["title"] = title; json["content"] = content; json["receiver"] = receiver; json["date"] = date; if (notice == true) { // 받는사람이 게임 또는 스마트폰을 통해 접속중인가 ESocket socket = GachonSocket.GetOnlineUser(receiver); if (socket != null) { if (User.Items.ContainsKey(socket)) { User.Items[socket].ToChatMessage("[우편함] 새로운 메세지가 도착했습니다.", ChatType.System); } else { socket.Send(json); } } else { AddQueue(receiver, json); } } }
private static async void ClientEvent(EService service, string hostName, ushort port) { var eSocket = new ESocket(service); await eSocket.ConnectAsync(hostName, port); var stopWatch = new Stopwatch(); stopWatch.Start(); for (int i = 0; i < pingPangCount; ++i) { eSocket.WriteAsync("0123456789".ToByteArray()); var bytes = await eSocket.ReadAsync(); CollectionAssert.AreEqual("9876543210".ToByteArray(), bytes); } stopWatch.Stop(); Log.Debug("time: {0}", stopWatch.ElapsedMilliseconds); await eSocket.DisconnectAsync(); service.Stop(); }
public static void KeywordList(ESocket socket) { string id = GachonSocket.GetId(socket); if (id != null) { MysqlNode node = new MysqlNode(private_data.mysqlOption, "SELECT * FROM keyword WHERE student_id=?id"); node["id"] = id; JArray array = new JArray(); using (node.ExecuteReader()) { while (node.Read()) { array.Add(node.GetString("keyword")); } } JObject json = new JObject(); json["type"] = AndroidProtocol.KeywordList; json["list"] = array; socket.Send(json); } }