日期:2014-05-18  浏览次数:20979 次

高分求C#使用TCP发送或接收数据不全,数据重组
用TCP接收数据的时候,经常是发送一次,接收却需要两次,这样便要对接收的数据进行重组,但目前还没想到如何进行数据的重组,望高人指点,最好说的越详细越好!

------解决方案--------------------
我都是自己用Socket来接收数据,没有用过NetStream这种方式。至少我可以肯定,如果用Socket接收byte[]形式的数据,在网络通信正常的情况下,绝对不会出现你说的情况。

你说的情况我要测试一下NetStream的情况后再处理看是不是它有什么特殊的处理,不过我觉得你还是先检查一下自己的通信过程是否有一些比如多线程同步的问题没有处理好。
------解决方案--------------------
看到这个问题,为了回顾一下以前学过的这些知识,刚刚写了个最最简单的通信,我用了2种方法,一种是用socket,另一种是用TcpListener,而且我都只写了服务端,希望对你有所帮助
*******第一个用socket
C# code

       Socket server;
        Socket client;
        Thread s;
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        int prot = 6000;
        /// <summary>
        /// 开始监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //输入IP
            try
            {
                ip = IPAddress.Parse(textBox1.Text);
            }
            catch
            {
                textBox3.Text = "你输入的IP地址格式不正确,请重新输入!";
            }
            //输入端口
            try
            {
                int i = Int32.Parse(textBox2.Text);
                if (i >= 0 && i <= 65535)
                {
                    prot = i;
                }
                else
                {
                    textBox3.Text = "请输入0--65535之间的数字";
                }
            }
            catch
            {
                textBox3.Text = "请输入端口号!";
            }
            //开始监听
            try
            {
                s = new Thread(new ThreadStart(start));
                s.Start();
            }
            catch (Exception ee)
            {
                textBox3.Text = ee.Message;
            }
        }
        /// <summary>
        /// 监听请求
        /// </summary>
        void start()
        {
            //创建套接字
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定到本地
            IPEndPoint ipPoint = new IPEndPoint(ip, prot);
            server.Bind(ipPoint);
            //开始侦听
            server.Listen(5);
            //接受客户端请求
            client = server.Accept();
            textBox3.Text = "主机" + Dns.GetHostName() + "端口" + textBox2.Text + "开始监听........";
            if (client.Connected)
            {
                textBox3.Text = "与客户端建立了连接";
                while (true)
                {
                    //接受数据
                    byte[] data = new byte[1024];
                    int size = client.Receive(data);
                    string result = Encoding.Unicode.GetString(data, 0, size);
                    if (result == "[---===退出===---]")
                    {
                        textBox3.Text = "你失去了与客户端的联系";
                        server.Shutdown(SocketShutdown.Both);
                        server.Close();
                    }
                    //richTextBox1.AppendText(result);
                    else
                    {
                        string[] aa = result.Split('~');
                        richTextBox1.AppendText(aa[0] + "说:" + aa[1] + "\r");
                    }
                }
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                //发送数据
                //byte[] msg = Encoding.Unicode.GetBytes(richTextBox2.Text);
                byte[] msg = Encoding.Unicode.GetBytes(Dns.GetHostName() + "~" + richTextBox2.Text);
                client.Send(msg);
                //这里既可以将BYTE类型的数组从新解码再输出也可以直接输出richTextBox2中的文本
                string aa = Encoding.Unicode.GetString(msg);
                //richTextBox1.AppendText("本机&q