C# .cs文件的DLL文件生成,以及,利用socket进行自定义类对象的传输

时间:2021-10-16 22:17:46

利用udp协议进行类实体的传送,首先需要把传送的类 制作成DLL链接库,然后服务器端和客户端都要进行该DLL库的引用。在服务器端需要对自定义的类实体进行序列化,传送给客户端后,客户端需要对接收的类实体进行发序列化,恢复出原来的信息。以下是步骤:

1,建立被传送类的DLL文件

在VS2010上创建新项目,类库,然后把自定义类的代码写进该文档,这里定义了个人GPS跟踪的位置信息类,定义如下:

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace GPSPointInfo {   

       [Serializable]    //因为该类要被序列化传输,所以要在类前添加该标记

        public class TimeDataObjector  

       {       

           public string stuffid;         //个人的名字或者工号

           public long x;         //所在位置的经度

           public long y;         //所在位置的纬度

           public long Time;        //现在的时间

           public string Place;     //所在地方的名字

}

}

 

然后点击“生成”-》”生成解决方案“,然后去工程的debug文件夹下就可以找到该类的DLL库,

 

2,

编写客户端,这是需要引用书面的DLL库,点击“项目”-》“添加引用”,然后找到刚才的DLL库添加进来,再在客户端using  名字;名字是刚才类的空间域名,这里PointObjector。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net;

using System.Net.Sockets;

using System.Runtime.Serialization.Formatters.Binary;

using System.Runtime.Serialization.Formatters;

using System.Runtime.Serialization;

using System.Threading;

using System.IO;

using PointObjector;

namespace UDPClient {   

class Program     {

        public static void StartListener()         {           

                 Console.WriteLine("开始接收数据:");           

              Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);          

           IPEndPoint iep = new IPEndPoint(IPAddress.Any, 3222);          

               EndPoint ep = (EndPoint)iep;             s.Bind(iep);         

              s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.0.0.1")));             byte[] b = new byte[1024];          

           while (true)          

         {               

          int length = s.ReceiveFrom(b, ref ep);

                MemoryStream MStream = new MemoryStream();              

               MStream.Position = 0;               

                MStream.Write(b, 0, length);              

                MStream.Flush();              

               MStream.Position = 0;               

                BinaryFormatter BFormatter = new BinaryFormatter();              

               defineclass TDO = new defineclass();              

               TDO = BFormatter.Deserialize(MStream) as defineclass;

                Console.WriteLine("name:{0}" + "\r\n" + "age:{1}" + "\r\n" + "gender:{2}" + "\r\n" + "x:{3}" + "\r\n" + "y:{4}" + "\r\n", TDO.name, TDO.age, TDO.gender, TDO.x, TDO.y);           

}

 

        }

        static void Main(string[] args) 

       {           

   Thread thread = new Thread(new ThreadStart(StartListener));          

  thread.Start();       

}   

}

}

 

3,编写服务器端,和客户端一样也要调用刚才DLL库

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net;

using System.Net.Sockets;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

using System.Runtime.Serialization.Formatters;

using System.Runtime.Serialization;

using PointObjector;

namespace UDPServer {   

class Program     {

        public static Stream serializeStream(object param)      

      {           

         DataContractSerializer serializer = new DataContractSerializer(param.GetType());    

        MemoryStream stream = new MemoryStream();

            serializer.WriteObject(stream, param);

            return stream;      

  }

        public static void send()     

   {                 

while (true)         

   {              

          Console.WriteLine("请输入内容:" + "\r\n");             

           defineclass TempObjector = new defineclass();               

         TempObjector.name = Console.ReadLine();       

         TempObjector.age = Int32.Parse(Console.ReadLine());      

          TempObjector.gender = Console.ReadLine();

                TempObjector.x = Int32.Parse(Console.ReadLine());

                TempObjector.y = Int32.Parse(Console.ReadLine());

                Socket groupsocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.0.0.1"), 3222);

                EndPoint ep = (EndPoint)iep;

 

               MemoryStream mStream = new MemoryStream(); 

               BinaryFormatter bformatter = new BinaryFormatter();

                bformatter.Serialize(mStream, TempObjector); //序列化

                mStream.Flush();

                byte[] buffer = new byte[500];

                mStream.Position = 0;

                //mStream.Read(buffer, 0, buffer.Length); 

               int i = mStream.Read(buffer, 0, buffer.Length);  

              Console.WriteLine("i:{0}",i);

                groupsocket.SendTo(buffer, ep);

                groupsocket.Close();

            }

        } 

       static void Main(string[] args)

        { 

           send();

            return;

        }

    }

}

 C#