C#如何使用Socket实现本地多人聊天室
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章主要介绍C#如何使用Socket实现本地多人聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!【脚本一:Server端】使用本机地址:127.0.0.1完整代码usi
千家信息网最后更新 2024年11月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安全错误
数据库的锁怎样保障安全
超级梦网络技术有限公司
服务器软件迁移
网络安全等级保护管理系统
cast在数据库中是什么作用
金山区网络技术转让哪家便宜
上海ios软件开发服务
数据库安全百度经验
网安大队加强网络安全会议
山东常用的外贸软件开发公司
网络安全周在内容和形式上
网络安全法受到刑事几年内
soc软件开发工程师西安
mysql数据库教学文档
对客户机服务器的理解
分布式网络技术原理
应用软件开发比赛
街道信息网络安全整改情况报告
临朐天气预报软件开发
数据库在哪里
HPkvm怎么切换服务器
qt健康管理系统数据库
拼客网络安全培训
mysql数据库硬件需求
兴融网络技术
永恒之巅什么时间开新服务器
ACI网络技术
河南工业软件开发价位
中国第一家公司服务器
怎么分离数据库热数据
网络安全责任落实文件