C#中怎么用websocket实现简易聊天功能
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"C#中怎么用websocket实现简易聊天功能",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#中怎么用websocket实现简易聊天功
千家信息网最后更新 2025年01月19日C#中怎么用websocket实现简易聊天功能
本篇内容主要讲解"C#中怎么用websocket实现简易聊天功能",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#中怎么用websocket实现简易聊天功能"吧!
前言
使用C#语言进行开发,基于.NET FrameWork4
功能包含群聊,和私聊
界面
界面设计代码
namespace chat_server{ partial class Form1 { ////// 必需的设计器变量。 /// private System.ComponentModel.IContainer components = null; ////// 清理所有正在使用的资源。 /// /// 如果应释放托管资源,为 true;否则为 false。 protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows 窗体设计器生成的代码 ////// 设计器支持所需的方法 - 不要修改 /// 使用代码编辑器修改此方法的内容。 /// private void InitializeComponent() { this.textBoxIP = new System.Windows.Forms.TextBox(); this.labelIP = new System.Windows.Forms.Label(); this.labelPort = new System.Windows.Forms.Label(); this.textBoxPort = new System.Windows.Forms.TextBox(); this.buttonStart = new System.Windows.Forms.Button(); this.textBoxLog = new System.Windows.Forms.TextBox(); this.textBoxMsg = new System.Windows.Forms.TextBox(); this.buttonSend = new System.Windows.Forms.Button(); this.SuspendLayout(); // // textBoxIP // this.textBoxIP.Location = new System.Drawing.Point(145, 25); this.textBoxIP.Name = "textBoxIP"; this.textBoxIP.Size = new System.Drawing.Size(100, 25); this.textBoxIP.TabIndex = 0; this.textBoxIP.Text = "127.0.0.1"; // // labelIP // this.labelIP.AutoSize = true; this.labelIP.Location = new System.Drawing.Point(90, 28); this.labelIP.Name = "labelIP"; this.labelIP.Size = new System.Drawing.Size(31, 15); this.labelIP.TabIndex = 1; this.labelIP.Text = "IP:"; // // labelPort // this.labelPort.AutoSize = true; this.labelPort.Location = new System.Drawing.Point(371, 28); this.labelPort.Name = "labelPort"; this.labelPort.Size = new System.Drawing.Size(54, 15); this.labelPort.TabIndex = 3; this.labelPort.Text = "port:"; // // textBoxPort // this.textBoxPort.Location = new System.Drawing.Point(452, 25); this.textBoxPort.Name = "textBoxPort"; this.textBoxPort.Size = new System.Drawing.Size(100, 25); this.textBoxPort.TabIndex = 2; this.textBoxPort.Text = "6666"; // // buttonStart // this.buttonStart.Location = new System.Drawing.Point(718, 13); this.buttonStart.Name = "buttonStart"; this.buttonStart.Size = new System.Drawing.Size(142, 45); this.buttonStart.TabIndex = 4; this.buttonStart.Text = "开启服务"; this.buttonStart.UseVisualStyleBackColor = true; this.buttonStart.Click += new System.EventHandler(this.buttonStart_Click); // // textBoxLog // this.textBoxLog.Location = new System.Drawing.Point(28, 73); this.textBoxLog.Multiline = true; this.textBoxLog.Name = "textBoxLog"; this.textBoxLog.Size = new System.Drawing.Size(832, 406); this.textBoxLog.TabIndex = 5; // // textBoxMsg // this.textBoxMsg.Location = new System.Drawing.Point(28, 499); this.textBoxMsg.Name = "textBoxMsg"; this.textBoxMsg.Size = new System.Drawing.Size(653, 25); this.textBoxMsg.TabIndex = 6; // // buttonSend // this.buttonSend.Location = new System.Drawing.Point(761, 499); this.buttonSend.Name = "buttonSend"; this.buttonSend.Size = new System.Drawing.Size(99, 43); this.buttonSend.TabIndex = 7; this.buttonSend.Text = "发送"; this.buttonSend.UseVisualStyleBackColor = true; this.buttonSend.Click += new System.EventHandler(this.buttonSend_Click); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(947, 567); this.Controls.Add(this.buttonSend); this.Controls.Add(this.textBoxMsg); this.Controls.Add(this.textBoxLog); this.Controls.Add(this.buttonStart); this.Controls.Add(this.labelPort); this.Controls.Add(this.textBoxPort); this.Controls.Add(this.labelIP); this.Controls.Add(this.textBoxIP); this.Name = "Form1"; this.Text = "服务器"; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox textBoxIP; private System.Windows.Forms.Label labelIP; private System.Windows.Forms.Label labelPort; private System.Windows.Forms.TextBox textBoxPort; private System.Windows.Forms.Button buttonStart; private System.Windows.Forms.TextBox textBoxLog; private System.Windows.Forms.TextBox textBoxMsg; private System.Windows.Forms.Button buttonSend; }}
源代码
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Windows.Forms;namespace chat_server{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } // socket连接容器 DictionaryuserContain = new Dictionary (); private void buttonStart_Click(object sender, EventArgs e) { try { //1、创建socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //2、绑定ip和端口 String ip = textBoxIP.Text; int port = Convert.ToInt32(textBoxPort.Text); socket.Bind(new IPEndPoint(IPAddress.Parse(ip), port)); //3、开启监听 socket.Listen(10);//等待连接队列的最大值 //4、开始接受客户端的链接 ThreadPool.QueueUserWorkItem(new WaitCallback(connect), socket); } catch { MessageBox.Show("启动服务器失败"); } } private void connect(object socket) { var serverSockert = socket as Socket;//强制转换 showLog("服务器正常启动,开始接受客户端的数据"); byte[] data = new byte[1024]; int len; String name; //客户端的用户名 while (true) { try { var proxSocket = serverSockert.Accept();//接受连接 len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);//接受客户端的用户名 name = Encoding.Default.GetString(data, 0, len); showLog(String.Format("客户端 {0} 用户名 {1} 连接服务器", proxSocket.RemoteEndPoint.ToString(),name)); String msg = String.Format("用户{0}上线了", name); sendMsg(msg); userContain[proxSocket] = name;//把对象放入集合中 //不停的接受当前链接的客户端发送的消息 ThreadPool.QueueUserWorkItem(new WaitCallback(this.recevie), proxSocket); } catch { MessageBox.Show("接受异常"); break; } } } private void recevie(object socket) { var proxSocket = socket as Socket; byte[] data = new byte[1024 * 1024];//接受,发送数据缓冲区 String msg; int len = 0; // 数据长度 String name = userContain[proxSocket]; // 客户端名字 while (true) { try { len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None); } catch { msg = String.Format("客户端{0}异常退出", proxSocket.RemoteEndPoint.ToString()); showLog(msg); msg = String.Format("用户{0}下线了", name); sendMsg(msg); userContain.Remove(proxSocket); stopConnect(proxSocket); return; } if (len <= 0) { //客户端正常退出 msg = String.Format("客户端{0}正常退出", proxSocket.RemoteEndPoint.ToString()); showLog(msg); msg = String.Format("用户{0}下线了", name); sendMsg(msg); userContain.Remove(proxSocket); stopConnect(proxSocket); return;//结束当前接受客户端数据的异步线程 } //接受消息 msg = Encoding.Default.GetString(data, 0, len); //私聊信息格式@name:msg //name 为用户名 msg 为消息 bool flag = true; if (msg.StartsWith("@")) { int index = msg.IndexOf(":"); String targetName = msg.Substring(1, index-1); msg = msg.Substring(index + 1); foreach(var user in userContain) { if(targetName.Equals(user.Value)&&user.Key.Connected) { msg = String.Format("用户{0} 单独对你说:{1}",name,msg); data = Encoding.Default.GetBytes(msg); user.Key.Send(data, 0, data.Length, SocketFlags.None); flag = false; break; } } } if (flag) { msg = String.Format("用户{0}:{1}", name, msg); sendMsg(msg); } } } private void stopConnect(Socket socket) { try { if (socket.Connected) { socket.Shutdown(SocketShutdown.Both); socket.Close(100); } } catch { } } private void showLog(String msg) { if (textBoxLog.InvokeRequired) { //如果是跨线程访问 textBoxLog.Invoke(new Action ( s => { this.textBoxLog.Text += msg+"\r\n"; }),msg); } else { this.textBoxLog.Text += msg; } } private void buttonSend_Click(object sender, EventArgs e) { //发送消息 String msg = String.Format("服务器发布通知信息{0}", textBoxMsg.Text); sendMsg(msg); } private void sendMsg(String msg) { byte[] data = new byte[1024 * 1024]; data = Encoding.Default.GetBytes(msg); foreach (var user in userContain) { if (user.Key.Connected) { user.Key.Send(data, 0, data.Length, SocketFlags.None); } } } }}
到此,相信大家对"C#中怎么用websocket实现简易聊天功能"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
客户
用户
客户端
服务
服务器
功能
C#
数据
消息
用户名
端的
设计
简易
代码
内容
下线
信息
方法
界面
线程
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全的上市公司科技版
java版服务器地图导出
阳泉技校软件开发专业
景区网络安全管理手册
服务器的辐射测试
新倩女幽魂装备强化数据库
长春青网络技术有限公司招聘
oa服务器什么牌子好
7号信令网络安全
聊城市技能大赛网络安全
cod6怎么加服务器
云服务器100m
cms32软件开发
江西省网络安全教育会议
数据库生成一列顺序增量
实时监控服务器温度
软件开发为什么会被苹果查封
河南省朗泰网络技术公司
国外服务器租用第一品牌
腾讯软件开发编程题
北大青鸟网络技术学校
app与服务器连接超时
河南搜客网络技术有限公司
僵尸工程服务器已停止
涿鹿网络安全宣传周
我的世界起床服务器ip
招聘人的有哪些软件开发
网络安全的路线
网络安全专业知识结构
金税盘安全服务器地址福建省