• socket中使用序列化传结构体


    使用UDP方式,效果如图

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Threading;
    using System.Net;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    namespace UdpTest
    {
    
        public partial class Form1 : Form
        {
    
            UdpClient udpSend;
            UdpClient udpRecv;
            bool IsUdpcRecvStart = false;
            Thread thrRecv;
    
            [Serializable]
            struct Student
            {
                public string Name;
                public int Age;
            };
            
            
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
    
                // 实名发送
                IPEndPoint localIpep = new IPEndPoint(
                    IPAddress.Parse("127.0.0.1"), 12345); // 本机IP,指定的端口号
                udpSend = new UdpClient(localIpep);
    
                IPEndPoint remoteIpep = new IPEndPoint(
                   IPAddress.Parse("127.0.0.1"), 11111); // 发送到的IP地址和端口号
    
    
                //序列化 stu
                Student stu;
                stu.Name = "xiaoming";
                stu.Age = 18;
    
                MemoryStream mStream = new MemoryStream();
                BinaryFormatter bformatter = new BinaryFormatter();  //二进制序列化类  
                bformatter.Serialize(mStream, stu); //将消息类转换为内存流  
                mStream.Flush();
                mStream.Position = 0;
                byte[] buffer = new byte[180];
                while (mStream.Read(buffer, 0, buffer.Length) > 0)
                {
                    udpSend.Send(buffer,buffer.Length,remoteIpep); //从内存中读取二进制流,并发送  
                }  
    //             byte[] sendbytes = Encoding.Unicode.GetBytes(txtSendMssg.Text.ToString());
    //             udpSend.Send(sendbytes, sendbytes.Length, remoteIpep);
    
                ShowMessage(txtSendMssg, "发送结构体:"+ stu.Name.ToString() + ":" + stu.Age);
                udpSend.Close();
    
    
            }
    
    
            private void btnRecv_Click(object sender, EventArgs e)
            {
                if (!IsUdpcRecvStart) // 未监听的情况,开始监听
                {
                    IPEndPoint localIpep = new IPEndPoint(
                        IPAddress.Parse("127.0.0.1"), 11111); // 本机IP和监听端口号
    
                    udpRecv = new UdpClient(localIpep);
    
                    thrRecv = new Thread(ReceiveMessage);
                    thrRecv.Start();
    
                    IsUdpcRecvStart = true;
                    ShowMessage(txtRecvMssg, "UDP监听器已成功启动");
                }
                else                  // 正在监听的情况,终止监听
                {
                    thrRecv.Abort(); // 必须先关闭这个线程,否则会异常
                    udpRecv.Close();
    
                    IsUdpcRecvStart = false;
                    ShowMessage(txtRecvMssg, "UDP监听器已成功关闭");
                }
            }
    
            private void ReceiveMessage(object obj)
            {
                byte[] buffer = new byte[200];
                MemoryStream mStream = new MemoryStream();
                mStream.Position = 0;  
    
                IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 0);
                while (true)
                {
                    try
                    {
    
                        byte[] bytRecv = udpRecv.Receive(ref remoteIpep);
    
                        mStream.Write(bytRecv, 0, bytRecv.Length); //将接收到的数据写入内存流 
    
                        string message = Encoding.Unicode.GetString(bytRecv, 0, bytRecv.Length);
                        //MessageBox.Show(message);
                        //ShowMessage(txtRecvMssg,string.Format("{0}[{1}]", remoteIpep, message));
                    }
                    catch (Exception ex)
                    {
                        ShowMessage(txtRecvMssg, ex.Message);
                        break;
                    }
    
                    mStream.Flush();
                    mStream.Position = 0;
                    BinaryFormatter bFormatter = new BinaryFormatter();
                    if (mStream.Capacity > 0)
                    {
                        Student msg = (Student)bFormatter.Deserialize(mStream);//将接收到的内存流反序列化为对象  
    
                        ShowMessage(txtRecvMssg, "收到结构体msg:"+msg.Name.ToString()+":"+msg.Age.ToString());
                    }  
                }
            }
    
    
    
            // 向TextBox中添加文本
            delegate void ShowMessageDelegate(TextBox txtbox, string message);
            private void ShowMessage(TextBox txtbox, string message)
            {
                if (txtbox.InvokeRequired)
                {
                    ShowMessageDelegate showMessageDelegate = ShowMessage;
                    txtbox.Invoke(showMessageDelegate, new object[] { txtbox, message });
                }
                else
                {
                    txtbox.Text += message + "
    ";
                }
            }
    
            private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
            {
                Environment.Exit(0);
    
                thrRecv.Abort();
                
            }
    
        }
    }
    

      

  • 相关阅读:
    洛谷P5245 【模板】多项式快速幂
    洛谷P5205 【模板】多项式开根(FFT)
    laravel 数据库连接Mysql
    laravel V层引入css 和js方法
    laravel V层
    小程序地区时间自定义选择器 picker
    点击a标签 跳到当前页面指定div
    图片上下居中
    小程序消除图片下边距的三个方法
    百度地图定位
  • 原文地址:https://www.cnblogs.com/totogo/p/4748079.html
Copyright © 2020-2023  润新知