📄 message.cs
字号:
using System;
namespace SocketLibrary
{
public class Message
{
public enum CommandHeader:byte {
SendMessage = 1
}
public Connection SendToOrReceivedFrom;
public int MessageLength;
public CommandHeader Command;
public byte MainVersion;
public byte SecondVersion;
public string MessageBody;
public bool Sent;
public Message()
{
SendToOrReceivedFrom = null;
Sent = false;
}
public Message(CommandHeader command,byte mainVersion,byte secondVersion,string messageBody):this() {
this.Command = command;
this.MainVersion = mainVersion;
this.SecondVersion = secondVersion;
this.MessageBody = messageBody;
}
public byte[] ToBytes() {
this.MessageLength = 7 + SocketFactory.DefaultEncoding.GetByteCount(this.MessageBody);//计算消息总长度。消息头长度为7加上消息体的长度。
byte[] buffer = new byte[this.MessageLength];
//先将长度的4个字节写入到数组中。
BitConverter.GetBytes(this.MessageLength).CopyTo(buffer,0);
//将CommandHeader写入到数组中
buffer[4] = (byte)this.Command;
//将主版本号写入到数组中
buffer[5] = (byte)this.MainVersion;
//将次版本号写入到数组中
buffer[6] = (byte)this.SecondVersion;
//消息头已写完,现在写消息体。
byte[] body = new byte[this.MessageLength - 7];
SocketFactory.DefaultEncoding.GetBytes(this.MessageBody).CopyTo(buffer,7);
return buffer;
}
public static Message Parse(Connection connection) {
Message message = new Message();
//先读出前四个字节,即Message长度
byte[] buffer = new byte[4];
if(connection.NetworkStream.DataAvailable) {
int count = connection.NetworkStream.Read(buffer,0,4);
if(count == 4) {
message.MessageLength = BitConverter.ToInt32(buffer,0);
}
else
throw new Exception("网络流长度不正确");
}
else
throw new Exception("目前网络不可读");
//读出消息的其它字节
buffer = new byte[message.MessageLength - 4];
if(connection.NetworkStream.DataAvailable) {
int count = connection.NetworkStream.Read(buffer,0,buffer.Length);
if(count == message.MessageLength -4) {
message.Command = (CommandHeader)buffer[0];
message.MainVersion = buffer[1];
message.SecondVersion = buffer[2];
//读出消息体
message.MessageBody = SocketFactory.DefaultEncoding.GetString(buffer,3,buffer.Length - 3);
message.SendToOrReceivedFrom = connection;
return message;
}
else
throw new Exception("网络流长度不正确");
}
else
throw new Exception("目前网络不可读");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -