国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

做個(gè)小工具-WebSocket客戶端

這篇具有很好參考價(jià)值的文章主要介紹了做個(gè)小工具-WebSocket客戶端。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

由于工作的原因經(jīng)常需要用到一些socket,串口等調(diào)試工具,但是好多工具要么只有其中幾個(gè)或者各種收費(fèi),不斷提醒捐助等。所以還是自己做一個(gè)吧。畢竟也不復(fù)雜。今天先做個(gè)WebSocket客戶端。WebSocket使用了開(kāi)源組件WatsonWebsocket。

  1. 先上圖
    websocket小工具,.net,websocket,microsoft,網(wǎng)絡(luò)協(xié)議
  2. View的代碼
<local:PageWithId x:Class="ToolsAssistant.Views.WebSocketClientView"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:ToolsAssistant.Views" xmlns:viewmodels="clr-namespace:ToolsAssistant.ViewModels" d:DataContext="{d:DesignInstance Type=viewmodels:WebSocketClientViewModel}"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800" Unloaded="Page_Unloaded" Loaded="Page_Loaded"
      Title="WebServerClientView" Background="White">
    
    <Grid>
        <Grid.Resources>
            <Style x:Key="btn_style" TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Content, ElementName=btn_connect}" Value="連接">
                        <Setter Property="IsEnabled" Value="False"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Content, ElementName=btn_connect}" Value="斷開(kāi)">
                        <Setter Property="IsEnabled" Value="true"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
            <Style x:Key="radio_style" TargetType="RadioButton">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Content, ElementName=btn_connect}" Value="連接">
                        <Setter Property="IsEnabled" Value="False"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Content, ElementName=btn_connect}" Value="斷開(kāi)">
                        <Setter Property="IsEnabled" Value="true"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Resources>
        <Grid.RowDefinitions>
            <RowDefinition Height="40"/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Border BorderThickness="1" BorderBrush="Gray" Margin="3" CornerRadius="5" Grid.Row="0">
            <StackPanel  Orientation="Horizontal">
                <Label Content="ws://" Margin="3" VerticalContentAlignment="Center"></Label>
                <TextBox Text="{Binding Url}" Margin="3" Width="200" VerticalContentAlignment="Center"/>
                <Button x:Name="btn_connect" Margin="3" Content="{Binding ConnectString}" Width="60" Command="{Binding ConnectCommand}">
                </Button>
            </StackPanel>
        </Border>
        <Border BorderThickness="1" BorderBrush="Gray" Margin="3" CornerRadius="5" Grid.Row="1">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="40"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <StackPanel Grid.Row="0" Orientation="Horizontal">
                    <Button Content="發(fā)送" Command="{Binding SendCommand}" Width="60" Margin="3" Style="{StaticResource btn_style}">
                    </Button>
                    <Button Content="清空" Command="{Binding ClearSendCommand}" Width="60" Margin="3" Style="{StaticResource btn_style}"/>
                    <RadioButton Content="UTF8" Margin="3" VerticalContentAlignment="Center"  IsChecked="{Binding IsUTF8}" Style="{StaticResource radio_style}"/>
                    <RadioButton Content="ASCII" Margin="3" VerticalContentAlignment="Center" IsChecked="{Binding IsASCII}" Style="{StaticResource radio_style}" />
                    <RadioButton Content="HEX" Margin="3" VerticalContentAlignment="Center" IsChecked="{Binding IsHex}" Style="{StaticResource radio_style}"/>
                </StackPanel>
                <ScrollViewer Grid.Row="1" Margin="3">
                    <TextBox Text="{Binding SendStr}"></TextBox>
                </ScrollViewer>
            </Grid>
        </Border>
        <Border BorderThickness="1" BorderBrush="Gray" Margin="3" CornerRadius="5" Grid.Row="2">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="40"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <StackPanel Grid.Row="0" Orientation="Horizontal">
                    <Button Content="清空" Command="{Binding ClearRecieveCommand}" Width="60" Margin="3" Style="{StaticResource btn_style}"/>
                    <RadioButton Content="UTF8" Margin="3" VerticalContentAlignment="Center" IsChecked="{Binding IsUTF8}" Style="{StaticResource radio_style}"/>
                    <RadioButton Content="ASCII" Margin="3" VerticalContentAlignment="Center" IsChecked="{Binding IsASCII}" Style="{StaticResource radio_style}"/>
                    <RadioButton Content="HEX" Margin="3" VerticalContentAlignment="Center" IsChecked="{Binding IsHex}" Style="{StaticResource radio_style}"/>
                </StackPanel>
                <ScrollViewer Grid.Row="1" Margin="3">
                    <TextBox Text="{Binding RecieveStr}"></TextBox>
                </ScrollViewer>
            </Grid>
        </Border>
    </Grid>
</local:PageWithId>

  1. ViewModel的代碼
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using Microsoft.Toolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using ToolsAssistant.Services;

namespace ToolsAssistant.ViewModels
{
    public class WebSocketClientViewModel: ObservableObject
    {
        #region props
        private string _ConnectString = "連接";
        public string ConnectString { set => SetProperty(ref _ConnectString, value); get => _ConnectString; }

        private string _SendStr;
        public string SendStr { set => SetProperty(ref _SendStr, value); get => _SendStr; }

        private string _RecieveStr;
        public string RecieveStr { set => SetProperty(ref _RecieveStr, value); get => _RecieveStr; }

        private bool _IsUTF8 = true;
        public bool IsUTF8 {
            set
            {
                SetProperty(ref _IsUTF8, value);
                InitEncoder();
            }
            get => _IsUTF8; }

        private bool _IsASCII = false;
        public bool IsASCII {
            set
            {
                SetProperty(ref _IsASCII, value);
                InitEncoder();
            }
            get => _IsASCII; }

        private bool _IsHex = false;
        public bool IsHex {
            set
            {
                SetProperty(ref _IsHex, value);
                InitEncoder();
            }
            get => _IsHex; }

        private string _Url = "127.0.0.1:8888";
        public string Url { set => SetProperty(ref _Url, value); get => _Url; }
        #endregion
        #region commands
        public RelayCommand SendCommand { set; get; }
        public RelayCommand ClearSendCommand { set; get; }
        public RelayCommand ClearRecieveCommand { set; get; }
        public RelayCommand ConnectCommand { set; get; }
        #endregion
        #region methods
        protected readonly ILogger<WebSocketClientViewModel> _logger;
        protected readonly IWebSocketClient _client;
        public WebSocketClientViewModel()
        {
            _logger = App.Current.Services.GetService<ILogger<WebSocketClientViewModel>>();
            _client = App.Current.Services.GetService<IWebSocketClient>();
            Init();
        }

        private void Init()
        {
            SendCommand = new RelayCommand(OnSendCommand);
            ClearSendCommand = new RelayCommand(OnClearSendCommand);
            ClearRecieveCommand = new RelayCommand(OnClearRecieveCommand);
            ConnectCommand = new RelayCommand(OnConnectCommand);

            _client.ConnectEvent += ConnectEvent;

        }

        private void InitEncoder()
        {
            if(IsUTF8)
            {
                _client.SetEncording(EncordingType.Utf8);
            }
            if (IsASCII)
            {
                _client.SetEncording(EncordingType.ASCII);
            }
            if (IsHex)
            {
                _client.SetEncording(EncordingType.Hex);
            }
        }

        private void ConnectEvent(string ipPort, bool isConnect)
        {
            if(isConnect)
            {
                ConnectString = "斷開(kāi)";
                InitEncoder();
            }
            else
            {
                ConnectString = "連接";
            }
        }

        private void OnConnectCommand()
        {
            try
            {
                if(ConnectString == "連接")
                {
                    _client.Connect(Url);
                }
                else
                {
                    _client.Disconnect();
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.ToString());
                MessageBox.Show(ex.ToString());
            }
        }

        private void OnClearRecieveCommand()
        {
            try
            {
                RecieveStr = "";
            }catch(Exception ex)
            {
                _logger.LogError(ex.ToString());
                MessageBox.Show(ex.ToString());
            }
        }

        private void OnClearSendCommand()
        {
            try
            {
                SendStr = "";
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.ToString());
                MessageBox.Show(ex.ToString());
            }
        }

        private void OnSendCommand()
        {
            try
            {
                if(string.IsNullOrEmpty(SendStr))
                {
                    throw new Exception("發(fā)送內(nèi)容不允許為空");
                }

                _client.SendData(SendStr);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.ToString());
                MessageBox.Show(ex.ToString());
            }
        }
        #endregion
    }
}

  1. servervice的代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WatsonWebsocket;

namespace ToolsAssistant.Services
{
    internal class WebSocketClient : IWebSocketClient
    {
        private WatsonWsClient _client = null;

        private EncordingType _encordingType = EncordingType.Utf8;

        public event EventHandlers.DataRecievedEventHandler DataRecievedEvent;
        public event EventHandlers.ConnectEventHandler ConnectEvent;

        public void Connect(string ipPort)
        {
            if(_client == null||!_client.Connected)
            {
                _client = new WatsonWsClient(new Uri($"ws://{ipPort}"));
            }else
            {
                _client.Stop();
                _client = new WatsonWsClient(new Uri($"ws://{ipPort}"));
            }

            _client.ServerConnected += ServerConnected;
            _client.MessageReceived += MessageReceived;
            _client.ServerDisconnected += ServerDisconnected;

            _client.Start();
        }

        private void ServerDisconnected(object sender, EventArgs e)
        {
            ConnectEvent?.Invoke(null, false);
        }

        private void MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            try
            {
                string data = "";
                switch(_encordingType)
                {
                    case EncordingType.Utf8:
                        data = Encoding.UTF8.GetString(e.Data);
                        break;
                    case EncordingType.ASCII:
                        data = Encoding.ASCII.GetString(e.Data);
                        break;
                    case EncordingType.Hex:
                        for(int i=0;i<e.Data.Length;i++)
                        {
                            data += Convert.ToString(e.Data[i],16)+" ";
                        }
                        break;
                }
                DataRecievedEvent?.Invoke(e.IpPort,data);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void ServerConnected(object sender, EventArgs e)
        {
            ConnectEvent?.Invoke(null, true);
        }

        public void Disconnect()
        {
            if(_client.Connected)
            {
                _client.Stop();
                ConnectEvent?.Invoke(null, false);
            }
        }

        public void SetEncording(EncordingType encordingType)
        {
            _encordingType = encordingType;
        }

        public void SendData(string data)
        {
            byte[] dataBytes;
            switch (_encordingType)
            {
                case EncordingType.ASCII:
                    dataBytes = Encoding.ASCII.GetBytes(data.Replace(" ",""));
                    break;
                case EncordingType.Hex:
                    var lst = data.Split(" ");
                    dataBytes = new byte[lst.Length];
                    for (int i = 0; i < lst.Length; i++)
                    {
                        dataBytes[i] = Convert.ToByte(lst[i], 16);
                    }
                    break;
                default: //EncordingType.Utf8
                    dataBytes = Encoding.UTF8.GetBytes(data);
                    break;
            }

            _client.SendAsync(dataBytes);
        }
    }
}

其他的代碼就不列出來(lái)了,見(jiàn)代碼倉(cāng)庫(kù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-552468.html

到了這里,關(guān)于做個(gè)小工具-WebSocket客戶端的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java實(shí)現(xiàn)websocket客戶端

    常規(guī)情況下,大多數(shù)時(shí)候Java后臺(tái)作為websocket服務(wù)端,實(shí)現(xiàn)方式也比較簡(jiǎn)單,網(wǎng)上很多案例代碼。但是很多時(shí)候項(xiàng)目中服務(wù)與服務(wù)之間也需要使用websocket通信,此時(shí)項(xiàng)目就需要實(shí)現(xiàn)客戶端功能。 步驟一:導(dǎo)入依賴: 步驟二:實(shí)現(xiàn)WebSocketClient抽象類: 該類中和websocket服務(wù)端接口

    2024年02月16日
    瀏覽(86)
  • WebSocket 實(shí)現(xiàn)長(zhǎng)連接及通過(guò)WebSocket獲取客戶端IP

    WebSocket 是一種支持雙向通訊的網(wǎng)絡(luò)通信協(xié)議。 實(shí)現(xiàn)過(guò)程: 1 添加ServerEndpointExporter配置bean 2 實(shí)現(xiàn)過(guò)程 需求是通過(guò)WebSocket,建立長(zhǎng)連接,并獲取當(dāng)前在線的人數(shù)。通過(guò)Websocket 不斷發(fā)送消息,建立長(zhǎng)連接,給Session續(xù)命。我是通過(guò)MAC地址,區(qū)分不同的設(shè)備,因?yàn)槲业男枨笾行枰?/p>

    2024年02月09日
    瀏覽(32)
  • 快速搭建springboot websocket客戶端

    快速搭建springboot websocket客戶端

    WebSocket 是 HTML5 開(kāi)始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。 HTML5 定義的 WebSocket 協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實(shí)時(shí)地進(jìn)行通訊。 HTML5 定義的 WebSocket 協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實(shí)時(shí)地進(jìn)行通訊。 瀏覽器通過(guò) JavaSc

    2024年02月06日
    瀏覽(25)
  • SpringBoot+WebSocket實(shí)現(xiàn)服務(wù)端、客戶端

    SpringBoot+WebSocket實(shí)現(xiàn)服務(wù)端、客戶端

    小編最近一直在使用springboot框架開(kāi)發(fā)項(xiàng)目,畢竟現(xiàn)在很多公司都在采用此框架,之后小編也會(huì)陸續(xù)寫(xiě)關(guān)于springboot開(kāi)發(fā)常用功能的文章。 什么場(chǎng)景下會(huì)要使用到websocket的呢? websocket主要功能就是實(shí)現(xiàn)網(wǎng)絡(luò)通訊,比如說(shuō)最經(jīng)典的客服聊天窗口、您有新的消息通知,或者是項(xiàng)目與

    2024年02月13日
    瀏覽(25)
  • JAVA使用WebSocket實(shí)現(xiàn)多客戶端請(qǐng)求

    工作前提:兩個(gè)服務(wù)之間實(shí)現(xiàn)聊天通訊,因?yàn)榻橛趦蓚€(gè)服務(wù),兩個(gè)客戶端 方案1:多個(gè)服務(wù)端,多個(gè)客戶端,使用redis把用戶數(shù)據(jù)ip進(jìn)行存儲(chǔ),交互拿到redis數(shù)據(jù)進(jìn)行推送 方案2: 一個(gè)服務(wù)端,多個(gè)客戶端,拿到客戶端的id和需要推送的id進(jìn)行拼接存儲(chǔ) 此文章使用的是方案2 1. 引

    2024年02月11日
    瀏覽(17)
  • 實(shí)現(xiàn)c++輕量級(jí)別websocket協(xié)議客戶端

    實(shí)現(xiàn)c++輕量級(jí)別websocket協(xié)議客戶端

    因以前發(fā)過(guò)這個(gè)代碼,但是一直沒(méi)有整理,這次整理了一下,持續(xù)修改,主要是要使用在arm的linux上,發(fā)送接收的數(shù)據(jù)壓縮成圖片發(fā)送出去。 要達(dá)到輕量websocket 使用,必須要達(dá)到幾個(gè)方面才能足夠簡(jiǎn)單, 1、不用加入其他的庫(kù) 2、只需要使用頭文件包含就可以 3、跨平臺(tái) 如果

    2024年02月12日
    瀏覽(22)
  • Java WebSocket 獲取客戶端 IP 地址

    在開(kāi)發(fā) Web 應(yīng)用程序時(shí),我們通常需要獲取客戶端的 IP 地址用于日志記錄、身份驗(yàn)證、限制訪問(wèn)等操作。當(dāng)使用 WebSocket 協(xié)議時(shí),我們可以使用 Java WebSocket API 來(lái)獲取客戶端的 IP 地址。 本文將介紹如何使用 Java WebSocket API 獲取客戶端 IP 地址,以及如何在常見(jiàn)的 WebSocket 框架中

    2024年02月05日
    瀏覽(27)
  • C# WebSocket 客戶端 使用 TouchSocket WebSocketClient

    由于涉及到連接某音的彈幕數(shù)據(jù),所以需要WebSocket,百度了一圈,有C#原生的WebSocket,看了看,看不懂,無(wú)奈換一個(gè),TouchSocket來(lái)到了我的面前,網(wǎng)上對(duì)于這個(gè)插件的評(píng)價(jià)較高,所以使用之。結(jié)果,一堆問(wèn)題之。唉。抄襲這么難嗎? 如果由TouchSocket開(kāi)發(fā)服務(wù)端,并且用TouchSoc

    2024年02月12日
    瀏覽(15)
  • EMQ X(3):客戶端websocket消息收發(fā)

    EMQ X(3):客戶端websocket消息收發(fā)

    在EMQ X Broker提供的 Dashboard 中 TOOLS 導(dǎo)航下的 Websocket 頁(yè)面提供了一個(gè)簡(jiǎn)易但有效的WebSocket 客戶端工具,它包含了連接、訂閱和發(fā)布功能,同時(shí)還能查看自己發(fā)送和接收的報(bào)文數(shù)據(jù),我們期望 它可以幫助您快速地完成某些場(chǎng)景或功能的測(cè)試驗(yàn)證: MQTT是為了物聯(lián)網(wǎng)場(chǎng)景設(shè)計(jì)的基

    2024年02月13日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包