C# WebSocket实现简易聊天室

背景

之前出了一期Tcp通讯教程,那个是关于PC端跟PC端通信的,这一期是PC端跟浏览器通信的,底层上来说其实基于Tcp通讯协议。

开始

1.建立控制台应用程序,框架选择4.7.2

2.进入Nuget安装Fleck库

3.修改Program.cs代码

using System;
using System.Collections.Concurrent;
using Fleck;

namespace CSharp_WebSocket_Demo
{
    class Program
    {

        static void Main(string[] args)
        {
            //服务器地址
            string ip = "127.0.0.1";
            //服务端口
            int port = 80;

            //多线程安全的字典,存储客户端
            //键:客户端ip:port
            //值:客户端对象
            ConcurrentDictionary<string, IWebSocketConnection> webSocketConnectionDictionary = new ConcurrentDictionary<string, IWebSocketConnection>();

            //服务端
            WebSocketServer webSocketServer = new WebSocketServer($"ws://{ip}:{port}");

            //出错后自动重启
            webSocketServer.RestartAfterListenError = true;

            //开启服务
            webSocketServer.Start(socket =>
            {
                string key = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;

                //客户端连接上事件
                socket.OnOpen = () =>
                {
                    Console.WriteLine($"客户端【{key}】连接上服务器");
                    //尝试添加到字典中
                    webSocketConnectionDictionary.TryAdd(key, socket);
                    Console.WriteLine($"当前客户端连接数:{webSocketConnectionDictionary.Count}");
                };

                //服务关闭事件
                socket.OnClose = () =>
                {
                    Console.WriteLine($"客户端【{key}】断开连接");
                    //尝试从字典中移除
                    webSocketConnectionDictionary.TryRemove(key, out _);
                    Console.WriteLine($"当前客户端连接数:{webSocketConnectionDictionary.Count}");
                };

                //服务器出错事件
                socket.OnError = (Exception e) =>
                {
                    Console.WriteLine($"客户端【{key}】连接出错");
                    //尝试从字典中移除
                    webSocketConnectionDictionary.TryRemove(key, out _);
                    Console.WriteLine($"当前客户端连接数:{webSocketConnectionDictionary.Count}");
                };

                //服务器接到客户端消息事件
                socket.OnMessage = (string msg) =>
                {
                    Console.WriteLine($"客户端【{key}】发来消息:{msg}");

                    //给所有客户端返回该消息,实现聊天功能
                    foreach (IWebSocketConnection webSocketConnection in webSocketConnectionDictionary.Values)
                    {
                        try
                        {
                            webSocketConnection.Send($"【{key}】:msg");
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine($"尝试给{webSocketConnection.ConnectionInfo.ClientIpAddress}:{webSocketConnection.ConnectionInfo.ClientPort}发送消息发生异常");
                            Console.WriteLine(e.StackTrace);
                        }
                    }
                };
            });

            Console.WriteLine($"服务端开启 ws://{ip}:{port}");

            //防止程序一闪而过
            Console.ReadKey();
        }
    }
}

4.运行程序

5.客户端代码用HbuilderX运行

<!DOCTYPE html>
<html lang="en">
	<style>
		textarea {
			vertical-align: bottom;
		}

		#output {
			overflow: auto;
		}

		#output>p {
			overflow-wrap: break-word;
		}

		#output span {
			color: blue;
		}

		#output span.error {
			color: red;
		}
	</style>
	<body>
		<h2>WebSocket Test</h2>
		<textarea cols="60" rows="6"></textarea>
		<button>send</button>
		<div id="output"></div>
	</body>
	<script>
		// http://www.websocket.org/echo.html
		const button = document.querySelector("button");
		const output = document.querySelector("#output");
		const textarea = document.querySelector("textarea");
		const wsUri = "ws://127.0.0.1";
		const websocket = new WebSocket(wsUri);
		

		button.addEventListener("click", onClickButton);

		websocket.onopen = (e) => {
			writeToScreen("CONNECTED");
			doSend("连接服务器成功");
		};

		websocket.onclose = (e) => {
			writeToScreen("DISCONNECTED");
		};

		websocket.onmessage = (e) => {
			writeToScreen(`<span>RESPONSE: ${e.data}</span>`);
		};

		websocket.onerror = (e) => {
			writeToScreen(`<span class="error">ERROR:</span> ${e.data}`);
		};

		function doSend(message) {
			writeToScreen(`SENT: ${message}`);
			websocket.send(message);
		}

		function writeToScreen(message) {
			output.insertAdjacentHTML("afterbegin", `<p>${message}</p>`);
		}

		function onClickButton() {
			const text = textarea.value;

			text && doSend(text);
			textarea.value = "";
			textarea.focus();
		}
	</script>
</html>

 

 6.发送消息试一试

测试成功

源码

码云连接【CSharp WebSocket Demo: 使用C#建立WebSocket服务器,调用了大佬的Fleck库,实现了一个简单的聊天室】 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java WebSocket是一种用于实现双向通信的网络协议,可以帮助我们实现简易聊天室。下面是一个基于Java WebSocket实现简易聊天室的示例代码: 首先,我们需要定义一个WebSocket处理程序: ```java @ServerEndpoint("/chat") public class ChatEndpoint { private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>()); @OnOpen public void onOpen(Session session) { sessions.add(session); } @OnMessage public void onMessage(String message, Session session) throws IOException { for (Session s : sessions) { // 过滤自己 if (!s.equals(session)) { s.getBasicRemote().sendText(message); } } } @OnClose public void onClose(Session session) { sessions.remove(session); } } ``` 在这个处理程序中,我们使用`@ServerEndpoint("/chat")`注解指定了WebSocket的端点,即`/chat`。在`onOpen`方法中,我们将新的会话添加到会话集合中。在`onMessage`方法中,我们将接收到的消息广播给所有其他会话。在`onClose`方法中,我们将关闭的会话从会话集合中移除。 接下来,我们需要在`web.xml`文件中配置WebSocket: ```xml <web-app> <display-name>WebSocket Chat</display-name> <servlet> <servlet-name>chat</servlet-name> <servlet-class>org.glassfish.tyrus.servlet.TyrusServlet</servlet-class> <init-param> <param-name>org.glassfish.tyrus.servlet.websocketClassnames</param-name> <param-value>com.example.ChatEndpoint</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>chat</servlet-name> <url-pattern>/chat/*</url-pattern> </servlet-mapping> </web-app> ``` 在这个配置中,我们使用了`org.glassfish.tyrus.servlet.TyrusServlet`作为WebSocket的Servlet。我们将`com.example.ChatEndpoint`指定为WebSocket处理程序的类名,并将其加载到`servlet`中。 现在,我们就可以在HTML页面中使用WebSocket来连接我们的聊天室了: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>WebSocket Chat</title> </head> <body> <input type="text" id="message"> <button onclick="send()">Send</button> <div id="output"></div> <script> var socket = new WebSocket('ws://localhost:8080/chat'); socket.onmessage = function (event) { var output = document.getElementById('output'); output.innerHTML += event.data + '<br>'; }; function send() { var message = document.getElementById('message').value; socket.send(message); } </script> </body> </html> ``` 在这个HTML页面中,我们创建了一个WebSocket连接到`ws://localhost:8080/chat`。当收到消息时,我们将其添加到页面上的`<div>`元素中。当点击发送按钮时,我们将输入框中的文本发送到WebSocket连接中。 这样,我们就完成了一个简易的Java WebSocket聊天室实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值