C# WebSocket使用源码(服务端+客户端)

记录一波,C#实现服务端及客户端(HTML及C#演示)

C#WebSocket服务端采用Fleck库,直接NuGet程序包引用。(默认是长连接,不发心跳也不断开连接)

public partial class Main : Form
    {
        private Dictionary<String, IWebSocketConnection> allSockets;
        public Main()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false; //指定不再捕获对错误线程的调用  非线程安全                   
            InitWs();
        }

        private void InitWs()
        {

            FleckLog.Level = LogLevel.Debug;
            allSockets = new Dictionary<String, IWebSocketConnection>();
            var server = new WebSocketServer("ws://0.0.0.0:7777");
            server.RestartAfterListenError = true;
            server.Start(socket =>
            {
                socket.OnOpen = () =>
                {
                    //获取客户端网页的url  
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    allSockets.Add(clientUrl, socket);
                    BoxAddInfo(DateTime.Now.ToString() + "|服务器:与客户端:" + clientUrl + " 建立WebSock连接!\r\n");
                };
                socket.OnClose = () =>
                {
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    BoxAddInfo(DateTime.Now.ToString() + "|服务器:与客户端:" + clientUrl + " 断开WebSock连接!\r\n");
                    allSockets.Remove(clientUrl);
                };
                socket.OnMessage = message =>
                {
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    BoxAddInfo(DateTime.Now.ToString() + "|服务器:【收到】客户端:" + clientUrl + "的信息:" + message + "\r\n");
                    Thread parameterizedThread = new Thread(new ParameterizedThreadStart(DoWorkWithParam));
                    Dictionary<String, String> da = new Dictionary<String, String>();
                    da.Add("clientUrl", clientUrl);
                    da.Add("message", message);
                    parameterizedThread.IsBackground = true; //后台线程
                    parameterizedThread.Start(da);
                };
            });
        }

        public void DoWorkWithParam(object o)
        {
            Dictionary<string, string> dictionary = (Dictionary<string, string>)o;
            string clientUrl = dictionary["clientUrl"];
            string message = dictionary["message"];
            Thread.Sleep(5000);
            allSockets[clientUrl].Send("5秒------" + message);
        }

        private void BoxAddInfo(String massage)
        {
            textBox1.Text += massage;
        }

        private void Main_FormClosing(object sender, FormClosingEventArgs e)
        {
            //关闭与客户端的所有的连接
            /*
            foreach (var socket in allSockets.Values)
            {
                socket.Send("服务关闭!");
            }
            */

            foreach (var item in allSockets.Values)
            {
                if (item != null)
                {
                    item.Close();
                }
            }          
        }
}

C#WebSocket客户端采用webSocket4Net库,直接NuGet程序包引用。代码中采用事件委托,当有结果返回时执行业务代码使用如下:

        private WebSocketService webSocket;

        webSocket = (Application.Current as App).webSocket;
        webSocket.Alarm += new WebSocketService.AlarmEventHandler(WebSocket_Alarm);

        private void WebSocket_Alarm(string sender){

              //业务代码

        }

   public partial class WebSocketService
    {
        public delegate void AlarmEventHandler(string sender); //声明关于事件的委托,参数为要回传的数据类型
        public event AlarmEventHandler Alarm; //声明事件
        private WebSocket webSocket4Net = null;

        public WebSocketService()
        {
            if (webSocket4Net == null)
            {
                webSocket4Net = new WebSocket("ws://192.168.110.110:7777");
                webSocket4Net.Opened += WebSocket4Net_Opened;
                webSocket4Net.MessageReceived += WebSocket4Net_MessageReceived;
                webSocket4Net.Open();
            }
        }

        public void ClientSendMsgToServer(object message)
        {
            webSocket4Net.Send(message.ToString());
        }
        public void ClientReceiveMsgToServer(string message)
        {
            this.Alarm(message);
        }

        private void WebSocket4Net_MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            this.ClientReceiveMsgToServer(e.Message);
        }

        private void WebSocket4Net_Opened(object sender, EventArgs e)
        {
            //webSocket4Net.Send($"客户端准备发送数据!");
        }
    }

HTML中使用:

<!DOCTYPE html>  
  
<html lang="cn" xmlns="http://www.w3.org/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:7777/");  
            webSocket.onopen = WebSokectOnOpen;  
            webSocket.onmessage = WebSocketOnMessage;  
            webSocket.onclose = WebSocketOnClose;  
        };  
  
        //建立连接事件  
        function WebSokectOnOpen() {  
            alert("已经打开连接!");  
        };  
  
        //监听事件  
        function WebSocketOnMessage(event) {  
            //监听来自客户端的数据  
            alert(event.data);  
			document.getElementById("Text2").value = event.data;  
        };  
  
        function WebSocketOnClose() {  
            //监听来自客户端的数据  
            alert('和服务器断开连接');  
        };  
  
        //发送事件  
        function WebSocketSendMsg() {  
            //获取text中的值  
            var text = document.getElementById("Text1").value;  
            //发送到服务器  
            webSocket.send(text);  
			document.getElementById("Text2").value = "通信中";  
        };  
    </script>  
</head>  
<body onload="CreateWebSocket()">  
    <div class="div1">  
        <h4>WebSocket通信</h4>  
        <input type="text" id="Text1" />  
        <input type="button" onclick="WebSocketSendMsg()" value="发送数据" /> 
		<input type="text" id="Text2" />  
    </div>  
</body>  
</html>  

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用websocket服务端代码,需要用到以下几个步骤:1. 创建websocket实例,用来连接服务端客户端;2. 添加服务端的回调函数,当客户端发送消息时,服务端就会收到消息;3. 向客户端发送消息;4. 关闭websocket连接。使用websocket客户端代码,需要用到以下几个步骤:1. 创建websocket实例,用来连接服务端客户端;2. 添加客户端的回调函数,当服务端发送消息时,客户端就会收到消息;3. 向服务端发送消息;4. 关闭websocket连接。 ### 回答2: 使用WebSocket编写服务端客户端代码是一种实现实时双向通信的方式。以下是一个简单的示例: 服务端代码: ```python import asyncio import websockets async def handle(websocket, path): while True: message = await websocket.recv() print(f"Received message: {message}") await websocket.send(f"Server received: {message}") async def start_server(): server = await websockets.serve(handle, "localhost", 8000) print("Server started on ws://localhost:8000") await server.wait_closed() asyncio.run(start_server()) ``` 客户端代码: ```python import asyncio import websockets async def send_message(message): async with websockets.connect("ws://localhost:8000") as websocket: await websocket.send(message) response = await websocket.recv() print(f"Received response: {response}") asyncio.run(send_message("Hello server!")) ``` 在服务端代码中,我们使用`websockets`模块创建一个WebSocket服务器,并定义了一个`handle`函数来处理接收到的消息。该函数通过`await websocket.recv()`接收客户端发送的消息,并使用`await websocket.send()`向客户端发送响应消息。 在客户端代码中,我们使用`websockets`模块创建一个WebSocket连接,并使用`await websocket.send()`向服务端发送消息。使用`await websocket.recv()`接收服务端的响应消息,并输出到控制台。 以上是一个简单的WebSocket服务端客户端代码示例,可以通过运行这两个代码来实现双向通信。 ### 回答3: 使用WebSocket编写服务端客户端代码如下: 服务端代码: ``` import asyncio import websockets # 定义WebSocket服务器的处理逻辑 async def server_handler(websocket, path): # 接收客户端的消息 while True: message = await websocket.recv() print(f"收到消息:{message}") # 发送消息给客户端 response = f"已收到你的消息:{message}" await websocket.send(response) # 启动WebSocket服务器 start_server = websockets.serve(server_handler, 'localhost', 8000) # 开始事件循环 asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() ``` 客户端代码: ``` import asyncio import websockets # 定义WebSocket客户端的处理逻辑 async def client_handler(): async with websockets.connect('ws://localhost:8000') as websocket: # 发送消息给服务端 message = input("请输入消息:") await websocket.send(message) print(f"发送消息:{message}") # 接收服务端的消息 response = await websocket.recv() print(f"收到服务端的响应:{response}") # 执行WebSocket客户端逻辑 asyncio.get_event_loop().run_until_complete(client_handler()) ``` 以上是一个简单的WebSocket服务端客户端代码示例。服务端使用`websockets`库创建一个WebSocket服务器,通过定义`server_handler()`函数来处理来自客户端的消息,并将响应返回给客户端客户端使用`websockets`库建立与服务端的连接,通过定义`client_handler()`函数来向服务端发送消息,并接收服务端的响应。请注意,服务端客户端的代码分别运行在不同的程序中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值