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)); // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다. for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } } // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
private void StreamReceive(IAsyncResult ar) { lock (_lock) { AsyncObject obj = (AsyncObject)ar.AsyncState; try { int len = obj.WorkingSocket.EndReceive(ar); for (int i = 0; i < len; i++) { _byteList.Add(obj.Buffer[i]); } obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, StreamReceive, obj); } catch (Exception ex) { } ProcessStreamByte(); } }
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; } Console.WriteLine(obj.Buffer); // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); Console.WriteLine("데이터 브로드 캐스트" + text); string[] arrayText; arrayText = text.ToString().Split('?'); DataForm data = new DataForm(); data = JsonConvert.DeserializeObject <DataForm>(arrayText[0]); if (data.req == null) { MsgBoxHelper.Error("null"); data.req = ""; } if (data.req.Equals("close")) { MsgBoxHelper.Error("close 들어옴"); Console.WriteLine("close 들어옴"); obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. AppendText(txtHistory, string.Format("[받음]{0}: {1}", data.id, data.text)); // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다. for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { string request = JsonConvert.SerializeObject(data); AESEncrypt256(request, key); Encoding.UTF8.GetBytes(AESEncrypt256(request, key)); Console.WriteLine("이 암호화된 내용으로 브로드 캐스팅 : " + AESEncrypt256(request, key)); socket.Send(Encoding.UTF8.GetBytes(AESEncrypt256(request, key))); } catch { // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. try { socket.Dispose(); } catch { } // connectedClients.RemoveAt(i); } } } // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. 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) { //AppendText(txtHistory, string.Format("클라이언트 접속해제?{0}", clientNum)); if (clientNum > 0) { foreach (KeyValuePair <string, Socket> clients in connectedClients) { if (obj.WorkingSocket == clients.Value) { string key = clients.Key; try { connectedClients.Remove(key); } catch { } break; } } } obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); clientNum--; // AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum)); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); AppendText(txtHistory, text); // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 string[] tokens = text.Split(':'); string id = null; if (tokens[0].Equals("JUM")) { string jum_id = tokens[1]; string jum = tokens[2]; byte[] bDts = Encoding.UTF8.GetBytes("JUM" + ':' + jum_id + ":" + jum); // 연결된 모든 클라이언트에게 전송한다. } if (tokens[0].Equals("id")) { clientNum++; id = tokens[1]; AppendText(txtHistory, string.Format("[접속{0}]ID : {1}", clientNum, id)); // 연결된 클라이언트 리스트에 추가해준다. connectedClients.Add(id, obj.WorkingSocket); } else { id = tokens[0]; string msg = tokens[1]; AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); // 전체 클라이언트에게 데이터를 보낸다. sendAll(obj.WorkingSocket, obj.Buffer); // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. 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'); Random rand = new Random(); this.Invoke(new MethodInvoker(delegate { if (arrDts[0] == "1") // 전체톡 { AppendText(txtHistory, string.Format("[받음]{0}: {1}", arrDts[1], arrDts[2])); for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } } } else if (arrDts[0] == "2") // 게임톡 { int cnt = int.Parse(arrDts[5]); int x = 0; string sendDt = ""; if (arrDts[4] == ans) { if (anslist[10] != "") { arrDts[0] = "6"; arrDts[4] = ans; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; if (x == 6) { sendDt += "!" + '\x01'; } } byte[] sendByt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 5; j >= 6; j--) { string nip = ""; for (int k = 0; k < ClientList.Items.Count; k++) { if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text)) { nip = ClientList.Items[k].SubItems[0].Text; break; } } if (nip != "") { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendByt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } } ans = ""; } else { int ranpbm = 0; int endi = 1; while (endi != 0) { endi = 0; ranpbm = rand.Next(0, problem.Length); for (int j = 1; j < anslist.Length; j++) { if (anslist[j] == "") { break; } if (problem[ranpbm] == anslist[j]) { endi++; } } } arrDts[0] = "5"; arrDts[3] = ans; arrDts[4] = problem[ranpbm]; for (int i = 0; i < anslist.Length; i++) { if (anslist[i] == "") { anslist[i] = arrDts[4]; break; } } ans = arrDts[4]; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; } byte[] sendBt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 5; j >= 6; j--) { string nip = ""; for (int k = 0; k < ClientList.Items.Count; k++) { if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text)) { nip = ClientList.Items[k].SubItems[0].Text; break; } } if (nip != "") { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendBt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } } } } else { for (int j = cnt + 5; j >= 6; j--) { string nip = ""; for (int k = 0; k < ClientList.Items.Count; k++) { if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text)) { nip = ClientList.Items[k].SubItems[0].Text; break; } } if (nip != "") { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } break; } } } } } } else if (arrDts[0] == "3") // 그림전송 { int cnt = int.Parse(arrDts[3]); for (int j = cnt + 3; j >= 4; j--) { string nip = ""; for (int k = 0; k < ClientList.Items.Count; k++) { if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text)) { nip = ClientList.Items[k].SubItems[0].Text; break; } } if (nip != "") { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } break; } } } } } else if (arrDts[0] == "4") { int cnt = int.Parse(arrDts[4]); if (arrDts[5] == "3") { anslist = new string[] { "", "", "", "", "", "", "", "", "", "", "" }; anslist[0] = arrDts[1]; int ran = rand.Next(6, cnt + 6); int ranpbm = rand.Next(0, problem.Length); while (arrDts[ran].Equals(arrDts[3])) { ran = rand.Next(6, cnt + 6); } arrDts[3] = arrDts[ran]; arrDts[5] = problem[ranpbm]; anslist[1] = arrDts[5]; ans = arrDts[5]; string sendDt = ""; int x = 0; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; } byte[] sendBt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 5; j >= 6; j--) { string nip = ""; for (int k = 0; k < ClientList.Items.Count; k++) { if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text)) { nip = ClientList.Items[k].SubItems[0].Text; break; } } if (nip != "") { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendBt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } } } else { for (int j = cnt + 5; j >= 6; j--) { string nip = ""; for (int k = 0; k < ClientList.Items.Count; k++) { if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text)) { nip = ClientList.Items[k].SubItems[0].Text; break; } } if (nip != "") { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } break; } } } } } } else if (arrDts[0] == "5") { int cnt = int.Parse(arrDts[5]); string sendDt = ""; int x = 0; if (anslist[10] != "") { arrDts[0] = "6"; arrDts[3] = ans; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; } byte[] sendByt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 6; j >= 7; j--) { string nip = ""; for (int k = 0; k < ClientList.Items.Count; k++) { if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text)) { nip = ClientList.Items[k].SubItems[0].Text; break; } } if (nip != "") { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendByt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } } ans = ""; return; } int ran = rand.Next(7, cnt + 7); int ranpbm = rand.Next(0, problem.Length); while (arrDts[ran].Equals(arrDts[3])) { ran = rand.Next(7, cnt + 7); } int endi = 1; while (endi != 0) { endi = 0; ranpbm = rand.Next(0, problem.Length); for (int j = 1; j < anslist.Length; j++) { if (anslist[j] == "") { break; } if (problem[ranpbm] == anslist[j]) { endi++; } } } arrDts[2] = arrDts[ran]; arrDts[3] = ans; arrDts[4] = problem[ranpbm]; for (int i = 0; i < anslist.Length; i++) { if (anslist[i] == "") { anslist[i] = arrDts[4]; break; } } ans = arrDts[4]; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; } byte[] sendBt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 6; j >= 7; j--) { string nip = ""; for (int k = 0; k < ClientList.Items.Count; k++) { if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text)) { nip = ClientList.Items[k].SubItems[0].Text; break; } } if (nip != "") { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendBt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } } } else if (arrDts[0] == "7") // 닉네임 중복검사 { bool chknick = true; string mssg; for (int i = 0; i < ClientList.Items.Count; i++) { if (arrDts[2].Equals(ClientList.Items[i].SubItems[1].Text)) { chknick = false; break; } } if (chknick) { mssg = "1"; } else { mssg = "0"; } byte[] overlapsd = Encoding.UTF8.GetBytes("7" + '\x01' + mssg + '\x01'); for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[1].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(overlapsd); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } else if (arrDts[0] == "8") { ListViewItem lstitm = new ListViewItem(); lstitm.Text = arrDts[2]; lstitm.SubItems.Add(arrDts[3]); ClientList.Items.Add(lstitm); string msg = "[ " + arrDts[3] + " ]님이 입장하였습니다."; string nicklist = "8" + '\x01' + msg + '\x01'; for (int i = 0; i < ClientList.Items.Count; i++) { nicklist += ClientList.Items[i].SubItems[1].Text + '\x01'; } byte[] lbip = Encoding.UTF8.GetBytes(nicklist); for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; try { socket.Send(lbip); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } AppendText(txtHistory, string.Format("클라이언트 (@ {0})가 연결되었습니다.", arrDts[3])); } else if (arrDts[0] == "9") // 클라이언트 리스트 갱신 { for (int i = ClientList.Items.Count - 1; i >= 0; i--) { if (ClientList.Items[i].SubItems[1].Text.Equals(arrDts[1])) { ClientList.Items.Remove(ClientList.Items[i]); connectedClients.Remove(connectedClients[i]); break; } } string msg = "[ " + arrDts[1] + " ]님이 퇴장하였습니다."; string iptext = "9" + '\x01' + msg + '\x01'; for (int i = 0; i < ClientList.Items.Count; i++) { iptext += ClientList.Items[i].SubItems[1].Text + '\x01'; } byte[] lbip = Encoding.UTF8.GetBytes(iptext); for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; try { socket.Send(lbip); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } obj.WorkingSocket.Close(); return; } })); obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 50000, 0, DataReceived, obj); }
// 데이터 수신 함수 void DataReceived(IAsyncResult ar) { AsyncObject obj = (AsyncObject)ar.AsyncState; string text = Encoding.UTF8.GetString(obj.Buffer); string[] arrDts = text.Split('\x01'); Random rand = new Random(); if (arrDts[0] == "1") // 전체톡 { AppendText(txtHistory, string.Format("[받음]{0}: {1}", arrDts[1], arrDts[2])); for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } } } else if (arrDts[0] == "2") // 게임톡 { int cnt = int.Parse(arrDts[4]); int x = 0; string sendDt = ""; if (arrDts[3] == ans) { if (anslist[10] != null) { arrDts[0] = "6"; arrDts[2] = ans; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; if (x == 5) { sendDt += "!" + '\x01'; } } byte[] sendByt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 4; j >= 5; j--) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendByt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } ans = ""; return; } int ranpbm = 0; int endi = 1; while (endi != 0) { endi = 0; ranpbm = rand.Next(0, problem.Length); for (int j = 1; j < anslist.Length; j++) { if (anslist[j] == null) { break; } if (problem[ranpbm] == anslist[j]) { endi++; } } } arrDts[0] = "5"; arrDts[2] = ans; arrDts[3] = problem[ranpbm]; for (int i = 0; i < anslist.Length; i++) { if (anslist[i] == null) { anslist[i] = arrDts[3]; break; } } ans = arrDts[3]; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; } byte[] sendBt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 4; j >= 5; j--) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendBt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } } else { for (int j = cnt + 4; j >= 5; j--) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } break; } } } } } else if (arrDts[0] == "3") // 그림전송 { int cnt = int.Parse(arrDts[2]); for (int j = cnt + 2; j >= 3; j--) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } break; } } } } else if (arrDts[0] == "4") { int cnt = int.Parse(arrDts[3]); if (arrDts[4] == "3") { anslist[0] = cnt + ""; int ran = rand.Next(5, cnt + 5); int ranpbm = rand.Next(0, problem.Length); while (arrDts[ran].Equals(arrDts[2])) { ran = rand.Next(5, cnt + 5); } arrDts[2] = arrDts[ran]; arrDts[4] = problem[ranpbm]; anslist[1] = arrDts[4]; ans = arrDts[4]; string sendDt = ""; int x = 0; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; } byte[] sendBt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 4; j >= 5; j--) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendBt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } } else { for (int j = cnt + 4; j >= 5; j--) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } break; } } } } } else if (arrDts[0] == "5") { int cnt = int.Parse(arrDts[4]); string sendDt = ""; int x = 0; if (anslist[10] != null) { arrDts[0] = "6"; arrDts[2] = ans; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; } byte[] sendByt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 5; j >= 6; j--) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendByt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } ans = ""; return; } int ran = rand.Next(6, cnt + 6); int ranpbm = rand.Next(0, problem.Length); while (arrDts[ran].Equals(arrDts[1])) { ran = rand.Next(6, cnt + 6); } int endi = 1; while (endi != 0) { endi = 0; ranpbm = rand.Next(0, problem.Length); for (int j = 1; j < anslist.Length; j++) { if (anslist[j] == null) { break; } if (problem[ranpbm] == anslist[j]) { endi++; } } } arrDts[1] = arrDts[ran]; arrDts[2] = ans; arrDts[3] = problem[ranpbm]; for (int i = 0; i < anslist.Length; i++) { if (anslist[i] == null) { anslist[i] = arrDts[3]; break; } } ans = arrDts[3]; foreach (string str in arrDts) { sendDt += arrDts[x] + '\x01'; x++; } byte[] sendBt = Encoding.UTF8.GetBytes(sendDt); for (int j = cnt + 5; j >= 6; j--) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString())) { Socket socket = connectedClients[i]; try { socket.Send(sendBt); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } break; } } } } else if (arrDts[0] == "9") // 클라이언트 리스트 갱신 { this.Invoke(new MethodInvoker(delegate() { for (int i = ClientList.Items.Count - 1; i >= 0; i--) { if (ClientList.Items[i].ToString().Equals(arrDts[1])) { ClientList.Items.Remove(ClientList.Items[i]); connectedClients.Remove(connectedClients[i]); break; } } string iptext = "9" + '\x01'; for (int i = connectedClients.Count - 1; i >= 0; i--) { iptext += connectedClients[i].RemoteEndPoint.ToString() + '\x01'; } byte[] lbip = Encoding.UTF8.GetBytes(iptext); for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; try { socket.Send(lbip); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } })); obj.WorkingSocket.Close(); 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) { // AppendText(txtHistory, string.Format("클라이언트 접속해제?{0}", clientNum)); if (clientNum > 0) { foreach (KeyValuePair <string, Socket> clients in connectedClients) { if (obj.WorkingSocket == clients.Value) { string key = clients.Key; string clientIDs = ""; try { client_ID.RemoveAt(client_ID.IndexOf(key)); listView1.Clear(); for (int i = 0; i < client_ID.Count; i++) { listView1.Items.Add(client_ID[i]); clientIDs += client_ID[i]; clientIDs += ":"; } connectedClients.Remove(key); AppendText(txtHistory, string.Format("접속해제완료:{0}", key)); byte[] bDts = Encoding.UTF8.GetBytes("ClientName" + ':' + clientNum + ":" + clientIDs); sendAll(null, bDts); } catch { } break; } } } obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); clientNum--; //참여자 // AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum)); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); AppendText(txtHistory, text); // : 기준으로 짜른다. string[] tokens = text.Split(':'); string fromID = null; string toID = null; string code = tokens[0]; if (code.Equals("ID")) // 받은 문자열 id:자신의 id { fromID = tokens[1].Trim(); //fromID; if (client_ID.Contains(fromID) == true) //이미 등록된 아이디면 (1) (2)로 출력되게 끔 { if (client_ID.Contains(fromID + "(2)") == true) { fromID += "(3)"; } else { fromID += "(2)"; } } clientNum++; //참여자 //listView1.Items.Add(fromID);//참여자 목록 AppendListText(listView1, "시발"); AppendText(txtHistory, string.Format("[접속{0}]ID:{1}:{2}", clientNum, fromID, obj.WorkingSocket.RemoteEndPoint.ToString())); // 연결된 클라이언트 리스트에 추가해준다. connectedClients.Add(fromID, obj.WorkingSocket); // 전체 클라이언트에게 데이터를 보낸다. sendAll(obj.WorkingSocket, obj.Buffer); if (clientNum > 0) { //참여자 목록 client_ID.Add(fromID); string clientIDs = ""; for (int i = 0; i < client_ID.Count; i++) { clientIDs += client_ID[i]; clientIDs += ":"; } //접속을 1명했다면 clientName : clientNum : 1 :; //접속을 2명했다면 clientName : clientNum : 1 : 2 :; byte[] bDts = Encoding.UTF8.GetBytes("ClientName" + ':' + clientNum + ":" + clientIDs); sendAll(null, bDts); } if (clientNum == 3 && card_send == 0) // 3명 접속하면 시작 { card_mix(); string card_list = ""; for (int i = 0; i < card_number_list.Count; i++) { card_list += card_number_list[i]; card_list += ":"; // : 단위로 분할 } AppendText(txtHistory, card_list); // AppendText(txtHistory, string.Format("Card" + ':' + card_list)); byte[] bDtss = Encoding.UTF8.GetBytes("Card" + ':' + card_list); sendAll(obj.WorkingSocket, bDtss); card_send++;//한번만 보내주기 위해 } } else if (code.Equals("BR")) { fromID = tokens[1].Trim(); //fromID string msg = tokens[2]; AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg)); sendAll(obj.WorkingSocket, obj.Buffer); } else if (code.Equals("TO")) // TO:to_id:message { fromID = tokens[1].Trim(); //fromID toID = tokens[2].Trim(); string msg = tokens[3]; string sendingMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg; AppendText(txtHistory, sendingMsg); connectedClients.TryGetValue(toID, out obj.WorkingSocket); sendTo(obj.WorkingSocket, obj.Buffer); //AppendText(txtHistory, "To socket" + socket.RemoteEndPoint.ToString()); } else { } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. 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) { // AppendText(txtHistory, string.Format("클라이언트 접속해제?{0}", clientNum)); if (clientNum > 0) { foreach (KeyValuePair <string, Socket> clients in connectedClients) { if (obj.WorkingSocket == clients.Value) { string key = clients.Key; string clientIDs = ""; try { client_ID.RemoveAt(client_ID.IndexOf(key)); this.Invoke(new Action(delegate() { listView1.Clear(); //리스트뷰 clear })); for (int i = 0; i < client_ID.Count; i++) { this.Invoke(new Action(delegate() { listView1.Items.Add(client_ID[i]); //서버에 접속한 클라이언트 추가 })); clientIDs += client_ID[i]; clientIDs += ":"; } connectedClients.Remove(key); AppendText(txtHistory, string.Format("접속해제완료:{0}", key)); clientNum--; byte[] bDts = Encoding.UTF8.GetBytes("ClientName" + ':' + clientNum + ":" + clientIDs); sendAll(null, bDts); } catch { } break; } } } try { obj.WorkingSocket.Disconnect(false); } catch { } obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); // AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum)); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // : 기준으로 짜른다. string[] tokens = text.Split(':'); string fromID = null; string toID = null; string code = tokens[0]; if (code.Equals("ID")) // 받은 문자열 id:자신의 id { fromID = tokens[1].Trim(); //fromID; if (client_ID.Contains(fromID) == true) //같은 아이디 접속 { if (client_ID.Contains(fromID + "(2)") == true) { fromID += "(3)"; } else { fromID += "(2)"; } } clientNum++; //참여자 this.Invoke(new Action(delegate() { this.Invoke(new Action(delegate() { listView1.Items.Add(fromID);//참여자 목록 })); })); AppendText(txtHistory, string.Format("[접속{0}]ID:{1}:{2}", clientNum, fromID, obj.WorkingSocket.RemoteEndPoint.ToString())); // 연결된 클라이언트 리스트에 추가해준다. connectedClients.Add(fromID, obj.WorkingSocket); // 전체 클라이언트에게 데이터를 보낸다. sendAll(obj.WorkingSocket, obj.Buffer); if (clientNum > 0) { //참여자 목록 client_ID.Add(fromID); string clientIDs = ""; for (int i = 0; i < client_ID.Count; i++) { clientIDs += client_ID[i]; clientIDs += ":"; } //접속을 1명했다면 clientName : clientNum : 1 :; //접속을 2명했다면 clientName : clientNum : 1 : 2 :; byte[] bDts = Encoding.UTF8.GetBytes("ClientName" + ':' + clientNum + ":" + clientIDs); sendAll(null, bDts); } if (clientNum == 3 && card_send == 0) // 3명 접속하면 시작 { card_mix(); //esc_count = 0; string card_list = ""; for (int i = 0; i < card_number_list.Count; i++) { card_list += card_number_list[i]; card_list += ":"; } AppendText(txtHistory, card_list); byte[] bDtss = Encoding.UTF8.GetBytes("Card" + ':' + card_list); sendAll(null, bDtss); card_send++; //한번만 보내주기 위해 } } //전체 메시지 else if (code.Equals("BR")) { fromID = tokens[1].Trim(); //fromID string msg = tokens[2]; AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg)); sendAll(obj.WorkingSocket, obj.Buffer); } //귓속말 else if (code.Equals("TO")) // TO:to_id:message { fromID = tokens[1].Trim(); //fromID toID = tokens[2].Trim(); string msg = tokens[3]; string sendingMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg; AppendText(txtHistory, sendingMsg); connectedClients.TryGetValue(toID, out obj.WorkingSocket); sendTo(obj.WorkingSocket, obj.Buffer); //AppendText(txtHistory, "To socket" + socket.RemoteEndPoint.ToString()); } else { } //Client가 답을 보냈을 때 //Client가 답을 썼을 때 맞는지 틀렸는지 비교 if (code.Equals("PRE")) { fromID = tokens[1].Trim(); //fromID if (card_number_list[Int32.Parse(tokens[2]) - 1] == card_number_list[Int32.Parse(tokens[3]) - 1]) { button_color_change_O(Int32.Parse(tokens[2])); button_color_change_O(Int32.Parse(tokens[3])); card_OX_list.Add(Int32.Parse(tokens[2])); card_OX_list.Add(Int32.Parse(tokens[3])); byte[] bDtss = Encoding.UTF8.GetBytes("PREO" + ":" + fromID + ":" + tokens[2] + ":" + tokens[3]); sendAll(null, bDtss); } else { button_color_change_X(Int32.Parse(tokens[2])); button_color_change_X(Int32.Parse(tokens[3])); byte[] bDtss = Encoding.UTF8.GetBytes("PREX" + ":" + fromID + ":" + tokens[2] + ":" + tokens[3]); sendAll(null, bDtss); } } //게임 종료 if (code.Equals("ESC")) { if (gameover == 1) { byte[] bDtss = Encoding.UTF8.GetBytes("ESC" + ":" + "게임종료"); sendAll(null, bDtss); client_ID.Clear(); connectedClients.Clear(); for (int i = 1; i < 17; i++) { button_color_change_X(i); } clientNum = 0; card_send = 0; card_OX_list.Clear(); this.Invoke(new Action(delegate() { listView1.Clear(); })); gameover++; } } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. 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) { // AppendText(txtHistory, string.Format("클라이언트 접속해제?{0}", clientNum)); if (clientNum > 0) { foreach (KeyValuePair <string, Socket> clients in connectedClients) { if (obj.WorkingSocket == clients.Value) { string key = clients.Key; try { listView1.Items.RemoveByKey(key); connectedClients.Remove(key); AppendText(txtHistory, string.Format("접속해제완료:{0}", key)); }catch { } break; } } } obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); clientNum--; // AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum)); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); AppendText(txtHistory, text); // : 기준으로 짜른다. string[] tokens = text.Split(':'); string fromID = null; string toID = null; string code = tokens[0]; if (code.Equals("ID")) // 받은 문자열 id:자신의 id { clientNum++; fromID = tokens[1].Trim(); //fromID; listView1.Items.Add(fromID); //참여자 목록 AppendText(txtHistory, string.Format("[접속{0}]ID:{1}:{2}", clientNum, fromID, obj.WorkingSocket.RemoteEndPoint.ToString())); // 연결된 클라이언트 리스트에 추가해준다. connectedClients.Add(fromID, obj.WorkingSocket); // 전체 클라이언트에게 데이터를 보낸다. sendAll(obj.WorkingSocket, obj.Buffer); } else if (code.Equals("BR")) { fromID = tokens[1].Trim(); //fromID string msg = tokens[2]; AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg)); sendAll(obj.WorkingSocket, obj.Buffer); } else if (code.Equals("TO")) // TO:to_id:message { fromID = tokens[1].Trim(); //fromID toID = tokens[2].Trim(); string msg = tokens[3]; string sendingMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg; AppendText(txtHistory, sendingMsg); connectedClients.TryGetValue(toID, out obj.WorkingSocket); sendTo(obj.WorkingSocket, obj.Buffer); //AppendText(txtHistory, "To socket" + socket.RemoteEndPoint.ToString()); } else { } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. 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) { AppendText(txtHistory, string.Format("{0}님이 방을 나갔습니다.", id)); if (clientNum > 0) { foreach (KeyValuePair <string, Socket> clients in connectedClients) { if (obj.WorkingSocket == clients.Value) { string key = clients.Key; try { connectedClients.Remove(key); } catch { } // break; } } } obj.WorkingSocket.Disconnect(true); obj.WorkingSocket.Close(); clientNum--; //AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum)); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); //AppendText(txtHistory, text); //받은 메시지를 출력함. // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 string[] tokens = text.Split(':'); if (tokens[0].Equals("id")) { clientNum++; id = tokens[1]; AppendText(txtHistory, string.Format("[접속]ID : {0}님이 접속하였습니다", id)); // 연결된 클라이언트 리스트에 추가해준다. connectedClients.Add(id, obj.WorkingSocket); } else { id = tokens[0]; msg = tokens[1]; received_x = tokens[2]; //x좌표를 받는다 received_y = tokens[3]; //y좌표를 받는다 AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); Console.WriteLine(tokens[0]); 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 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // 전체 클라이언트에게 데이터를 보낸다. sendAll(obj.WorkingSocket, obj.Buffer); // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }