private void send_command(Command_Server command_code, object data) { if (Unit_No == -1) { return; } AsyncObject ao = new AsyncObject(1); command_data_server CD = new command_data_server(Unit_No, command_code, data); // 문자열을 바이트 배열으로 변환 //ao.Buffer = GZipCompress.Compress(Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(CD))); ao.Buffer = Data_structure.Combine(Encoding.Unicode.GetBytes("^^^"), GZipCompress.Compress(Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(CD)))); ao.WorkingSocket = m_ClientSocket; // 전송 시작! try { m_ClientSocket.BeginSend(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnSendHandler, ao); } catch (Exception ex) { Console.WriteLine("SENDING ERROR: {0}", ex.Message); // 서버와 연결이 끊기면 여기서 문제가 생긴다. Make_Client_Event(Unit_Event_Type.Server_Connection_Broken, 0); Connected = false; } }
private void send_command(Command_Server command_code, object data) { if (Unit_No == -1) { return; } AsyncObject ao = new AsyncObject(1); command_data_server CD = new command_data_server(Unit_No, command_code, data); try { // 문자열을 바이트 배열으로 변환 //ao.Buffer = GZipCompress.Compress(Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(CD))); ao.Buffer = Data_structure.Combine(Encoding.Unicode.GetBytes("^^^"), GZipCompress.Compress(Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(CD)))); ao.WorkingSocket = m_ClientSocket; } catch (Exception ex) { Console.WriteLine("전송 준비중 오류!\n메세지: {0}", ex.Message); return; } try { // 전송 시작! m_ClientSocket.BeginSend(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnSendHandler, ao); } catch (Exception ex) { Console.WriteLine("전송 중 오류 발생!\n메세지: {0}", ex.Message); Flag_Restart = true; } }
private static void Thread_Responser_() { command_data_server CMD; while (Connected) { while (Responser_Q.Count > 0) { lock (Responser_Q) { CMD = (command_data_server)Responser_Q.Dequeue(); } try { AsyncObject ao = new AsyncObject(1); // 문자열을 바이트 배열으로 변환 //ao.Buffer = GZipCompress.Compress(Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(CMD))); ao.Buffer = Data_structure.Combine(Encoding.Unicode.GetBytes("^^^"), GZipCompress.Compress(Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(CMD)))); ao.WorkingSocket = m_ClientSocket; ao.WorkingSocket.BeginSend(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnSendHandler, ao); } catch (Exception ex) { Console.Write("Error Send Message [ Command : {0}, data : {1}, receiver]", CMD.Command_code.ToString(), CMD.data != null ? CMD.data.ToString() : "", CMD.Sender.ToString()); Console.Write("Error String: {0}", ex); } } Thread.Sleep(100); } }
private void handleDataReceive(IAsyncResult ar) { // 넘겨진 추가 정보를 가져옵니다. // AsyncState 속성의 자료형은 Object 형식이기 때문에 형 변환이 필요합니다~! AsyncObject ao = (AsyncObject)ar.AsyncState; // 받은 바이트 수 저장할 변수 선언 Int32 recvBytes; try { // 자료를 수신하고, 수신받은 바이트를 가져옵니다. recvBytes = ao.WorkingSocket.EndReceive(ar); } catch { // 예외가 발생하면 함수 종료! return; } // 수신받은 자료의 크기가 1 이상일 때에만 자료 처리 if (recvBytes > 0) { // 공백 문자들이 많이 발생할 수 있으므로, 받은 바이트 수 만큼 배열을 선언하고 복사한다. Byte[] msgByte = new Byte[recvBytes]; Array.Copy(ao.Buffer, msgByte, recvBytes); //string msg = Encoding.Unicode.GetString(msgByte); //string msg = Encoding.Unicode.GetString(GZipCompress.Decompress(msgByte)); // 받은 메세지를 출력 ///// byte[][] ss = Data_structure.Separate(msgByte, Encoding.Unicode.GetBytes("^^^")); for (int i = 0; i < ss.Length; i++) { if (ss[i].Length < 5) continue; Received_Command(Encoding.Unicode.GetString(GZipCompress.Decompress(ss[i]))); } //// //Received_Command(msg); } try { // 자료 처리가 끝났으면~ // 이제 다시 데이터를 수신받기 위해서 수신 대기를 해야 합니다. // Begin~~ 메서드를 이용해 비동기적으로 작업을 대기했다면 // 반드시 대리자 함수에서 End~~ 메서드를 이용해 비동기 작업이 끝났다고 알려줘야 합니다! ao.WorkingSocket.BeginReceive(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnReceiveHandler, ao); } catch (Exception ex) { // 예외가 발생하면 예외 정보 출력 후 함수를 종료한다. Console.WriteLine("자료 수신 대기 도중 오류 발생! 메세지: {0}", ex.Message); return; } }