C#如何使用Socket实现本地多人聊天室
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍C#如何使用Socket实现本地多人聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!【脚本一:Server端】使用本机地址:127.0.0.1完整代码usi
千家信息网最后更新 2025年01月20日C#如何使用Socket实现本地多人聊天室
这篇文章主要介绍C#如何使用Socket实现本地多人聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
【脚本一:Server端】
使用本机地址:127.0.0.1
完整代码
using System;using System.Collections.Generic;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading; namespace ConsoleApp1{ public class Server { Socket mySocket = null; DictionarycliDic = new Dictionary (); public void Connect(int port) { string IP = "127.0.0.1"; //IPAddress IPAddress = IPAddress.Parse("127.0.0.1"); IPAddress address = IPAddress.Any; //创建IP终结点,把IP地址与端口绑定到网络终结点上 IPEndPoint endPoint = new IPEndPoint(address, port); //创建客户端套接字 mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ///监听套接字终结点 mySocket.Bind(endPoint); //服务端可接收客户端连接数量为无限个 mySocket.Listen(0); //开启线程监听客户端 Thread myThread = new Thread(Listen_Con); myThread.Start(); Console.WriteLine("开始监听..."); } /// /// 接收连接的客户端并存储客户端的信息 /// /// public void Listen_Con(Object obj) { Socket cliSocket = null; //持续监听客户端的请求 while (true) { try { cliSocket = mySocket.Accept(); } catch (Exception e) { Console.WriteLine(e.Message); } string cliEndPoint = cliSocket.RemoteEndPoint.ToString(); IPAddress cliAddress = (cliSocket.RemoteEndPoint as IPEndPoint).Address; int cliPort = (cliSocket.RemoteEndPoint as IPEndPoint).Port; cliDic.Add(cliAddress, cliSocket); string MsgStr = "[客户端结点:" + cliEndPoint + "\n+客户端IP:" + cliAddress.ToString() + "\n客户端端口:" + cliPort.ToString() + "\n已连接]"; byte[] MsgBytes = Encoding.UTF8.GetBytes(MsgStr); cliSocket.Send(MsgBytes); Thread rec_Cli = new Thread(Receive_Con); rec_Cli.Start(cliSocket); Thread sed_Cli = new Thread(SendToCli); sed_Cli.Start(cliSocket); } } ////// 接收已连接的客户端发送的消息 /// /// public void Receive_Con(Object socket) { Socket client = socket as Socket; while (true) { //创建大小为1024*1024的内存缓冲区(1M) byte[] recBytes = new byte[1024 * 1024]; //尝试把接收的字节存储到缓冲区 try { int length = client.Receive(recBytes); //把机器接收的字节数组转换为string string recMsg = Encoding.UTF8.GetString(recBytes, 0, length); //将服务器接收到的信息转发到所有已连接的客户端 if (cliDic.Count > 0) { foreach (var soc in cliDic) { soc.Value.Send(Encoding.UTF8.GetBytes("[" + soc.Value.RemoteEndPoint + "]:" + recMsg)); } } Console.WriteLine("[" + client.RemoteEndPoint + "]:" + recMsg); } catch (Exception) { cliDic.Remove((client.RemoteEndPoint as IPEndPoint).Address); //客户端断开的异常 Console.WriteLine("[客户端" + (client.RemoteEndPoint as IPEndPoint).Address + "已断开]"); Console.WriteLine("[客户端终结点:" + client.RemoteEndPoint+"]"); //断开套接字 client.Close(); break; } } } public void SendToCli(object obj) { Socket curCliSoc = obj as Socket; while (true) { byte[] ByteToAll = new byte[1024 * 1024]; try { string MsgToAll = Console.ReadLine(); ByteToAll = Encoding.UTF8.GetBytes("[服务端]:"+MsgToAll); curCliSoc.Send(ByteToAll); } catch(Exception) { Console.WriteLine("ERROR:" + curCliSoc.RemoteEndPoint + "已与服务端断开!"); curCliSoc.Close(); if(cliDic.ContainsKey((curCliSoc.RemoteEndPoint as IPEndPoint).Address)) { cliDic.Remove((curCliSoc.RemoteEndPoint as IPEndPoint).Address); } } } } } public class ServerMain { static void Main(string[] args) { Server s1 = new Server(); s1.Connect(8800); } }}
Server端运行结果:
【脚本二:Client端】
完整代码
using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading; namespace ConsoleApp1{ public class Client { string SerIP = "127.0.0.1"; Socket myClient = null; Thread ConnectThread = null; IPAddress SerAdd; IPEndPoint SerEP; public void Connect_To_Ser(int port) { myClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); SerAdd = IPAddress.Parse(SerIP); SerEP = new IPEndPoint(SerAdd, port); while (true) { try { myClient.Connect(SerEP); break; } catch { Console.WriteLine("无法连接到服务端,请重试..."); } } ConnectThread = new Thread(Receive_Ser); ConnectThread.Start(); } public void Receive_Ser() { while (true) { byte[] SerBytes = new byte[1024 * 1024]; try { int length = myClient.Receive(SerBytes); string Msg = Encoding.UTF8.GetString(SerBytes, 0, length); Console.WriteLine(Msg); } catch (Exception) { Console.WriteLine("已与服务端断开连接..."); break; } } } public void SendToSer() { while (true) { try { string SendMsg = Console.ReadLine(); myClient.Send(Encoding.UTF8.GetBytes(SendMsg)); } catch (Exception) { Console.WriteLine("[SendToSer]已断开连接"); break; } } } } public class ClienMain { static void Main(string[] Args) { Client c1 = new Client(); c1.Connect_To_Ser(8800); c1.SendToSer(); } }}
客户端运行效果:
①客户端先于服务端运行
②客户端迟于服务端运行
暂时总效果:
以上是"C#如何使用Socket实现本地多人聊天室"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
客户
客户端
服务
终结点
监听
运行
套接字
多人
聊天室
C#
代码
信息
内容
地址
字节
效果
端口
端的
篇文章
缓冲区
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
博途怎样连接数据库
vb如何判断成功连接数据库
数据库错误区域和语言
淅川软件开发文档
网络安全控制软件
sql数据库查看大小限制
怎么备份mysql数据库
接入网络技术名词解释
开张网络安全认证
广州花都网络安全
软件开发中写前端的叫什么
网络安全行业能做到35岁吗
c盘扩容后无法连接数据库
网络安全绝对不是难事
web缓存服务器和浏览器缓存
网络安全宣传周学习简报
软件开发人员痛点
服务器端口可以被不同程序多用吗
福建视频云空间功能服务器
党员网络安全规定
组态王历史数据库已停止工作
真机服务器迁移系统
济南服务好的浪潮服务器销售
软件开发有限公司
数据库中怎么查看数据表中字段
心理网络安全教育教案
育碧play无法连接服务器
网络安全绝对不是难事
有诚信的软件开发培训
格兰仕软件开发岗