C#⼯作总结(⼀):Fleck的WebSocket使⽤
版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。 blog.csdn/ZslLoveMiwa/article/details/80247739
⼀.引⼦(Foreword)
最近公司⾥⾯要做窗体和⽹页交互的功能。⽹上了⼀下资料,这⾥做⼀个简单的扩充和整理,部分内容可能是摘⾃其他博客,这⾥会注明出处和原⽂地址供⼤家和⾃⼰⽇后查阅。
⼆.基础知识(Foundation)
(1). WebSocket介绍
WebSocket协议是基于TCP的⼀种新的⽹络协议。它实现了浏览器与服务器全双⼯(full-duplex)通信——允许服务器主动发送信息给客户端。()
(2).浏览器对WebSocket的⽀持
浏览器⽀持情况
Chrome⾕歌浏览器Chrome version 4+⽀持
Firefox⽕狐浏览器Firefox version 5+⽀持
IE微软浏览器IE version 10+⽀持(我们⼀般win7⾃带的是IE11)
Safari苹果浏览器IOS 5+⽀持
Android Brower安卓浏览器Android 4.5+⽀持
(3). WebSocket服务器⽀持
⼚商应⽤服务器备注
IBM WebSphere WebSphere 8.0以上版本⽀持,7.X之前版本结合MQTT⽀持类似的HTTP长连接
甲⾻⽂WebLogic WebLogic 12c ⽀持,11g以及10g版本通过HTTP Publish⽀持类似的HTTP长连接
微软IIS IIS 7.0+⽀持
Apache Tomcat Tomcat 7.0.5+⽀持
Jetty Jetty 7.0+⽀持
(4). Web前端知识概要
<1>. 对象创建(调⽤WebSocket的构造函数)
1)函数原型:
Constructor(DOMString url,[DOMString protocols]);
2)说明:url为WebSocket服务器的地址,protocols为发起握⼿的协议名称,为可选择项。
<2>. 接⼝及函数⽅法(WebSocket的接⼝的定义)
1)函数原型:
Interface WebSocket:EventTarget{
readonly attribute DOMString url;
//readyState状态值
Const unsigned short CONNECTING=0;
Const unsigned short OPEN=1;
Const unsigned short CLOSING=2;
Const unsigned short CLOSED=3;
readonly attribute unsigned short readyState;
readonly attribute unsigned long bufferedAmount;
//监听⽹络状态的事件属性
[TreatNonCallableAsNull] attribute Function? onopen;
[TreatNonCallableAsNull] attribute Function? onerror;
[TreatNonCallableAsNull] attribute Function? onclose;
readonly attribute DOMString extensions;
readonly attribute DOMString protocol;
//关闭⽹络连接的⽅法
void close([Clamp] optional unsigned short code,optional DOMString reason);
/
/接受服务器消息的事件函数
[TreatNonCallableAsNull] attribute Function? onmessage;
attribute DOMString binaryType;
void send(DOMString data);
void send(ArrayBuffer data);
void send(Blob data);
};
2)说明:
【1】. 两个⽅法:
●send():向远程服务器发送数据
●cosle():关闭该WebSocket
【2】. 四个重要的事件属性:
●onopen:当WebSocket建⽴⽹络连接的时候触发该事件
●onerror:当⽹络连接出现问题的时候触发该事件
●onclose:当WebSocket被关闭的时候触发该事件
●onmessage:当WebSocket接受到远程服务器的数据的时候触发该事件
注意:1. 上⾯的四个函数名均为⼩写,⼤⼩写时敏感的;
2. onmessage 绑定⼀个型为 function(event){…} 的函数这样就可以通过event.data来获得返回的数据;
【3】. readyState属性,⽤于返回WebSocket所处的状态:
●CONNECTING(数值0):WebSocket正在尝试与服务器建⽴连接
●OPEN(数值1):WebSocket与服务器已经建⽴连接
●CLOSING(数值2):WebSocket正在关闭与服务器的连接
●CLOSED(数值3):WebSocket已经关闭了与服务器的连接
<3>. 使⽤WebSocket(4步)
1) 将相关的定义函数绑定到上⾯4个监听事件中;
2)调⽤WebSocket的构造函数,给定⼀个url来初始化⼀个WebSocket对象;
3)通过send()⽅法来发送数据;
4)在有必要的时候可以⽤close()来关闭监听;
(4).客户端知识概要
<1>. 梗概
我们可以通过基础的Socket通信来实现和⽹页的相互通信。但由于只有在 Framework在4.5以及4.5以上的版本对WebSocket通信的数据解析才有相关的类来⽀持。所以解析数据写起来⼗分的繁琐,所以我们使⽤第三⽅的库来完成低版本框架中的通信。如果有时间我也会写⼀篇有关socket来进⾏通信及解析数据的⽂章。
接下来我看看⽤的软件和相关的技术知识。
<2>. .Net不同WebSocket库的⽐较
我这⾥了⼀下⽹上的资料,如下链接,如果仅仅是要从⽹页发送消息到服务器,那么我这边使⽤Flerk。
●英⽂版:
●翻译版:
<3>. Fleck的源码下载以及说明⽂档
源码可以从⽹上下载,这⾥我给出链接:
点击页⾯中的Clone or download -> Download ZIP,如下
图⼀
说明⽂档就在下载的下⾯,是英⽂版的的,当然也可以看我博客中的译⽂:
⼀.引⼦(Foreword)
对于怎么使⽤直接看说明⽂档,⾮常简单,这⾥博主就不多说了。(博主都写到晚上1点了T T)
三.代码(Code)
(1). Web⽹页端代码
<!DOCTYPE html>
<html lang="en" xmlns="/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>WebSocket测试</title>
<style>
.div1
{
height:88px;
width:173px;
border:1px solid blue;
margin:auto;
}
h4
{
margin:auto;
}
</style>
<script>
var webSocket = {};
//创建websockt
function CreateWebSocket() {
webSocket = new WebSocket("ws://127.0.0.1:30000"); pen = WebSokectOnOpen;
};
//建⽴连接事件
function WebSokectOnOpen() {
alert("已经打开连接!");
webSocket.Send("WebSocketCreate Success!");
};
//监听事件
function WebSocketOnMessage(event) {
//监听来⾃客户端的数据
alert(event.data);
};
function WebSocketOnClose() {
//监听来⾃客户端的数据
alert('和服务器断开连接');
};
//发送事件
function WebSocketSendMsg() {
//获取text中的值
var text = ElementById("Text1").value; //发送到服务器
webSocket.send(text);
};
</script>
</head>
<body onload="CreateWebSocket()">
<div class="div1">
<h4>CSDN博客</h4>
<h4>By:LoveMiw</h4>
<h4>By:LoveMiw</h4>
<input type="text" id="Text1" />
<input type="button" onclick="WebSocketSendMsg()" value="发送数据" />
</div>
</body>
</html>
(2). 服务端C#代码
//上⾯是程序⽣成的using
using Fleck;
namespace WebSocketTest
{
class Program
{
static void Main(string[] args)
{
//客户端url以及其对应的Socket对象字典
IDictionary<string, IWebSocketConnection> dic_Sockets = new Dictionary<string, IWebSocketConnection>();
//创建
WebSocketServer server = new WebSocketServer("ws://0.0.0.0:30000");//监听所有的的地址
//出错后进⾏重启
server.RestartAfterListenError = true;
//开始监听
server.Start(socket =>
{
socket.OnOpen = () => //连接建⽴事件
{
//获取客户端⽹页的url
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
dic_Sockets.Add(clientUrl, socket);
Console.WriteLine(DateTime.Now.ToString() + "|服务器:和客户端⽹页:" + clientUrl + " 建⽴WebSock连接!");
};
socket.OnClose = () => //连接关闭事件
{
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
//如果存在这个客户端,那么对这个socket进⾏移除
if (dic_Sockets.ContainsKey(clientUrl))
{
//注:Fleck中有释放
//关闭对象连接
前端websocket怎么用//if (dic_Sockets[clientUrl] != null)
//{
/
/dic_Sockets[clientUrl].Close();
//}
dic_Sockets.Remove(clientUrl);
}
Console.WriteLine(DateTime.Now.ToString() + "|服务器:和客户端⽹页:" + clientUrl + " 断开WebSock连接!");
};
socket.OnMessage = message => //接受客户端⽹页消息事件
{
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
Console.WriteLine(DateTime.Now.ToString() + "|服务器:【收到】来客户端⽹页:" + clientUrl + "的信息:\n" + message); };
});
Console.ReadKey();
foreach (var item in dic_Sockets.Values)
{
if (item.IsAvailable == true)
{
item.Send("服务器消息:" + DateTime.Now.ToString());
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论