C#如何使用Socket实现本地多人聊天室
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要介绍C#如何使用Socket实现本地多人聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!【脚本一:Server端】使用本机地址:127.0.0.1完整代码usi
千家信息网最后更新 2025年11月08日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; Dictionary cliDic = 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安全错误
数据库的锁怎样保障安全
api数据库管理
服务器显卡支持什么格式
网络安全设备认证目录
如何避免并发修改数据库
acle数据库查询
服务器cpu物理核数
电脑软件用啥软件开发的
华为华三服务器类产品市场行情
熟悉数据库管理以及网络应用
中国的vpn服务器地址
计算机网络安全入门教程
先做数据库还是先写PHP
什么制度是国家网络安全
软件开发缺陷及问题处理规程
校园安全网络安全班会记录
数据库查询每个考生的总成绩
戴尔e08s服务器价格
三门峡市桔子网络技术有限公司
梦达数据库
安徽系统软件开发培训
软件开发类课题人员分工
tis服务器怎么样
一个辅助软件开发价格
辽宁通信软件开发价格检测中心
青少年网络安全漫画图片
idea的数据库驱动下载
用什么软件管理视频和数据库
软件开发缺陷及问题处理规程
沈阳新联网络技术
数据库有哪些字符类型