TCP html5 websocket客户端连接到c# socket服务器
TCP html5 websocket client connect to C# socket server
我有一个使用socket用c#编写的服务器:
/*
Richard D. Grant
R.grant.jr.122193@gmail.com
-Contact for details-
*/
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.Threading;
namespace SERVER{
static class Application{
private static readonly List<Socket> _client_list = new List<Socket>();
private const ushort _port = 8080, _buffer_len = 1024;
private static byte[] _buf = new byte[_buffer_len];
private static string key;
static private string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
private static Boolean exiting = false;
static int Main(){
Console.Title = "Server Application";
Socket server_socket = StartServer();
while(!exiting){
}
return CloseServer(server_socket);
}
private static Socket StartServer(){
IPEndPoint IPE = new IPEndPoint(IPAddress.Any, _port); // 192.168.0.14:80
Socket server_socket = new Socket(IPE.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
server_socket.Bind(IPE);
server_socket.Listen(128);
server_socket.BeginAccept(AcceptCallback, server_socket);
Console.WriteLine("Server Succeeded.");
return server_socket;
}
private static void AcceptCallback(IAsyncResult AR){
Console.WriteLine("accepting...");
Socket server_socket = (Socket)AR.AsyncState;
Socket client_socket = server_socket.EndAccept(AR);
client_socket.BeginReceive(_buf, 0, _buffer_len, SocketFlags.None, RecCallback, client_socket);
server_socket.BeginAccept(AcceptCallback, server_socket);
}
private static void RecCallback(IAsyncResult AR){
Console.WriteLine("Recieving");
Socket client_socket = (Socket)AR.AsyncState;
int rec_len = client_socket.EndReceive(AR);
byte[] rec_buf = new byte[rec_len];
Array.Copy(_buf, rec_buf, rec_len);
string rec_text = Encoding.UTF8.GetString(rec_buf);
if(!_client_list.Contains(client_socket)){
_client_list.Add(client_socket);
key = rec_text.Replace("ey:", "`")
.Split('`')[1] // dGhlIHNhbXBsZSBub25jZQ== 'r'n .......
.Replace("'r", "").Split(''n')[0] // dGhlIHNhbXBsZSBub25jZQ==
.Trim();
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
;
client_socket.Send(Encoding.UTF8.GetBytes(response));
client_socket.Send("server received");
}else{
Console.WriteLine(rec_text);
}
_buf = new byte[_buffer_len];
client_socket.BeginReceive(_buf, 0, _buffer_len, SocketFlags.None, RecCallback, client_socket);
}
private static void client_disconnect(Socket soc){
soc.Shutdown(SocketShutdown.Both);
soc.Close();
}
private static ushort CloseServer(Socket server_socket){
foreach(Socket client in _client_list){
client_disconnect(client);
}
server_socket.Close();
return 0;
}
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(Encoding.UTF8.GetBytes(str));
}
}
}
我有HTML5 websocket客户端:
<!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/service");
ws.onopen = function () {
ws.send("Hello World"); // I WANT TO SEND THIS MESSAGE TO THE SERVER!!!!!!!!
console.log("opened!");
};
ws.onmessage = function (evt) {
console.log("About to receive data");
var received_msg = evt.data;
console.log("Message received = "+received_msg);
};
ws.onclose = function () {
// websocket is closed.
console.log("Connection is closed...");
};
};
</script>
</head>
<body style="font-size:xx-large" >
<div>
<a href="#" onclick="connect()">Click here to start</a></div>
</body>
</html>
HTML5 websocket需要握手,服务器相应处理。
client_socket.send(Encoding.UTF8.GetBytes("send"));
不触发html5 onmessage
ws.send("send");
返回打乱的文本到服务器,但它被成功发送。
服务器处理握手,但不处理之后的数据包帧。该消息不是以纯文本形式发送回来的,需要进行一些处理。
如何在服务器端发送和接收WebSocket消息?
详细说明框架规格。例如,第一个字节总是129,秒与长度有关。这里有一个示例c#方法来解码所提供的链接上的帧
我想发布源代码到我的解决方案,虽然我想给信用AlexH指向我在正确的位置。
private static byte[] encode(string str){
List<byte> lb = new List<byte>();
lb.Add(0x81);//129 to represent text frame
lb.Add((byte)str.Length);//2nd byte represents the length of the string
lb.AddRange(System.Text.Encoding.UTF8.GetBytes(str));
return lb.ToArray();
}
坐标系:+---------------------------------+
| FRAME TYPE | DATA LENGTH | DATA |
+---------------------------------+
相关文章:
- 如何使用Socket.io将命令从客户端发送到服务器
- Socket.io socket.emit 不将数据传递到服务器
- 在不同子域上使用Socket.IO服务器和客户端
- "对象不是函数“;当将Node.js HTTP服务器对象传递给Socket.IO时
- 当用户刷新页面时,如何在单独的服务器中处理socket.io上的会话
- Socket.IO:重新连接导致服务器连接代码运行两次
- Socket.IO:如何在同一服务器中的Socket.on()事件之间通信/交换数据
- 如何将我的Web Socket服务器应用程序放在Heroku中
- socket.io 客户端,不会向服务器发出消息
- 节点.js socket.io 网络服务器提供索引.html以外的其他文件
- socket.io (nodejs) 是否通过在回调完成期间阻止服务器来影响服务器性能
- socket.io 客户端 - 如果没有连接或服务器关闭,则不会触发发出回调
- 404 GET 在 Django 模板中的服务器 socket.io
- 向 Socket.IO 服务器发出事件
- 没有node.js服务器的客户端socket.io
- socket.io 服务器在注册客户端断开连接时非常延迟
- 您能否从 Web 浏览器加载 Socket.IO(快速)服务器
- 如何将 Socket.IO 客户端连接到 Sails.js 服务器
- 当本地主机服务器提供实际页面时,如何使用 socket.io 与另一台服务器通信
- TCP html5 websocket客户端连接到c# socket服务器