C#Socket客户端和服务器端对发送的内容的区分处理

如果是新手,建议先看下前面的C#Socket客户端和服务器端的编写再来看这,会更容易些。

https://blog.csdn.net/qq_31157943/article/details/93379827

在实际发送请求时经常需要的对发送的数据进行分别的处理,比如说客户端向服务器端发送一个登录请求,那么就需要把客户端输入的账号和密码发送给服务器端,这时服务器端就需要对这两个数据进行处理,那么如何从服务器端socket收到的byte数组中获取到账号和密码呢?(当然最麻烦的方法是你分别发送,但那样当请求多了以后,代码比较乱,不容易修改,通用性比较差,或者你也可以对byte数组存的东西进行指定,比如说索引0存请求编码,用于区分请求,索引1存账号,索引2存密码,但通用性太差,你在未来可能会遇到每个请求我都要这么指定一遍索引,数据多了后就是一种噩梦),那有没有方便快捷通用性强的方法呢?

个人推荐一种还算比较实用的方法就是:先把要发送的数据封装为一个客户端和服务端通用的类,然后新建这个类的对象,在通过关键的一步Xml序列化,把这个实例转为一个Xml字符串,然后直接发送这个字符串,服务器端收到后在进行Xml反序列化转为对应的实例,然后从实例中获取数据,直白的说就是发送对象------>接收对象 ------- > 对对象数据进行处理, 但是发送的内容因为是字符串所以数据量又比较小,不会太影响传输速度。

/*对账号和密码的对象xml序列化后得到的xml字符创*/

<?xml version="1.0" encoding="utf-16"?>
<UserInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <username>小明</username>
  <password>hkklp123123</password>
</UserInfo>

客户端和服务器端用到的共有工具类

XmlHandler(对指定类型的序列化和和反序列化的处理)

UserInfo(指定的用于记录用户账号的密码的类,这里只是个示例,可以根据自己的功能进行编写)

需要用到的命名空间

using System.IO;
using System.Xml.Serialization;

UserInfo.cs(客户端和服务器端都要有,负责对指定数据的封装,这里是账号和密码)

using System;
using System.Collections;
using System.Collections.Generic;


public class UserInfo
{
    public string username;

    public string password;
    
    public void SetUserInfo(string username,string password)
    {
        this.username = username;
        this.password = password;
    }

}

XmlHandler.cs(客户端和服务器端都要有,序列化和反序列化的处理在这里)

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

public class XmlHandler {

    /// <summary>
    /// 把指定对象转化weiXml字符串
    /// </summary>
    /// <param name="type"></param>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static string GetXmlContent<T> (T type) {
        string xmlString = "";
        using (StringWriter sw = new StringWriter ()) {
            XmlSerializer serializer = new XmlSerializer (typeof (T));
            serializer.Serialize (sw, type);
            sw.Close ();
            xmlString = sw.ToString ();
        }
        return xmlString;
    }

    /// <summary>
    /// 把xml字符串转化为指定的类型的对象
    /// </summary>
    /// <param name="xmlString"></param>
    /// <returns></returns>
    public static T GetDataByXml<T> (string xmlString) {
        T data;
        using (StringReader sr = new StringReader (xmlString)) {
            XmlSerializer serializer = new XmlSerializer (typeof (T));
            data = (T) serializer.Deserialize (sr);
            sr.Close ();
        }
        return data;
    }

}

以上方法的使用例子

1.xml序列化

UserInfo user = new UserInfo ();
user.SetUserInfo ("小明", "hkklp123123");
string xmlString = XmlHandler.GetXmlContent (user);
Console.WriteLine(xmlString);

2.xml反序列化

//反序列化获得指定类型的实例
UserInfo user_2 = XmlHandler.GetDataByXml<UserInfo>(xmlString);
Console.WriteLine(user_2.username + "," + user_2.password);

最后的结果

xml序列化后的字符串

xml反序列化后获得的对象的数据

以上就是对发送内容的区分处理的办法,如果你有更好的方法,麻烦告诉我一下,在此谢谢了。

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值