1

我使用阻塞套接字编写套接字应用程序并使用多线程..我的问题是我想接收两个大数据包..我们知道 tcp 必须将大数据拆分成多个数据包..这个场景:

  1. 我将 6 mb 文本文件和 tcp 拆分数据包发送到 2 个单独的数据包中
  2. 同时我发送 26 mb 视频文件和 tcp 也将数据包分成 2 个单独的数据包
  3. 在我的应用程序中,我收到了文本文件的第一部分,比如说 3 mb of 6 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 回答