C# 发送大于126字节WebSocket的邮件
现在我正在处理WebSocket,这方面我是新手,我终于可以发送126字节的消息,但我需要发送更长的消息,但当我尝试自动关闭连接时,我的代码是:C# 发送大于126字节WebSocket的邮件,c#,google-chrome,websocket,C#,Google Chrome,Websocket,现在我正在处理WebSocket,这方面我是新手,我终于可以发送126字节的消息,但我需要发送更长的消息,但当我尝试自动关闭连接时,我的代码是: public void sendMessage(Stream stream, string message) { try { List<byte> lb = new List<byte>(); string aux = message
public void sendMessage(Stream stream, string message)
{
try
{
List<byte> lb = new List<byte>();
string aux = message;
bool flagStart = false;
int size;
while (message.Length > _maxLengthMessage)
{
lb = new List<byte>();
// I cut the mesasge in smaller pieces to send
message = aux.Substring(0, _maxLengthMessage);
aux = aux.Substring(_maxLengthMessage);
if (!flagStart)
{
// In doc of Websockets i sign this piece: not the end, text
lb.Add(0x01);
flagStart = !flagStart;
}
else
{
// In doc of Websockets i sign this piece: not the end, continuation
lb.Add(0x00);
}
size = message.Length;
lb.Add((byte)size);
lb.AddRange(Encoding.UTF8.GetBytes(message));
stream.Write(lb.ToArray(), 0, size + 2);
}
lb = new List<byte>();
if (!flagStart)
{
// If is this the only message we mark with: end of message, text
lb.Add(0x81);
flagStart = !flagStart;
}
else
{
//else Is the end of the message but is the continuation frame
lb.Add(0x80);
}
size = aux.Length;
lb.Add((byte)size);
lb.AddRange(Encoding.UTF8.GetBytes(aux));
//lb.AddRange(Encoding.UTF8.GetBytes(i.ToString()));
stream.Write(lb.ToArray(), 0, size+2);
}
catch (Exception ex)
{
throw ex;
}
}
公共void发送消息(流、字符串消息)
{
尝试
{
List lb=新列表();
字符串aux=消息;
bool flagStart=false;
整数大小;
while(message.Length>\u maxLengthMessage)
{
lb=新列表();
//我把台面切成小片送去
消息=辅助子字符串(0,_maxLengthMessage);
aux=辅助子字符串(_maxLengthMessage);
如果(!flagStart)
{
//在《Websockets文档》中,我在这篇文章上签名:不是结尾,而是正文
lb.Add(0x01);
flagStart=!flagStart;
}
其他的
{
//在Websockets文档中,我签署了这篇文章:不是结尾,而是继续
lb.Add(0x00);
}
大小=消息长度;
lb.Add((字节)大小);
lb.AddRange(Encoding.UTF8.GetBytes(message));
stream.Write(lb.ToArray(),0,大小+2);
}
lb=新列表();
如果(!flagStart)
{
//如果这是我们标记的唯一消息:消息结束,文本
lb.Add(0x81);
flagStart=!flagStart;
}
其他的
{
//else是消息的结尾,但是继续帧
lb.Add(0x80);
}
尺寸=辅助长度;
lb.Add((字节)大小);
lb.AddRange(Encoding.UTF8.GetBytes(aux));
//lb.AddRange(Encoding.UTF8.GetBytes(i.ToString());
stream.Write(lb.ToArray(),0,大小+2);
}
捕获(例外情况除外)
{
掷骰子;
}
}
一些答案说“转到WebSocket协议”,但它对我不起作用 编写消息长度的代码需要扩展。的数据帧图中的扩展有效负载显示了缺少的内容 对于最多125字节的邮件,您的代码是正确的。
对于大于125但小于65536字节的消息,您需要写入9个字节-第一个字节是127;以下8个字节给出了消息长度。您编写消息长度的代码需要扩展。的数据帧图中的扩展有效负载显示了缺少的内容 对于最多125字节的邮件,您的代码是正确的。
对于大于125但小于65536字节的消息,您需要写入9个字节-第一个字节是127;以下8个字节给出了消息长度。Ye,您必须创建正确的帧,以下是方法:
static private byte[] CreateFrame(string message, MessageType messageType = MessageType.Text, bool messageContinues = false)
{
byte b1 = 0;
byte b2 = 0;
switch (messageType)
{
case MessageType.Continuos:
b1 = 0;
break;
case MessageType.Text:
b1 = 1;
break;
case MessageType.Binary:
b1 = 2;
break;
case MessageType.Close:
b1 = 8;
break;
case MessageType.Ping:
b1 = 9;
break;
case MessageType.Pong:
b1 = 10;
break;
}
b1 = (byte)(b1 + 128); // set FIN bit to 1
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
if (messageBytes.Length < 126)
{
b2 = (byte)messageBytes.Length;
}
else
{
if (messageBytes.Length < Math.Pow(2,16)-1)
{
b2 = 126;
}
else
{
b2 = 127;
}
}
byte[] frame = null;
if(b2 < 126)
{
frame = new byte[messageBytes.Length + 2];
frame[0] = b1;
frame[1] = b2;
Array.Copy(messageBytes, 0, frame, 2, messageBytes.Length);
}
if(b2 == 126)
{
frame = new byte[messageBytes.Length + 4];
frame[0] = b1;
frame[1] = b2;
byte[] lenght = BitConverter.GetBytes(messageBytes.Length);
frame[2] = lenght[1];
frame[3] = lenght[0];
Array.Copy(messageBytes, 0, frame, 4, messageBytes.Length);
}
if(b2 == 127)
{
frame = new byte[messageBytes.Length + 10];
frame[0] = b1;
frame[1] = b2;
byte[] lenght = BitConverter.GetBytes((long)messageBytes.Length);
for(int i = 7, j = 2; i >= 0; i--, j++)
{
frame[j] = lenght[i];
}
}
return frame;
}
static private byte[]CreateFrame(字符串消息,MessageType MessageType=MessageType.Text,bool messageContinues=false)
{
字节b1=0;
字节b2=0;
开关(消息类型)
{
case MessageType.Continuos:
b1=0;
打破
case MessageType.Text:
b1=1;
打破
case MessageType.Binary:
b1=2;
打破
案例消息类型。关闭:
b1=8;
打破
case MessageType.Ping:
b1=9;
打破
case MessageType.Pong:
b1=10;
打破
}
b1=(字节)(b1+128);//将FIN位设置为1
byte[]messageBytes=Encoding.UTF8.GetBytes(消息);
if(messageBytes.Length<126)
{
b2=(字节)messageBytes.Length;
}
其他的
{
if(messageBytes.Length=0;i--,j++)
{
帧[j]=长度[i];
}
}
返回框;
}
Ye,您必须创建正确的帧,以下是方法:
static private byte[] CreateFrame(string message, MessageType messageType = MessageType.Text, bool messageContinues = false)
{
byte b1 = 0;
byte b2 = 0;
switch (messageType)
{
case MessageType.Continuos:
b1 = 0;
break;
case MessageType.Text:
b1 = 1;
break;
case MessageType.Binary:
b1 = 2;
break;
case MessageType.Close:
b1 = 8;
break;
case MessageType.Ping:
b1 = 9;
break;
case MessageType.Pong:
b1 = 10;
break;
}
b1 = (byte)(b1 + 128); // set FIN bit to 1
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
if (messageBytes.Length < 126)
{
b2 = (byte)messageBytes.Length;
}
else
{
if (messageBytes.Length < Math.Pow(2,16)-1)
{
b2 = 126;
}
else
{
b2 = 127;
}
}
byte[] frame = null;
if(b2 < 126)
{
frame = new byte[messageBytes.Length + 2];
frame[0] = b1;
frame[1] = b2;
Array.Copy(messageBytes, 0, frame, 2, messageBytes.Length);
}
if(b2 == 126)
{
frame = new byte[messageBytes.Length + 4];
frame[0] = b1;
frame[1] = b2;
byte[] lenght = BitConverter.GetBytes(messageBytes.Length);
frame[2] = lenght[1];
frame[3] = lenght[0];
Array.Copy(messageBytes, 0, frame, 4, messageBytes.Length);
}
if(b2 == 127)
{
frame = new byte[messageBytes.Length + 10];
frame[0] = b1;
frame[1] = b2;
byte[] lenght = BitConverter.GetBytes((long)messageBytes.Length);
for(int i = 7, j = 2; i >= 0; i--, j++)
{
frame[j] = lenght[i];
}
}
return frame;
}
static private byte[]CreateFrame(字符串消息,MessageType MessageType=MessageType.Text,bool messageContinues=false)
{
字节b1=0;
字节b2=0;
开关(消息类型)
{
case MessageType.Continuos:
b1=0;
打破
case MessageType.Text:
b1=1;
打破
case MessageType.Binary:
b1=2;
打破
案例消息类型。关闭:
b1=8;
打破
case MessageType.Ping:
b1=9;
打破
case MessageType.Pong:
b1=10;
打破
}
b1=(字节)(b1+128);//将FIN位设置为1
byte[]messageBytes=Encoding.UTF8.GetByt