Exemple #1
0
        void DataReceived(IAsyncResult ar)
        {
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            if (!mSock.Connected)
            {
                MessageBox.Show("Server is now ShutDown!");
                return;
            }

            try
            {
                //int received = obj.WorkingSocket.EndReceive(ar);
                //if (received <= 0)
                //{
                //    obj.WorkingSocket.Close();
                //    return;
                //}

                // UTF8 인코더를 사용하여 바이트 배열을 문자열로 변환한다.
                string text = Encoding.UTF8.GetString(obj.Buffer);

                // 0x01 기준으로 짜른다.
                // tokens[0] - 보낸 사람 IP
                // tokens[1] - 보낸 메세지
                string[] tokens = text.Split('/');
                string   tag    = tokens[0];
                if (tag.Equals("<LOG>")) // 로그인
                {
                    string flag = tokens[1];
                    if (flag.Equals("true"))
                    {
                        DispatchService.Invoke(() =>
                        {
                            ((App)Application.Current).StartMainWindow();
                        });
                    }
                    else
                    {
                        MessageBox.Show("Login Failed.....TT");
                        ((App)Application.Current).CloseSocket();
                    }
                }
                else if (tag.Equals("<REG>")) // 회원가입
                {
                    string flag = tokens[1];
                    if (flag.Equals("true"))
                    {
                        Window s = new SuccessMsgBox("회원가입 성공");
                        DispatchService.Invoke(() =>
                        {
                            ((App)Application.Current).StartMainWindow();
                        });
                        s.Show();
                    }
                    else
                    {
                        MessageBox.Show("Register Failed.....TT");
                        Window x = new FalseMsgBox("Fail!");
                        DispatchService.Invoke(() => //너무 많은 UI 어쩌구저쩌구 SPA? STA 나와서 invoke 처리 2019-09-19 다민
                        {
                            x.Show();
                        });
                    }
                    ((App)Application.Current).CloseSocket();
                }
                else if (tag.Equals("<ICF>")) // ID 체크
                {
                    string flag = tokens[1];
                    if (flag.Equals("true"))
                    {
                        MessageBox.Show("ID Check Sucess! in view");
                        DispatchService.Invoke(() =>
                        {
                            ((App)Application.Current).StartMainWindow();
                        });
                    }
                    else
                    {
                        MessageBox.Show("ID Check Failed.....TT");
                    }
                }
                else if (tag.Equals("<FRR>"))
                {
                    if (tokens[1] == "true")
                    {
                        MessageBox.Show("hi");
                    }
                    else
                    {
                        MessageBox.Show("false");
                    }
                }

                /*else if (tag.Equals("<FRR>")) // 친구추가
                 * {
                 *  if (MessageBoxResult.Yes == //친구 요청 받으면
                 *  MessageBox.Show(tokens[1] + tokens[3], "친구 요청", MessageBoxButton.YesNo))
                 *  {
                 *      OnSendData("<FRA>", tokens[1] + "/" + tokens[2]+ "/Yes/");
                 *  }
                 *  else
                 *  {
                 *      OnSendData("<FRA>", tokens[1] + "/" + tokens[2] + "/No/");
                 *  }
                 *  DispatchService.Invoke(() =>
                 *  {
                 *      ((App)Application.Current).StartMainWindow();
                 *  });
                 * }
                 * else if (tag.Equals("<FRA>")) // 친구 feedback
                 * {
                 *  MessageBox.Show(tokens[2] + tokens[3]);
                 *  DispatchService.Invoke(() =>
                 *  {
                 *      ((App)Application.Current).StartMainWindow();
                 *  });
                 * }
                 */
                else if (tag.Equals("<MSG>")) // 메세지
                {
                    database sqlite = new database();
                    sqlite.ChattingCreate(tokens[1], tokens[2], tokens[3], tokens[4]);
                    DispatchService.Invoke(() =>
                    {
                        ((App)Application.Current).AddChat(false, tokens[4]);
                    });
                }
                else if (tag.Equals("<FIN>"))
                {
                    closeSock();
                }
                // 텍스트박스에 추가해준다.
                // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
                // 따라서 대리자를 통해 처리한다.

                //^^^^^^^^
                // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다.
                // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
                obj.ClearBuffer();

                // 수신 대기
                obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                obj.WorkingSocket.Close();
                return;
            }
        }