c# websocket服务器在html5中没有触发onmessage事件
本文关键字:onmessage 事件 websocket 服务器 html5 | 更新日期: 2023-09-27 18:06:05
也许我现在非常需要帮助。
我目前有一个关于websocket服务器使用c#和HTML5的问题。它不是在html5中触发我的onmessage()事件。它打开套接字连接并触发onopen()事件。但是,一旦建立了连接,它就会继续关闭该连接。下面是我的简单代码:
服务器(c#):using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Security.Cryptography;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
public Socket ListenerSocker { get; private set; }
static IPEndPoint ipLocal;
static Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
static private string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
static void Main(string[] args)
{
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
//serverSocket.Listen(128);
serverSocket.Listen(200);
serverSocket.BeginAccept(null, 0, OnAccept, null);
Console.Read();
}
private static void OnClientConnect()
{
serverSocket.BeginAccept(null, 0, OnAccept, null);
}
private static void OnAccept(IAsyncResult result)
{
byte[] buffer = new byte[1024];
Socket client = null;
string headerResponse = "";
if (serverSocket != null && serverSocket.IsBound)
{
client = serverSocket.EndAccept(result);
var i = client.Receive(buffer);
headerResponse = (System.Text.Encoding.UTF8.GetString(buffer)).Substring(0, i);
// write received data to the console
Console.WriteLine(headerResponse);
}
if (client != null)
{
/* Handshaking and managing ClientSocket */
var key = headerResponse.Replace("ey:", "`")
.Split('`')[1] // dGhlIHNhbXBsZSBub25jZQ== 'r'n .......
.Replace("'r", "").Split(''n')[0] // dGhlIHNhbXBsZSBub25jZQ==
.Trim();
// key should now equal dGhlIHNhbXBsZSBub25jZQ==
var test1 = AcceptKey(ref key);
var newLine = "'r'n";
var response = "HTTP/1.1 101 Switching Protocols" + newLine
+ "Upgrade: websocket" + newLine
+ "Connection: Upgrade" + newLine
+ "Sec-WebSocket-Accept: " + test1 + newLine + newLine
+ "Sec-WebSocket-Key: " + test1 + newLine + newLine
+ "Sec-WebSocket-Key: " + test1 + newLine + newLine
//+ "Sec-WebSocket-Protocol: chat, superchat" + newLine
//+ "Sec-WebSocket-Version: 13" + newLine
;
// which one should I use? none of them fires the onopen method
client.Send(System.Text.Encoding.UTF8.GetBytes(response));
var i = client.Receive(buffer); // wait for client to send a message
// once the message is received decode it in different formats
Console.WriteLine(Convert.ToBase64String(buffer).Substring(0, i));
/*
Console.WriteLine("'n'nPress enter to send data to client");
Console.Read();
*/
var subA = SubArray<byte>(buffer, 0, i);
Console.WriteLine("***SUBA****:"+subA);
Console.WriteLine("TEST");
client.Send(subA);
// Thread.Sleep(10000);//wait for message to be send
// OnClientConnect();
}
}
public static T[] SubArray<T>(T[] data, int index, int length)
{
T[] result = new T[length];
Array.Copy(data, index, result, 0, length);
Console.WriteLine(result);
return result;
}
private static string AcceptKey(ref string key)
{
string longKey = key + guid;
byte[] hashBytes = ComputeHash(longKey);
return Convert.ToBase64String(hashBytes);
}
static SHA1 sha1 = SHA1CryptoServiceProvider.Create();
private static byte[] ComputeHash(string str)
{
return sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(str));
}
}
}
客户机(HTML5): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function connect() {
var ws = new WebSocket("ws://localhost:8080");
console.log(ws);
ws.onopen = function () {
alert("About to send data");
ws.send("test"); // I WANT TO SEND THIS MESSAGE TO THE SERVER!!!!!!!!
alert("Message sent!");
};
ws.onmessage = function (evt) {
alert("About to receive data");
var received_msg = evt.data;
alert("Message received = "+received_msg);
};
ws.onclose = function () {
// websocket is closed.
alert("Connection is closed...");
};
};
function send(){
}
</script>
</head>
<body style="font-size:xx-large" >
<div>
<a href="#" onclick="connect()">Click here to start</a></div>
</body>
</html>
我可以得到这个:
alert("About to send data");
:
alert("Message sent!");
之后,连接关闭。我还可以检查服务器是否从客户端接收数据。问题是,一旦我将数据从服务器发送到客户端,为了能够返回客户端给我的内容,连接突然关闭。有什么问题吗?
Websocket消息不是纯文本;他们需要一个简单的帧协议
对于client->server和server->client消息,帧规则略有不同。当你试图回显它的消息而不应用不同的帧时,我想象客户端正在关闭它的连接。
关于如何解码/编码消息,请参阅RFC6455的数据帧部分。或者,如果你正在使用。net 4.5,你可以考虑使用System.Net.WebSockets,而不是编写自己的服务器。