Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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, "잘못된 요청입니다.");
                    }
                }
            }
        }
Пример #5
0
 private static void Server_Exit(ESocket socket)
 {
     GachonSocket.Exit(socket);
     if (User.Items.ContainsKey(socket))
     {
         User.Items[socket].Dispose();
     }
 }
Пример #6
0
 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");
 }
Пример #7
0
 private static void Server_Connect(ESocket socket)
 {
     LogSystem.AddLog(-1, "Program", "새로운 소켓이 연결되었습니다.");
     lock (users)
     {
         users.Add(socket, new OnlineUser(socket));
     }
 }
Пример #8
0
        public static void SendMessageResult(ESocket socket, bool result)
        {
            JObject json = new JObject();

            json["type"]   = NetworkProtocol.SendPost;
            json["result"] = result;
            socket.Send(json);
        }
Пример #9
0
 private static void Server_Exit(ESocket socket)
 {
     LogSystem.AddLog(-1, "Program", "기존 소켓의 연결이 해제되었습니다.");
     lock (users)
     {
         users.Remove(socket);
     }
 }
Пример #10
0
        public static void TipMessage(ESocket socket, string message)
        {
            JObject json = new JObject();

            json["type"]    = NetworkProtocol.TipMessage;
            json["message"] = message;
            socket.Send(json);
        }
Пример #11
0
        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);
        }
Пример #12
0
        /// <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);
        }
Пример #13
0
 private static void Server_Exit(ESocket socket)
 {
     Console.WriteLine("누군가 종료함");
     GachonSocket.Exit(socket);
     if (User.Items.ContainsKey(socket))
     {
         User.Items[socket].Dispose();
     }
 }
Пример #14
0
 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);
     }
 }
Пример #15
0
 /// <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);
 }
Пример #16
0
        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());
            }
        }
Пример #17
0
        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;
            }
        }
Пример #18
0
        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);
        }
Пример #19
0
 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"]);
     }
 }
Пример #20
0
        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);
            }
        }
Пример #21
0
    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"]);
    }
Пример #22
0
 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);
         };
     }
 }
Пример #23
0
 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";
     }
 }
Пример #24
0
        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);
                    }
                }
            }
        }
Пример #25
0
        /// <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);
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #26
0
        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);
            }
        }
Пример #27
0
 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";                                       // 기본 스킨
     }
 }
Пример #28
0
        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);
                }
            }
        }
Пример #29
0
        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();
        }
Пример #30
0
        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);
            }
        }