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; } }