如果是新手,建议先看下前面的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反序列化后获得的对象的数据
以上就是对发送内容的区分处理的办法,如果你有更好的方法,麻烦告诉我一下,在此谢谢了。