2012-01-11 5 views
1

私はTCPClientの初心者です。私は同じプログラムを実行する別のIPに〜4kbの小さな画像を送信するウェブカメラアプリを作ろうとしています。それで、それは同じ時間に送受信するつもりです。TCP Client Disconnects

問題1つの送信後に_tcpOutが切断されるのは、1つのフレームしか表示されないということです。下のコードでは、2つのセクションがあります。最初に、NewFrameReceivedがカメラからの新しい画像に実行され、送信されます。もう1つの方法は、受け取った画像を画像ボックスに入れます。 127.0.0.1):

private void fChat_Load(object sender, EventArgs e) 
{ 
    // fire up listener 
    listeningThread.RunWorkerAsync(); 

    // tcp server setup 
    _tcpOut = new TcpClient(); 
    _tcpOut.Connect("127.0.0.1", 54321); 
} 


    private void NewFrameReceived(object sender, NewFrameEventArgs e) 
    { 
     Bitmap img = (Bitmap)e.Frame.Clone(); 

     byte[] imgBytes = EncodeToJpeg(img, 25).ToArray(); 
     if (_tcpOut.Connected) <-- PROBLEM HERE, THIS IS FALSE ON 2ND ITERATION 
     { 
      using (NetworkStream ns = _tcpOut.GetStream()) 
      { 
       if (ns.CanWrite) 
       { 
        ns.Write(BitConverter.GetBytes(imgBytes.Length), 0, 4); 
        ns.Write(imgBytes, 0, imgBytes.Length); 
       } 
      } 
     } 
    } 


    private void listeningThread_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) 
    { 
     // start listening for connections 
     _tcpIn = new TcpListener(IPAddress.Any, 54321); 
     _tcpIn.Start(); 

     while (true) 
     { 
      using (TcpClient _inClient = _tcpIn.AcceptTcpClient()) // blocks until connected 
      { 
       using (NetworkStream stream = _inClient.GetStream()) 
       { 
        Byte[] imgSizeBytes = new Byte[4]; 
        stream.Read(imgSizeBytes, 0, 4); 
        int imgSize = BitConverter.ToInt32(imgSizeBytes, 0); 
        Byte[] imgBytes = new Byte[imgSize]; 
        stream.Read(imgBytes, 0, imgSize); 
        MemoryStream ms = new MemoryStream(imgBytes); 
        Image img = Image.FromStream(ms); 
        picVideo.Image = img; 
       } 
      } 
     } 
    } 

事前に感謝します。

答えて

1

usingステートメントでTcpClientを廃棄するため、接続が切断されます。

+0

お返事ありがとうございました。体系的な使い方をしてみましたが、すべて同じように使用しましたが、すべてを一度に取り出したときにコードを3回ほど回して停止しましたが、表示される画像は1だけでした。 – sprocket12

+0

固定されていますが、すべての使用法が削除されましたが、まだフレームが1つしかありませんでしたが、whileループの上で_inClientを移動しました。 – sprocket12