public void OnSendData(bool isSendall, Socket clientSocket, int msgCount, int itemCount, string target, string type, string state, string info)// 전체인가?/보낸사람/보낼내용 { AsyncObject ao = new AsyncObject(); // 문자열을 바이트 배열으로 변환 //string message = ao.buffer = Encoding.UTF8.GetBytes('\x01' + msgCount.ToString() + '|' + itemCount.ToString() + '|' + target + '|' + type + '|' + state + '|' + info + '|' + '\x01'); ao.workingSocket = clientSocket; for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i].clientSocket; if (isSendall) { try { socket.BeginSend(ao.buffer, 0, ao.buffer.Length, 0, new AsyncCallback(SendCallback), socket); } catch // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } else { if (socket == ao.workingSocket) { try { socket.BeginSend(ao.buffer, 0, ao.buffer.Length, 0, new AsyncCallback(SendCallback), socket); } catch // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } } } //AppendText(server_log_richtextbox, string.Format("연결된 클라이언트 갯수 : {0}", connectedClients.Count)); }
void AcceptCallback(IAsyncResult ar) { // 클라이언트의 연결 요청을 수락한다. Socket client = mainSock.EndAccept(ar); // 또 다른 클라이언트의 연결을 대기한다. mainSock.BeginAccept(AcceptCallback, null); AsyncObject obj = new AsyncObject(4096); obj.WorkingSocket = client; // 연결된 클라이언트 리스트에 추가해준다. connectedClients.Add(client); // 텍스트박스에 클라이언트가 연결되었다고 써준다. AppendText(server_log_richtextbox, string.Format("클라이언트 (@ {0})가 연결되었습니다.", client.RemoteEndPoint)); // 클라이언트의 데이터를 받는다. client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
private void AcceptCallback(IAsyncResult ar) { // 클라이언트의 연결 요청을 수락한다. Socket client = mainSock.EndAccept(ar); // 또 다른 클라이언트의 연결을 대기한다. mainSock.BeginAccept(AcceptCallback, null); AsyncObject obj = new AsyncObject(); obj.workingSocket = client; // 연결된 클라이언트 리스트에 추가해준다. clientSocketList.setClient(client, "root"); // 텍스트박스에 클라이언트가 연결되었다고 써준다. AppendText(server_log_richtextbox, string.Format("클라이언트 (@ {0})가 연결되었습니다.", client.RemoteEndPoint)); // 클라이언트의 데이터를 받는다. client.BeginReceive(obj.buffer, 0, 2048, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; int received; try { // 데이터 수신을 끝낸다. received = obj.WorkingSocket.EndReceive(ar); } catch { obj.WorkingSocket.Close(); return; } // 받은 데이터가 없으면(연결끊어짐) 끝낸다. 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(server_log_richtextbox, string.Format("[받음]{0}: {1}", ip, msg)); string[] words = msg.Split(';'); switch (words[0]) { case "login": OnSendData("success;", null); break; } // 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); } } } AppendText(server_log_richtextbox, string.Format("현재 클라이언트 수 : {0}", connectedClients.Count)); // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
private void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; Socket client = obj.workingSocket; int received; try { // 데이터 수신을 끝낸다. received = client.EndReceive(ar); //Console.WriteLine("receive : ", received); } catch { client.Close(); return; } // 받을 데이터가 있다. if (received > 0) { obj.sb.Append(Encoding.UTF8.GetString(obj.buffer, 0, received)); obj.ClearBuffer(); //버퍼 비우기 if (client.Available == 0) //네트워크상에 받을 데이터가 없다. { //Console.WriteLine("수신 종료"); string msg = obj.sb.ToString(); //전체 내용 obj.sb.Clear(); //이어가던 내용 초기화(메시지 끝이므로) Console.WriteLine(msg); //총 받은 메시지 string[] tokens = msg.Split('\x01'); for (int msgNum = 0; msgNum < tokens.Length; msgNum++) { if (!tokens[msgNum].Equals("") && tokens[msgNum][0] != '\0') { sendMsgcount++; string[] msgs = tokens[msgNum].Split('\x02'); string ip = msgs[0]; string clientData = msgs[1]; AppendText(server_log_richtextbox, string.Format("수신 내용 {0} : {1}", ip, clientData)); //bool sendAll = cmdHandler.IdentifySendAll(clientData);//전체 송신인지 판별 Thread t1 = new Thread(() => run(obj.workingSocket, clientData, sendMsgcount)); t1.Start(); //AppendText(server_log_richtextbox, string.Format("연결된 클라이언트 갯수 : {0}", connectedClients.Count)); } } } } // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { AppendText(server_log_richtextbox, string.Format("연결 종료")); obj.workingSocket.Close(); return; } client.BeginReceive(obj.buffer, 0, 2048, 0, DataReceived, obj); }