none
c# 이미지 송수신중 갑작스런 정지 문제 RRS feed

  • 질문

  • c#으로 간단한 원격제어 프로그램을 만들고 있는데요,,, 서버에서 클라이언트 이미지 송수신간에 오류가 생겨서 질문드립니다.

    생기는 오류는 * 이미지 전송이 되다가 한 2, 3분 후 갑작스럽게 정지  * 입니다. 제 개인적인 생각으로는 어딘가에서 메모리가

    부족하여 더 이상 이미지 전송을 하지 못하고 멈추는 것 같은데요.. 찾아봐도 제 눈에는 보이지가 않아서 질문올립니다.

    밑에는 서버와 클라이언트의 주요 코드이고요. 참고로 로컬에서 서버와 클라이언트 돌리면 문제없이 잘 동작합니다...

                        

    /* 클라이언트로부터 이미지 전송 받아 화면에 출력 */
            private void StartMonitoring()
            {
                while (true)
                {
                        // 이미지 크기 수신
                        NetworkStream stream = MonitoringDataSock.GetStream();
                        byte[] lbuf = new byte[4];
                        stream.Read(lbuf, 0, lbuf.Length);
                        int len = BitConverter.ToInt32(lbuf, 0); //수신한 버퍼의 내용을 정수로 변환

                        // 데이터 송수신 동기화 과정
                        // 서버(클라이언트)에게 이미지크기 수신확인 메시지 전송
                        byte[] ctlbuf = null;
                        ctlbuf = Encoding.Unicode.GetBytes("1 from Server ");
                        stream.Write(ctlbuf, 0, ctlbuf.Length);

                        // 이미지 수신
                        byte[] buffer = new byte[len]; //이미지 길이만큼의 버퍼 생성
                        stream.Read(buffer, 0, buffer.Length);

                        // 이미지 압축해제
                        byte[] decompressedByte = Decompress(buffer);

                        // 이미지 화면에 출력
                        MemoryStream ms = new MemoryStream();
                        ms.Write(decompressedByte, 0, (int)decompressedByte.Length);
                        Bitmap ScreenImage = new Bitmap(ms);
                        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                        pictureBox1.Image = ScreenImage as Image;

                  }
            }

                                                     

            /* 서버에게 현재화면 이미지 전송 */

            try
            {
                    while (!isStop)
                    {
                        NetworkStream stream = null;

                        //화면 해상도를 구함 
                        int w = Screen.PrimaryScreen.Bounds.Width;
                        int h = Screen.PrimaryScreen.Bounds.Height;

                        //size 객체 생성
                        Size s = new Size(w, h);

                        //Bitmap 객체 생성 
                        Bitmap ScreenImage = new Bitmap(w, h);

                        //Graphics 객체 생성 
                        Graphics graphics = Graphics.FromImage(ScreenImage);

                        //Graphics 객체의 CopyFromScreen()메서드로 bitmap 객체에 Screen을 캡처하여 저장 
                        graphics.CopyFromScreen(0, 0, 0, 0, s);

                        // 이미지 크기 조절
                        int width = ScreenImage.Width / 2;
                        int height = ScreenImage.Height / 2;
                        Size resize = new Size(width, height);
                        Bitmap resizeImage = new Bitmap(ScreenImage, resize);

                        // Bitmap To byte[]
                        MemoryStream ms = new MemoryStream();
                        resizeImage.Save(ms, ImageFormat.Jpeg);
                        ms.Position = 0;
                        byte[] data = ms.ToArray();



                        // 서버에게 이미지 크기 전송
                        stream = MonitoringDataSock.GetStream();
                        byte[] lbuf = BitConverter.GetBytes(data.Length);//버퍼의 크기를 바이트 배열로 변환
                        stream.Write(lbuf, 0, lbuf.Length);//버퍼 길이 전송

                        // 데이터 송수신 동기화 과정
                        // 클라이언트(서버)로부터 이미지크기 수신확인 메시지 수신
                        byte[] ctlbuf = new byte[128];
                        stream.Read(ctlbuf, 0, ctlbuf.Length);
                        Thread.Sleep(50);

                        // 서버에게 이미지 전송하기전 압축
                        byte[] compressedByte = Compress(data);

                        // 서버에게 이미지 전송
                        stream = MonitoringDataSock.GetStream();
                        stream.Write(compressedByte, 0, compressedByte.Length);
                        stream.Flush();
                    }
            }

    2017년 5월 25일 목요일 오후 5:53

모든 응답

  • 네트워크를 통해서 stream을 받는 부분과 이미지 화면에 출력하는 부분을 while 문안에서 sync 처리하고 계신데, 이 부분을 다른 thread에서 async 처리하도록 디자인을 변경하는 것이 어떨까 합니다.
    • 편집됨 Sehyoon Kang 2017년 11월 6일 월요일 오전 1:44
    2017년 11월 6일 월요일 오전 1:44