• WPF--实现WebSocket服务端


    一,什么是websocket
    WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
    它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
    Websocket是一个持久化的协议
    二,websocket的原理
    websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信
    在websocket出现之前,web交互一般是基于http协议的短连接或者长连接
    websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"
    三,websocket与http的关系
     相同点:

    都是基于tcp的,都是可靠性传输协议
    都是应用层协议
    不同点:

    WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息
    HTTP是单向的
    WebSocket是需要浏览器和服务器握手进行建立连接的
    而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接
     联系:

    WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的
    总结(总体过程):

    首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
    然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
    最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。 

    一、XAML代码

    1. <Window x:Class="Freed.WebSocket.Service.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:Freed.WebSocket.Service"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <TextBox x:Name="textBox_Address" HorizontalAlignment="Left" Height="23" Margin="25,20,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="493"/>
    11. <Button x:Name="button" Content="启动" HorizontalAlignment="Left" Margin="552,23,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
    12. <TextBox x:Name="textBox_Content" HorizontalAlignment="Left" Height="294" Margin="31,72,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="672"/>
    13. <Button x:Name="but_Send" Content="发送" HorizontalAlignment="Left" Margin="633,23,0,0" VerticalAlignment="Top" Width="75" Click="but_Send_Click"/>
    14. Grid>
    15. Window>

    二、后台代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. using System.Windows;
    8. using System.Windows.Controls;
    9. using System.Windows.Data;
    10. using System.Windows.Documents;
    11. using System.Windows.Input;
    12. using System.Windows.Media;
    13. using System.Windows.Media.Imaging;
    14. using System.Windows.Navigation;
    15. using System.Windows.Shapes;
    16. using WebSocketSharp.Server;
    17. namespace Freed.WebSocket.Service
    18. {
    19. ///
    20. /// MainWindow.xaml 的交互逻辑
    21. ///
    22. public partial class MainWindow : Window
    23. {
    24. public MainWindow()
    25. {
    26. InitializeComponent();
    27. }
    28. private void button_Click(object sender, RoutedEventArgs e)
    29. {
    30. StartWebSocket(this.textBox_Address.Text);
    31. }
    32. WebSocketServer wssv;
    33. void StartWebSocket(string Ip)
    34. {
    35. wssv = new WebSocketServer(IPAddress.Parse(this.textBox_Address.Text), 9999);
    36. wssv.AddWebSocketService("/Server");
    37. wssv.Start();
    38. if (wssv.IsListening)
    39. {
    40. MessageBox.Show(string.Format("Listening on port {0}, and providing WebSocket services:", wssv.Port));
    41. foreach (var path in wssv.WebSocketServices.Paths)
    42. MessageBox.Show(string.Format("- {0}", path));
    43. }
    44. }
    45. //发送
    46. private void but_Send_Click(object sender, RoutedEventArgs e)
    47. {
    48. wssv.WebSocketServices.Broadcast(this.textBox_Content.Text);
    49. }
    50. }
    51. }

    2.1  ServerSharp

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Windows;
    7. using WebSocketSharp;
    8. using WebSocketSharp.Server;
    9. namespace Freed.WebSocket.Service
    10. {
    11. public class ServerSharp : WebSocketBehavior
    12. {
    13. int count = 0;
    14. protected override void OnClose(CloseEventArgs e)
    15. {
    16. count++;
    17. Task tk = new Task(() => {
    18. MessageBox.Show("客户端关闭连接");
    19. });
    20. tk.Start();
    21. }
    22. protected override void OnError(ErrorEventArgs e)
    23. {
    24. Task tk = new Task(() => {
    25. MessageBox.Show($"客户端连接异常:{e.Message}");
    26. });
    27. tk.Start();
    28. }
    29. protected override void OnMessage(MessageEventArgs e)
    30. {
    31. Task tk = new Task(() => {
    32. Send("接收到消息:" + e.Data);
    33. });
    34. tk.Start();
    35. }
    36. }
    37. }

  • 相关阅读:
    Git基础知识及基本操作
    SkiaSharp 之 WPF 自绘 拖曳小球(案例版)
    近六成员工强烈支持,携程将推出“3+2 ”工作模式,一周在家办公两天
    redis在实际项目作用
    宠物赛道意外火了,行业龙头们相继奔赴IPO
    【数据结构与算法】栈与队列相关算法的实现
    全量知识系统问题及SmartChat给出的答复 之13 解析器+DDD+文法型
    6.2.3 【MySQL】InnoDB的B+树索引的注意事项
    Linux 文件权限
    Go语言类库-context
  • 原文地址:https://blog.csdn.net/beautifull001/article/details/126017181