首页 > 技术 > 编程 > C# > C#网络编程,传输数据的3种方式

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

2017-01-11 浏览()

在使用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。

相关推荐

感谢关注 Ithao123C#频道,ithao123.cn是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!

关键词:

文章点评:


精选专题

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。 Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。

随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责

Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1]。在设计Swift时.就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言 Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。