1

ブロックソケットを使用してソケットアプリケーションをコーディングし、マルチスレッドを使用します..私の問題は、2つの大きなパケットを受信したいことです..tcpは大きなデータを複数のパケットに分割する必要があることがわかっているため..このシナリオ:

  1. 6 MB のテキスト ファイルと TCP 分割パケットを 2 つの個別のパケットに送信します
  2. 同時に、26 MBのビデオファイルを送信し、TCPもパケットを2つの別々のパケットに分割します
  3. 私のアプリケーションでは、テキストファイルの最初の部分を受け取り、6 MB のうち 3 MB と言います。
  4. そして、私はビデオの最初の部分を受け取り、26 mb の 13 mb としましょう..

問題は、テキスト ファイルの最初のパケットとビデオ ファイルの最初のパケットが異なるデータであり、異なる方法で処理する必要があることをどのように知るかです..(異なるバッファでしょうか??)

私の悪い英語でごめんなさい..

前もって感謝します..

これは私のコードの一部です

ns = client.GetStream();

        while (isListen == true && client.Connected)
        {
                while (!ns.DataAvailable)
                {
                    try
                    {
                        Thread.Sleep(1);
                    }
                    catch (Exception ex)
                    {
                    }
                }


                data = new byte[client.ReceiveBufferSize];
                //client.Client.Receive(data);

                int indx = ns.Read(data, 0, data.Length);

                string message = Encoding.ASCII.GetString(data, 0, indx);

                if (message == GetEnumDescription(TypeData.Disconnect))
                {
                    isListen = false;
                    server.ClientKeluar = objClient;
                    if (ClientDisconnected != null)
                    {
                        ClientDisconnected(objClient);
                    }
                    thisThread.Abort();
                    Server.kumpulanThread.Remove(thisThread);
                    Server._serverConnections.Remove(this);
                    client.Close();
                }
                else if (message.Contains(GetEnumDescription(TypeData.GetFile)))
                {
                    //jalankan proses pengambilan data
                }
                else if (message.Contains(GetEnumDescription(TypeData.ByteLength)))
                {
                    string length = message.Substring(6, message.Length - 6);
                    int len = int.Parse(length);
                    expectedLength = client.ReceiveBufferSize = len;
                    data = new byte[len];
                }
                else if (message.Contains(GetEnumDescription(TypeData.Image)))
                {
                    typeData = "Image";
                    dat1 = new byte[client.ReceiveBufferSize];
                    index = 0;

                }
                else if (message.Contains(GetEnumDescription(TypeData.Video)))
                {
                    typeData = "Video";
                    dat2 = new byte[client.ReceiveBufferSize];
                    index = 0;
                }
                else
                {
                    if (typeData == "Image")
                    {
                        expectedLength = expectedLength - message.Length;
                        if (expectedLength == 0)
                        {
                            Array.Copy(data, 0, dat1, index, message.Length);
                            if (ImageDelivered != null)
                            {
                                ImageDelivered(dat1);
                            }
                        }
                        else
                        {
                            Array.Copy(data, 0, dat1, index, message.Length);
                            index = message.Length;
                        }
                    }
                    else if (typeData == "Video")
                    {
                        expectedLength = expectedLength - message.Length;
                        if (expectedLength == 0)
                        {
                            Array.Copy(data, 0, dat2, index, message.Length);
                            if (VideoDelivered != null)
                            {
                                VideoDelivered(dat2);
                            }
                        }
                        else
                        {
                            Array.Copy(data, 0, dat2, index, message.Length);
                            index = message.Length;
                        }
                    }
                    else
                    {
                        expectedLength = expectedLength - message.Length;
                        if (expectedLength == 0)
                        {
                            dataToWrite = dataToWrite + message;
                            string text = dataToWrite;
                            if (MessageDelivered != null)
                            {
                                MessageDelivered(text);
                            }
                            dataToWrite = "";
                        }
                        else
                        {
                            dataToWrite += message;
                        }
                    }
                }
        }

この問題を解決するためのインスピレーションを得ることができるように、誰かサンプルコードを提供してもらえますか?

4

1 に答える 1

2

TCP プロトコルは、ファイルのセグメントを作成し、後でそれらを結合します。受信で完全なデータを取得します。

于 2012-04-21T03:05:48.157 に答える