C#网络编程,传输数据的3种方式

原创 2016年05月26日 09:08:59


在使用socket绑定networkstream进行网络传输时,传输的形式都是以字节数组(byte[])进行的。意味着进行读取时都是以字节数组的形式进行。

所以当进行网络通信传输数据时,我们可以使用一下3种方式。

1.定义所有的信息为同一个类型数据,这样在进行类型转换时最方便。

但是缺点为:由于将所有的类型聚集在一起进行传输,接受时需要进行信息的切割,以获得所需信息。无法描述复杂的组合数据类型。

例如string类型代码:

        public void Send_Date(string str)                                 //发送数据
        {
            TcpClient Ts = Ret_Client();
            NetworkStream nws = Ts.GetStream();
            byte[] byts = TypeChange.StringtoBytes(str);
            nws.Write(byts, 0, byts.Length);
        }
        public string Get_Data()                                //获取单独的数据项
        {
            string str = null;
            int index = 0;
            while(!IM)
            {
                Receive_Date(imageLength);
                return null;
            }
            if (Buffer.Length != 0)
            {
                string Bf = Buffer.ToString();
                index = Bf.IndexOf('#');                        //默认设置#为不同数据之间的分隔符
                if (index == -1)                                //如果Buffer中存在分隔符,则将第一部分加入str,第二部分存入Buffer
                {
                    str += Bf;
                    Buffer.Clear();
                }
                else
                {
                    str += Bf.Substring(0, index);
                    string BB = Bf.Substring(index + 1, Bf.Length-index-1);
                    Buffer.Clear();
                    Buffer.Append(BB);
                    if (str.Equals("!"))
                    {
                        imageLength = Convert.ToInt32(Get_Data());
                        IM = false;
                        
                    }
                }
                return str;
            }
            else
            {
                Thread.Sleep(1000);       
                Receive_Date();
                return Get_Data();
            }
        }
        private void Receive_Date()                     //获取客户端传入的数据
        {
            TcpClient Ts = Ret_Client();
            NetworkStream nws = Ts.GetStream();
            while (nws.DataAvailable)
            {
                CleanByteArray(Data_byte, Data_Length);
                nws.Read(Data_byte, 0, Data_Length);
                this.Buffer.Append(TypeChange.BytesToString(Data_byte, Data_Length));
            }
        }
        private void Receive_Date(int i)                     //获取客户端传入的数据
        {
            TcpClient Ts = Ret_Client();
            NetworkStream nws = Ts.GetStream();
            ImageByte = new byte[i];
            int index = 0;
            if (Buffer.Length != 0)
            {
                string str = Buffer.ToString();
                Buffer.Clear();
                byte[] by = TypeChange.StringtoBytes(str);
               
                foreach (byte n in by)
                {
                    ImageByte[index] = n;
                    index++;
                }
            }
            int offset = index;
            while (offset<ImageByte.Length)
            {
                if (ImageByte.Length -offset >Data_Length)
                {
                    nws.Read(ImageByte, offset, Data_Length);
                }
                else
                {
                    nws.Read(ImageByte, offset,ImageByte.Length - offset);
                }
                IM = true;
                offset +=Data_Length;
                Send_Date("收到");
            }
           
        }
        private void CleanByteArray(byte[] Data_byte, int Length)
        {
            for (int index = 0; index < Length; index++)
            {
                Data_byte[index] = 0;
            }
        }

2.定义一个类或结构体类型,将所有简单类型包含于复合类型中。这样可以描述复杂的数据类型。

但是缺点为:当定义一个结构体或类类型后,但是我们只有在特殊情况下需要传输所有的结构体或类中的信息。一般情况下只需传输几个简单的信息。这样在传输过程中产生了浪费,对转换的过程中也有不利的影响。

例如类类型代码:

        public void Send_Date(object obj)
        {
            TcpClient Ts = Ret_Client();                    //获取TCP连接
            NetworkStream nws = Ts.GetStream();             //获取网络流
            System.IO.MemoryStream memStream = TypeChange.SerializeBinary(obj);
            byte[] byt = new byte[memStream.Length];
            memStream.Read(byt, 0, byt.Length);
            nws.Write(byt, 0, byt.Length);
        }
        public object Receive_Date()
        {
            TcpClient Ts = Ret_Client();
            NetworkStream nws = Ts.GetStream();
            while (nws.DataAvailable)
            {
                byte[] byt = new byte[nws.Length];              //读取数据
                nws.Read(byt, 0, byt.Length);
                memStream.Write(byt, 0, byt.Length);
            }
            return TypeChange.DeSerializeBinary(memStream);
        }

3.定义一个Dictionary<Tkey,Tvalue>类型,这样就解决了上面两种方式存在的缺点。由于每一个Tkey对应一个不同类型的Tvalue,这样在不同的情况下可以产生不同的数据信息进行传输。

例如Dictionary<int,object>类型代码:

 public void Send_Date(object obj)
        {
            TcpClient Ts = Ret_Client();                    //获取TCP连接
            NetworkStream nws = Ts.GetStream();             //获取网络流
            System.IO.MemoryStream memStream = TypeChange.SerializeBinary(obj);
            byte[] byt = new byte[memStream.Length];
            memStream.Read(byt, 0, byt.Length);
            nws.Write(byt, 0, byt.Length);
        }
        public object Receive_Date()
        {
            TcpClient Ts = Ret_Client();
            NetworkStream nws = Ts.GetStream();
            while (nws.DataAvailable)
            {
                byte[] byt = new byte[nws.Length];              //读取数据
                nws.Read(byt, 0, byt.Length);
                memStream.Write(byt, 0, byt.Length);
            }
            return TypeChange.DeSerializeBinary(memStream);
        }

第二种和第三种方式的底层代码相同,但是传入的实参类型不同。

另外一种流行的传输方式JSON。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alexander_Frank/article/details/51504053

C#.NET网络程序开发的基本类(一)(C#---网络编程)

C#.NET网络程序开发的基本类 C#.NET的System.NET命名空间为Internet网络上使用的多种协议提供了便利的编程接口。 IPAddress 类  IPAddress 类提供的是主机...
  • liyuqian199695
  • liyuqian199695
  • 2016-12-14 09:59:09
  • 736

csharp网络编程示例

  • 2012年07月17日 13:38
  • 180KB
  • 下载

C#网络编程

C#网络通信 1.网络通信的方式 1)同步方式 同步方式是指当发送方发送一个数据包以后,一直等到接收方响应后,才可以发送下一个数据包。(串行运行) 2)异步方式 异步方式是指发送方发送数据包以后,不等...
  • yuzhongchun
  • yuzhongchun
  • 2013-09-24 20:38:36
  • 16311

C#网络编程TCP通信实例程序简单设计

C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服...
  • CoderJYF
  • CoderJYF
  • 2017-04-20 10:08:37
  • 4559

C#网络编程系列文章(一)之Socket实现异步TCP服务器

原创性声明 开篇 本人因为对于网络编程的喜爱,经常性的使用c#编写各类服务器(e.g TCP服务器,UDP服务器),但是基本上都是搞着玩,网上也有很多讲c#网络编程的文章,当然我也参考了很多作者写...
  • zhujunxxxxx
  • zhujunxxxxx
  • 2015-03-14 13:43:15
  • 19891

C#网络编程之多线程socket实例

服务器端:using System; using System.Collections.Generic; using System.Linq; using System.Text; u...
  • chongshangyunxiao321
  • chongshangyunxiao321
  • 2016-03-27 21:55:32
  • 2893

C# 网络编程(有关于C#网络编程的书籍)

  • 2009年12月21日 08:51
  • 2.15MB
  • 下载

C# WinForm基础三 socket网络编程

一、Socket网络编程 概念:Socket ocket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄...
  • tufeiax
  • tufeiax
  • 2015-05-09 01:22:03
  • 1198

WebRequest类和WebResponse类的使用方法(C#---网络编程)

WebRequest类和WebResponse类的使用方法 1、WebRequest类 WebRequest类是.NET.Framework的请求/响应模型的抽象基类,用于访问Internet数据 ...
  • liyuqian199695
  • liyuqian199695
  • 2016-12-14 21:06:22
  • 349

C#网络编程初步之TCP

http://www.cnblogs.com/chengulv/archive/2013/01/21/2870406.html  阅读背景:本文针对有C#的初学者而写的,主要讲解如何利用C#...
  • ly0303521
  • ly0303521
  • 2016-08-29 18:44:55
  • 583
收藏助手
不良信息举报
您举报文章:C#网络编程,传输数据的3种方式
举报原因:
原因补充:

(最多只允许输入30个字)