111,126
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 基础协议
/// </summary>
/// <param name="name">协议名称</param>
/// <param name="command">命令类型[枚举]</param>
/// <param name="protocol">网络协议类型[枚举]</param>
/// <param name="packageBody">消息包体</param>
/// <param name="isNeedReturn">是否需要回馈[枚举]</param>
/// <param name="isNeedEncrypt">是否加密[枚举]</param>
/// <param name="sessionCode">会话码</param>
/// <returns></returns>
public static byte[] GetProtocol(String name, int command, int protocol, byte[] packageBody, Return isNeedReturn, Encrypt isNeedEncrypt, String sessionCode)
{
byte[] p1 = Encoding.Default.GetBytes(name);
byte[] p2 = Encoding.Default.GetBytes(command.ToString());
byte[] p3 = Encoding.Default.GetBytes(protocol.ToString());
byte[] p4 = packageBody;
byte[] p5 = Encoding.Default.GetBytes(isNeedReturn.ToString());
byte[] p6 = Encoding.Default.GetBytes(isNeedEncrypt.ToString());
//这里我把decollator作为的一个分隔符
byte[] decollator = Encoding.Default.GetBytes("≮↔≯");
byte[] result = new byte[p1.Length + p2.Length + p3.Length + p4.Length + p5.Length + p6.Length];
Array.Copy(p1, 0, result, 0, p1.Length);
Array.Copy(decollator, 0, result, p1.Length, decollator.Length);
Array.Copy(p2, 0, result, p1.Length + decollator.Length, p2.Length);
Array.Copy(decollator, 0, result, p1.Length + p2.Length + decollator.Length, decollator.Length);
Array.Copy(p3, 0, result, p1.Length + p2.Length + decollator.Length * 2, p3.Length);
Array.Copy(decollator, 0, result, p1.Length + p2.Length + p3.Length + decollator.Length * 2, decollator.Length);
Array.Copy(p4, 0, result, p1.Length + p2.Length + p3.Length + decollator.Length * 3, p4.Length);
Array.Copy(decollator, 0, result, p1.Length + p2.Length + p3.Length + p4.Length + decollator.Length * 3, decollator.Length);
Array.Copy(p5, 0, result, p1.Length + p2.Length + p3.Length + p4.Length + decollator.Length * 4, p5.Length);
Array.Copy(decollator, 0, result, p1.Length + p2.Length + p3.Length + p4.Length + p5.Length + decollator.Length * 4, decollator.Length);
Array.Copy(p6, 0, result, p1.Length + p2.Length + p3.Length + p4.Length + p5.Length + decollator.Length * 5, p6.Length);
return result;
}
{"fr":"sp1234","to":"svr","type":"EmergencyCommandCenter.SetupAlarm",
"content":{"level":3, "pos_x":114.05, "pos_y":38.9}}这就是一个命令,哪用得着你那种千篇一律的所谓“通讯格式”?在一个json对象中,type字段的值就说明了content的内容进一步分序列化的类型。// 发送处理
public static byte[] GetProtocol(string name, int command, int protocol, byte[] packageBody, Return isNeedReturn, Encrypt isNeedEncrypt, String sessionCode)
{
// name 20 字节
// command 4字节
// protocol 4字节
// packageBody长度 4字节
// isNeedReturn 4字节
// isNeedEncrypt 4字节
// sessionCode 20字节
byte[] bytes = new byte[20 + 4 + 4 + 4 + 4 + 4 + 20 + packageBody.Length];
int index = 0;
Encoding.ASCII.GetBytes(name, 0, name.Length, bytes, index);
index += 20;
Array.Copy(BitConverter.GetBytes(command), 0, bytes, index, 4);
index += 4;
Array.Copy(BitConverter.GetBytes(protocol), 0, bytes, index, 4);
index += 4;
Array.Copy(BitConverter.GetBytes(packageBody.Length), 0, bytes, index, 4);
index += 4;
Array.Copy(BitConverter.GetBytes((int)isNeedReturn), 0, bytes, index, 4);
index += 4;
Array.Copy(BitConverter.GetBytes((int)isNeedEncrypt), 0, bytes, index, 4);
index += 4;
Encoding.ASCII.GetBytes(sessionCode, 0, name.Length, bytes, index);
index += 20;
Array.Copy(packageBody, 0, bytes, index, packageBody.Length);
return bytes;
}
// 接收处理
public static void Receive(byte[] bytes)
{
int index = 0;
string name = Encoding.ASCII.GetString(bytes, index, 20);
index += 20;
int command = BitConverter.ToInt32(bytes, index);
index += 4;
int protocol = BitConverter.ToInt32(bytes, index);
index += 4;
int pbength = BitConverter.ToInt32(bytes, index);
index += 4;
Return isNeedReturn = (Return)BitConverter.ToInt32(bytes, index);
index += 4;
Encrypt isNeedEncrypt = (Encrypt)BitConverter.ToInt32(bytes, index);
index += 4;
string sessionCode = Encoding.ASCII.GetString(bytes, index, 20);
index += 20;
byte[] packageBody = new byte[pbength];
Array.Copy(bytes, index, packageBody, 0, pbength);
// ......
}
static void Main(string[] args)
{
Dictionary<string, string> dics = new Dictionary<string, string>();
dics.Add("username", "007");
dics.Add("password", "@#$");
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000));
JavaScriptSerializer jss = new JavaScriptSerializer();
string s = jss.Serialize(dics);
socket.Send(Encoding.UTF8.GetBytes(s.ToString()));
socket.Close();
}
static void Main(string[] args)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000));
Console.WriteLine("服务器已经启动");
socket.Listen(10);
while (true)
{
Socket ClientSocket = socket.Accept();
byte[] b = new byte[1024 * 2];
int length = ClientSocket.Receive(b);
if (length > 0)
Console.WriteLine("收到来至{0}的请求", ClientSocket.RemoteEndPoint);
string content = Encoding.UTF8.GetString(b, 0, length);
JavaScriptSerializer jss = new JavaScriptSerializer();
Dictionary<string, string> dics = jss.Deserialize<Dictionary<string, string>>(content);
Console.WriteLine("用户名是{0};密码是{1}", dics["username"], dics["password"]);
Console.ReadKey();
}
}