基于C#实现窗体Websocket服务端代码(可配合UnityWebsocket使用)

1.新建WebSocketService.cs

代码如下

using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

internal class WebSocketService
{
    HttpListener m_httpListener;                
    private WebSocket m_webSocket;             
    public event EventHandler<string> m_DataReceive; 
    private bool m_isDoThread;             

    public void Listening()
    {
        Console.WriteLine("正在监听...");
        //监听Ip、端口
        m_httpListener = new HttpListener();
        m_httpListener.Prefixes.Add("http://127.0.0.1:8888/");  
        m_httpListener.Start();
        var httpListenContext = m_httpListener.GetContext();    
        var webSocketContext = httpListenContext.AcceptWebSocketAsync(null);
        m_webSocket = webSocketContext.Result.WebSocket;

        m_isDoThread = true;
        //开启后台线程,持续接收客户端消息
        Task.Run(() =>
        {
            while (m_isDoThread)
            {
                //接收消息
                string msg = Receive(m_webSocket);
                if (msg != null)
                {
                    m_DataReceive?.Invoke(m_webSocket, msg);  //数据处理
                }
            }
            Console.WriteLine("接收信息线程结束。");
        });
        Console.WriteLine("连接建立成功!");
    }

    /// <summary>
    /// 发送信息
    /// </summary>
    /// <param name="content">发送的内容</param>
    public void Send(string content)
    {
        //同客户端,WebSocketState要求
        if (m_webSocket != null && (m_webSocket.State == WebSocketState.Open || m_webSocket.State == WebSocketState.CloseReceived))
        {
            ArraySegment<byte> array = new ArraySegment<byte>(Encoding.UTF8.GetBytes(content)); 
            var task = m_webSocket.SendAsync(array, WebSocketMessageType.Binary, true, CancellationToken.None);   
            task.Wait();        
            Console.WriteLine("发送了一个消息到客户端。");
        }
    }

    /// <summary>
    /// 接收信息
    /// </summary>
    /// <param name="webSocket"></param>
    /// <returns></returns>
    private string Receive(WebSocket webSocket)
    {
        if (webSocket != null && (webSocket.State == WebSocketState.Open || webSocket.State == WebSocketState.CloseSent))
        {
            byte[] arrry = new byte[1024];  
            ArraySegment<byte> buffer = new ArraySegment<byte>(arrry);
            var task = webSocket.ReceiveAsync(buffer, CancellationToken.None);
            task.Wait();

            Console.WriteLine("当前socket状态:" + webSocket.State);
            if (webSocket.State == WebSocketState.CloseReceived || task.Result.MessageType == WebSocketMessageType.Close)
            {
                webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Acknowledge Close frame", CancellationToken.None);
                Console.WriteLine("当前socket状态:" + webSocket.State);
                Console.WriteLine("连接已断开。");
                m_isDoThread = false;

                return null;
            }
            return Encoding.UTF8.GetString(buffer.Array, 0, task.Result.Count);
        }
        else
        {
            return null;
        }
    }
}

2.新建Program.cs

代码如下:


using System;
using System.Threading.Tasks;

internal class Program
{
    //创建一个WebSocketService
    private static WebSocketService m_serviceSocket;
    static void Main(string[] args)
    {
        //开启后台线程,监听客户端连接
        Task.Run(() =>
        {
            m_serviceSocket = new WebSocketService();           
            m_serviceSocket.m_DataReceive += HandleDataRecive;    
            m_serviceSocket.Listening();                       
        });


        while (true)
        {
            //输入内容,发送消息到客户端
            string msg = Console.ReadLine();
            m_serviceSocket.Send(msg);
        }
    }

    /// <summary>
    /// 消息事件处理函数
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private static void HandleDataRecive(object sender, string e)
    {
        Console.WriteLine("接收的客户端消息:" + e);
    }
}

可根据具体使用场景进行修改,目前只实现了消息的收发

可结合Unitywebsocket进行搭配使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值