void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; try { // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); Console.WriteLine(text); string[] ok = text.Split('='); ok[0] += "=="; string hi = Decrypt256(ok[0], key); Console.WriteLine(hi); DataForm data = new DataForm(); data = JsonConvert.DeserializeObject <DataForm>(hi); // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. if (data.id.Equals("Server")) { AppendText(txtHistory, string.Format("[공지사항이 등록되었습니다.] : {0}", data.text)); this.Invoke(new Action(delegate() { notificationBox.Text = data.text; })); // AppendNoti(notificationBox, data.text); } else { AppendText(txtHistory, string.Format("[받음]{0} : {1}", data.id, data.text)); } // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); } catch { } }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 string[] tokens = text.Split(':'); if (tokens[0].Equals("id")) {// 새로 접속한 클라이언트가가 "id:자신의_ID" 전송함 string id = tokens[1]; AppendText(txtHistory, string.Format("[접속] ID : {0}", id)); } if (tokens[0].Equals("JUM")) { string jum_id = tokens[1]; string jum = tokens[2]; string jum_listview = jum_id + ":" + jum; listView1.Items.Add(jum_listview); } else { string id = tokens[0]; string msg = tokens[1]; AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // 0x01 기준으로 짜른다. // tokens[0] - 보낸 사람 IP // tokens[1] - 보낸 메세지 string[] tokens = text.Split('\x01'); string ip = tokens[0]; string msg = tokens[1]; // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. AppendText(txtHistory, string.Format("[받음]{0}: {1}", ip, msg)); // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
// 데이터 수신 함수 void DataReceived(IAsyncResult ar) { AsyncObject obj = (AsyncObject)ar.AsyncState; string text = Encoding.UTF8.GetString(obj.Buffer); string[] arrDts = text.Split('\x01'); this.Invoke(new MethodInvoker(delegate() { if (arrDts[0] == "1") // 전체 채팅 { AppendText(txtHistory, string.Format("[받음]{0}: {1}", arrDts[1], arrDts[2])); } else if (arrDts[0] == "2") // 그림방 채팅 { foreach (Form OpenForm in Application.OpenForms) { if (OpenForm.Text == "Drawing Catch ( " + crenick + " )") { pg.recvChat = text; return; } } pg = new Paint_Game(this, Nick_label.Text); recvDt = text; pg.Show(); } else if (arrDts[0] == "3") // 그림 받기 { int cnt = int.Parse(arrDts[3]); foreach (Form OpenForm in Application.OpenForms) { if (OpenForm.Text == "Drawing Catch ( " + crenick + " )") { Byte[] Img = Convert.FromBase64String(arrDts[2]); TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); Bitmap Imgbit = (Bitmap)tc.ConvertFrom(Img); pg.recvPicture = Imgbit; return; } } pg = new Paint_Game(this, Nick_label.Text); pg.Show(); } else if (arrDts[0] == "4")// ******************************************************************************************배열 1씩 더하ㅡㄴ중 { int cnt = int.Parse(arrDts[4]); foreach (Form OpenForm in Application.OpenForms) { if (OpenForm.Text == "Drawing Catch ( " + crenick + " )") { if (arrDts[5] == "1" || arrDts[5] == "2") { pg.recvState = text; return; } else { pg.recvStart = text; return; } } } pg = new Paint_Game(this, Nick_label.Text); recvDt = text; pg.Show(); } else if (arrDts[0] == "5") { int cnt = int.Parse(arrDts[5]); foreach (Form OpenForm in Application.OpenForms) { if (OpenForm.Text == "Drawing Catch ( " + crenick + " )") { pg.recvCollect = text; return; } } pg = new Paint_Game(this, mainSock.LocalEndPoint.ToString()); recvDt = text; pg.Show(); } else if (arrDts[0] == "6") { int cnt = int.Parse(arrDts[5]); foreach (Form OpenForm in Application.OpenForms) { if (OpenForm.Text == "Drawing Catch ( " + crenick + " )") { pg.recvEnd = text; return; } } pg = new Paint_Game(this, Nick_label.Text); recvDt = text; pg.Show(); } else if (arrDts[0] == "7") { if (arrDts[1] == "1") { MessageBox.Show("사용 가능한 닉네임입니다!"); button2.Enabled = false; } else { MessageBox.Show("이미 사용중인 닉네임입니다!"); } } else if (arrDts[0] == "8") // 참여 { ClientList.Items.Clear(); for (int i = 2; i < arrDts.Length - 1; i++) { ClientList.Items.Add(arrDts[i]); } AppendText(txtHistory, string.Format("{0}", arrDts[1])); } else if (arrDts[0] == "9") // 퇴장 { ClientList.Items.Clear(); for (int i = 2; i < arrDts.Length - 1; i++) { ClientList.Items.Add(arrDts[i]); } AppendText(txtHistory, string.Format("{0}", arrDts[1])); } else if (arrDts[0] == "0") // 서버 종료 { mainSock.Disconnect(true); ClientList.Items.Clear(); AppendText(txtHistory, string.Format("서버와의 연결이 종료되었습니다.")); ServerConnected = false; obj.ClearBuffer(); mainSock.Close(); mainSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); return; } })); obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 50000, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 string[] tokens = text.Split(':'); if (tokens[0].Equals("ID")) {// 새로 접속한 클라이언트가 "id:자신의_ID" 전송함 string id = tokens[1]; check_name.Add(id); AppendText(txtHistory, string.Format("[접속] ID: {0}", id)); } else if (tokens[0].Equals("Server")) { string msg = tokens[1]; AppendText(txtHistory, string.Format("[공지]: {0}", msg)); string clientNumber = tokens[3]; AppendText(txtHistory, string.Format("[참여자]: {0}", clientNumber)); } else if (tokens[0].Equals("BR")) { string fromID = tokens[1]; string msg = tokens[2]; AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg)); } else if (tokens[0].Equals("TO")) { string fromID = tokens[1]; string toID = tokens[2]; string msg = tokens[3]; string receivedMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg; AppendText(txtHistory, receivedMsg); } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; try { // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } } catch { } // 받은 데이터가 없으면(연결끊어짐) 끝낸다. // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 string[] tokens = text.Split(':'); if (tokens[0].Equals("ID")) {// 새로 접속한 클라이언트가 "id:자신의_ID" 전송함 string id = tokens[1]; check_name.Add(id); AppendText(txtHistory, string.Format("[접속] ID: {0}", id)); } else if (tokens[0].Equals("Server")) { string msg = tokens[1]; AppendText(txtHistory, string.Format("[공지]: {0}", msg)); } else if (tokens[0].Equals("BR")) { string fromID = tokens[1]; string msg = tokens[2]; AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg)); } else if (tokens[0].Equals("TO")) { string fromID = tokens[1]; string toID = tokens[2]; string msg = tokens[3]; string receivedMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg; AppendText(txtHistory, receivedMsg); } //접속을 1명했다면 clientName : 1 : 1 :; //접속을 2명했다면 clientName : 2 : 1 : 2 :; if (tokens[0].Equals("PREO")) { string fromID = tokens[1]; AppendText(txtHistory, string.Format("[정답]{0}:{1}:{2}", fromID, tokens[2], tokens[3])); button_color_change_O(Int32.Parse(tokens[2])); card_check.Add(Int32.Parse(tokens[2])); button_color_change_O(Int32.Parse(tokens[3])); card_check.Add(Int32.Parse(tokens[3])); if (card_check.Count == 16) { byte[] bDts = Encoding.UTF8.GetBytes("ESC:"); mainSock.Send(bDts); } } if (tokens[0].Equals("PREX")) { string fromID = tokens[1]; AppendText(txtHistory, string.Format("[오답]{0}:{1}:{2}", fromID, tokens[2], tokens[3])); button_color_change_X(Int32.Parse(tokens[2])); button_color_change_X(Int32.Parse(tokens[3])); } if (tokens[0].Equals("ClientName"))//listView에 추가하기 { this.Invoke(new Action(delegate() { listView1.Clear(); comboBox1.Items.Clear(); comboBox1.Items.Add("BR"); })); clientNum = int.Parse(tokens[1]);//접속한 인원 수 for (int i = 0; i < clientNum; i++) { string clientName = tokens[2 + i]; this.Invoke(new Action(delegate() { listView1.Items.Add(clientName); })); this.Invoke(new Action(delegate() { comboBox1.Items.Add(clientName); })); } this.Invoke(new Action(delegate() { comboBox1.SelectedIndex = 0; })); } if (tokens[0].Equals("Card")) //listView에 추가하기 { for (int i = 0; i < 16; i++) //(1~7까의 수 * 2) 14개 { int card = int.Parse(tokens[i + 1]); //카드 값 card_list.Add(card); } this.Invoke(new Action(delegate() { button1.Text = "" + card_list[0]; button2.Text = "" + card_list[1]; button3.Text = "" + card_list[2]; button4.Text = "" + card_list[3]; button5.Text = "" + card_list[4]; button6.Text = "" + card_list[5]; button7.Text = "" + card_list[6]; button8.Text = "" + card_list[7]; button9.Text = "" + card_list[8]; button10.Text = "" + card_list[9]; button11.Text = "" + card_list[10]; button12.Text = "" + card_list[11]; button13.Text = "" + card_list[12]; button14.Text = "" + card_list[13]; button15.Text = "" + card_list[14]; button16.Text = "" + card_list[15]; })); Thread.Sleep(5000); this.Invoke(new Action(delegate() { button1.Text = "1"; button2.Text = "2"; button3.Text = "3"; button4.Text = "4"; button5.Text = "5"; button6.Text = "6"; button7.Text = "7"; button8.Text = "8"; button9.Text = "9"; button10.Text = "10"; button11.Text = "11"; button12.Text = "12"; button13.Text = "13"; button14.Text = "14"; button15.Text = "15"; button16.Text = "16"; })); } if (tokens[0].Equals("ESC")) { AppendText(txtHistory, string.Format("[게임종료]")); if (MessageBox.Show("게임을 더 하시겠습니까?", "게임종료", MessageBoxButtons.YesNo) == DialogResult.Yes) { //초-기-화 check_name.Clear(); check_card_number.Clear(); card_check.Clear(); card_list.Clear(); for (int i = 1; i < 17; i++) { button_color_change_X(i); } SendID(); } else { Application.Exit(); } } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; string con = "님이 접속하였습니다."; // 데이터 수신을 끝낸다. try { int received = obj.WorkingSocket.EndReceive(ar); if (received <= 0) { AppendText(txtHistory, string.Format("{0}님이 접속 해제하였습니다.", nameID)); obj.WorkingSocket.Disconnect(true); obj.WorkingSocket.Close(); this.Close(); return; } } catch (ObjectDisposedException e) { Console.WriteLine("에러: " + e); } // 받은 데이터가 없으면(연결끊어짐) 끝낸다. // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); //byte[] 수신 // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 //tokens[2] - 받은 x좌표 값 //tokens[3] - 받은 y좌표 값 string[] tokens = text.Split(':'); if (tokens[0].Equals("id")) {// 새로 접속한 클라이언트가가 "id:자신의_ID" 전송함 id = tokens[1]; AppendText(txtHistory, string.Format("'[접속] ID : {0}님이 접속하였습니다.'", id)); } else { id = tokens[0]; msg = tokens[1]; //인덱스 배열 범위 설정(서버) received_x = tokens[2]; received_y = tokens[3]; AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); Console.WriteLine(msg); Console.WriteLine(tokens[1]); Console.WriteLine(tokens[2]); Console.WriteLine(tokens[3]); AppendText(txtHistory, string.Format("[받음]{0}: x좌표{1}, y좌표{2}", id, received_x, received_y)); } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); try { } catch (IndexOutOfRangeException e) { Console.WriteLine("예외 오류: " + e.Message); Console.WriteLine("예외 라인: " + e.StackTrace); } }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 string[] tokens = text.Split(':'); if (tokens[0].Equals("ID")) {// 새로 접속한 클라이언트가 "id:자신의_ID" 전송함 string id = tokens[1]; check_name.Add(id); AppendText(txtHistory, string.Format("[접속] ID: {0}", id)); } else if (tokens[0].Equals("Server")) { string msg = tokens[1]; AppendText(txtHistory, string.Format("[공지]: {0}", msg)); } else if (tokens[0].Equals("BR")) { string fromID = tokens[1]; string msg = tokens[2]; AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg)); } else if (tokens[0].Equals("TO")) { string fromID = tokens[1]; string toID = tokens[2]; string msg = tokens[3]; string receivedMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg; AppendText(txtHistory, receivedMsg); } //접속을 1명했다면 clientName : 1 : 1 :; //접속을 2명했다면 clientName : 2 : 1 : 2 :; if (tokens[0].Equals("ClientName"))//listView에 추가하기 { listView1.Clear(); comboBox1.Items.Clear(); comboBox1.Items.Add("BR"); int clientNum = int.Parse(tokens[1]);//접속한 인원 수 for (int i = 0; i < clientNum; i++) { string clientName = tokens[2 + i]; listView1.Items.Add(clientName); comboBox1.Items.Add(clientName); } comboBox1.SelectedIndex = 0; } if (tokens[0].Equals("Card")) //listView에 추가하기 { List <int> card_list = new List <int>(); //카트의 리스트 for (int i = 0; i < 16; i++) //(1~7까의 수 * 2) 14개 { int card = int.Parse(tokens[i + 1]); //카드 값 card_list.Add(card); //AppendText(txtHistory, "card : " + tokens[i+1]); } button1.Text = "" + card_list[0]; button2.Text = "" + card_list[1]; button3.Text = "" + card_list[2]; button4.Text = "" + card_list[3]; button5.Text = "" + card_list[4]; button6.Text = "" + card_list[5]; button7.Text = "" + card_list[6]; button8.Text = "" + card_list[7]; button9.Text = "" + card_list[8]; button10.Text = "" + card_list[9]; button11.Text = "" + card_list[10]; button12.Text = "" + card_list[11]; button13.Text = "" + card_list[12]; button14.Text = "" + card_list[13]; button15.Text = "" + card_list[14]; button16.Text = "" + card_list[15]; Thread.Sleep(5000); button1.Text = "1"; button2.Text = "2"; button3.Text = "3"; button4.Text = "4"; button5.Text = "5"; button6.Text = "6"; button7.Text = "7"; button8.Text = "8"; button9.Text = "9"; button10.Text = "10"; button11.Text = "11"; button12.Text = "12"; button13.Text = "13"; button14.Text = "14"; button15.Text = "15"; button16.Text = "16"; } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }