.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计1[使用IE浏览本页]

原创 2012年03月28日 10:02:55

本案例使用.Net Socket的Tcp、Udp实现字串、文件、各种序列化对象的网络传输,同时封装了Tcp的粘包、半包处理细节,定义了网络封包格式,在发送端和接收端无需考虑内部传输细节。以下是类设计:

序列化相关类类图:

image

序列化相关类代码:

示范代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TcpLabCommon
{
    /// <summary>
    /// 序列化工具
    /// </summary>
    public interface ISerializeHelper
    {
        /// <summary>
        /// 序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="stream"></param>
        /// <param name="item"></param>
        void Serialize<T>(System.IO.Stream stream, T item);

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="stream"></param>
        /// <returns></returns>
        T DeSerialize<T>(System.IO.Stream stream);


    }
}
示范代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.Xml;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization.Json;

namespace TcpLabCommon
{
    /// <summary>
    /// Xml序列化
    /// </summary>
    public class XmlSerializeHelper:ISerializeHelper
    {

        public void Serialize<T>(System.IO.Stream stream, T item)
        {
            XmlSerializer serializer = new XmlSerializer(item.GetType());
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            serializer.Serialize(stream, item); 
        }

        public T DeSerialize<T>(System.IO.Stream stream)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            return (T)serializer.Deserialize(stream);
        }
    }

    /// <summary>
    /// 二进制序列化
    /// </summary>
    public class BinarySerializeHelper : ISerializeHelper
    {

        public void Serialize<T>(System.IO.Stream stream, T item)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            formatter.Serialize(stream, item);
        }

        public T DeSerialize<T>(System.IO.Stream stream)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }

    /// <summary>
    /// Soap序列化
    /// </summary>
    public class SoapSerializeHelper : ISerializeHelper
    {

        public void Serialize<T>(System.IO.Stream stream, T item)
        {
            SoapFormatter formatter = new SoapFormatter();
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            formatter.Serialize(stream, item);
        }

        public T DeSerialize<T>(System.IO.Stream stream)
        {
            SoapFormatter formatter = new SoapFormatter();
            return (T)formatter.Deserialize(stream);
        }
    }

    /// <summary>
    /// Json序列化
    /// </summary>
    public class JsonSerializeHelper : ISerializeHelper
    {

        public void Serialize<T>(System.IO.Stream stream, T item)
        {
            DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            formatter.WriteObject(stream, item);
        }

        public T DeSerialize<T>(System.IO.Stream stream)
        {
            DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
            stream.Seek(0, System.IO.SeekOrigin.Begin);
            return (T)formatter.ReadObject(stream);
        }
    }
}

 

网络封包相关类类图:

image

网络封包相关类代码:

示范代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TcpLabCommon
{
    /// <summary>
    /// 包类型
    /// </summary>
    public enum PacketType
    {
        /// <summary>
        /// 简单字符串传输
        /// </summary>
        STRING=0,
        /// <summary>
        /// 二进制[文件传输]
        /// </summary>
        BINARY=1,
        /// <summary>
        /// 复杂对象传输[使用序列化和反序列化]
        /// </summary>
        COMPLEX=2
    }


    /// <summary>
    /// 包头
    /// </summary>
    public class NetPacketHead
    {
        /// <summary>
        /// 包头大小
        /// </summary>
        public const Int32 HEAD_SIZE = 4 * 3;

        private Int32 _version = 1;

        /// <summary>
        /// 版本
        /// </summary>
        public Int32 Version
        {
            get { return _version; }
            set { _version = value; }
        }

        private PacketType _pType = PacketType.STRING;
        /// <summary>
        /// 包类型[决定如何解包]
        /// </summary>
        public PacketType PType
        {
            get { return _pType; }
            set { _pType = value; }
        }

        private Int32 _len = 0;
        /// <summary>
        /// 包体长度[决定后面data数据的长度]
        /// </summary>
        public Int32 Len
        {
            get { return _len; }
            set { _len = value; }
        }

        
    }

    /// <summary>
    /// 网络数据包【Udp建议大小不超过548个字节,Internet标准MTU为576,减去IP数据报头(20字节)和UDP数据包头(8字节)】
    /// </summary>
    public class NetPacket
    {

        NetPacketHead _packetHead;
        /// <summary>
        /// 包头
        /// </summary>
        public NetPacketHead PacketHead
        {
            get { return _packetHead; }
            set { _packetHead = value; }
        }

        private object _data=null;
        /// <summary>
        /// 包体,根据封包类型决定包体数据类型
        /// STRING:包体为String
        /// BINARY:包体为Byte[]
        /// COMPLEX:包体为可序列化的对象
        /// </summary>
        public object Data
        {
            get { return _data; }
            set { _data = value; }
        }
    }

    /// <summary>
    /// 传输的文件
    /// </summary>
    public class NetFile
    {
        private string _fileName = string.Empty;

        public string FileName
        {
            get { return _fileName; }
            set { _fileName = value; }
        }
        private Byte[] _content;

        public Byte[] Content
        {
            get 
            {
                if (_content==null)
                    _content = new Byte[]{};
                return _content; 
            }
            set { _content = value; }
        }
    }
}

提供网络封包传输服务的核心类:

image

.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计2[使用IE浏览本页]

本案例使用.Net Socket的Tcp、Udp实现字串、文件、各种序列化对象的网络传输,同时封装了Tcp的粘包、半包处理细节,定义了网络封包格式,在发送端和接收端无需考虑内部传输细节。以下是类设计:...
  • jiangtongcn
  • jiangtongcn
  • 2012年03月28日 10:04
  • 1190

.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务1[使用IE浏览本页]

直接使用Socket做服务器端和客户端,采用Tcp协议: 客户端代码: 示范代码using System; using System.Collections.Generic; using Sy...
  • jiangtongcn
  • jiangtongcn
  • 2012年03月28日 10:11
  • 625

.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务4[聊天室][使用IE浏览本页]

本案例使用前面封装的网络服务类编写简易聊天室,采用Tcp和异步套接字相关技术: App.config文件: 示范代码xml version="1.0" encoding="utf-8" ?...
  • jiangtongcn
  • jiangtongcn
  • 2012年03月28日 10:15
  • 682

.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务2[使用IE浏览本页]

直接使用Socket做客户端,采用Udp 客户端代码: 示范代码using System; using System.Collections.Generic; using System.Lin...
  • jiangtongcn
  • jiangtongcn
  • 2012年03月28日 10:13
  • 523

.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室][使用IE浏览本页]

本案例使用前面封装的网络服务类编写简易聊天室,采用Tcp和多线程相关技术: App.config文件: 示范代码1.0" encoding="utf-8" ?> ...
  • jiangtongcn
  • jiangtongcn
  • 2012年03月28日 10:14
  • 615

Java Socket传输对象(序列化)

1.首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了...
  • SHEN525758203
  • SHEN525758203
  • 2014年08月08日 13:58
  • 2536

Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--前面6篇博文全部源代码下载地址

网络通信 Tcp/Udp 传输字串、文件、对象 Tcp粘包、半包 1.封装了Tcp/Udp传输字串、文件、对象的细节,处理了Tcp粘包、半包问题 2.测试代码涉及原始Socket、TcpListe...
  • jiangtongcn
  • jiangtongcn
  • 2012年03月28日 20:46
  • 545

c#socket实现对序列化对象的传输和接收

记得一年前做了一个简单的套接字通讯的小软件,但是存在一个不小的bug:发送消息和发送文件的时候采用的区分方法是在发送正文钱需要首先发送一个简短的字符(file表示将要文件,text表示将要发送文本消息...
  • tf576776047
  • tf576776047
  • 2012年11月07日 11:05
  • 9667

C++对象序列化

C++语言对文件的处理有一些限制,对于后来出现的一些语言,如Pascal 和Java都提供了对对象进行序列化的支持,而C++只能通过C FILE s结构 或 C++自己的fstream 类来保存程序中...
  • xiaoding133
  • xiaoding133
  • 2012年07月04日 13:04
  • 1247

Android使用Serializable实现序列化传输对象

最近在做一个基于Socket通信项目,在实现客户端与服务器进行对象传输时使用到了Serializable接口对传输对象进行序列化,下面将和大家分享一下我的开发实例,欢迎各位交流探讨,不足之处希望各位多...
  • u010198148
  • u010198148
  • 2015年04月26日 08:57
  • 1045
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计1[使用IE浏览本页]
举报原因:
原因补充:

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