文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#如何基于Socket实现多人聊天功能

2023-06-29 03:58

关注

这篇文章主要介绍C#如何基于Socket实现多人聊天功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

具体内容如下

服务器

服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户。

代码:

using System;using System.Collections.Generic;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;namespace ChatRoomService{    class Service    {        Socket socketSevice ;        List<Socket> userList;//用户组        public Service()        {           socketSevice = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);           userList = new List<Socket>();        }        public void  Start()        {            socketSevice.Bind(new IPEndPoint(IPAddress.Any,5566));            socketSevice.Listen(10);            Console.WriteLine("服务器启动成功");            //开启接受连接,用多线程            Thread accThread = new Thread(Accept);            accThread.IsBackground = true;            accThread.Start();        }        private void Accept()        {            //接受连接            Socket clientSocket = socketSevice.Accept();            userList.Add(clientSocket);            //打印已经连接IP地址            Console.WriteLine(IPToAddress(clientSocket)+"连接进来了");            //            Thread RecvThread = new Thread(ReceMessage);            RecvThread.IsBackground = true;            RecvThread.Start(clientSocket);            Accept();//递归        }        //接收客户端信息        private void ReceMessage(Object obj)        {            Socket client = obj as Socket;            byte[] strByte = new byte[1024 * 1024];//设定接受字符的长度            string str = "";            try            {              int len = client.Receive(strByte);//接受用户发送的内容              str = Encoding.Default.GetString(strByte, 0, len);              Broadcast(str,client);//广播给用户              Console.WriteLine(str);             }             catch (Exception e)             {                Console.WriteLine(IPToAddress(client)+"退出");                userList.Remove(client);                Thread.CurrentThread.Abort();//退出时掐死线程,不然递归反弹            }           ReceMessage(client); //使用递归        }        /// <summary>        /// 广播信息        /// </summary>        /// <param name="useStr">传入收到的传输的内容</param>        /// <param name="obj">传送信息的客户</param>        private void Broadcast(string userStr,object obj)        {            Socket clientSend = obj as Socket; //当前发送信息的客户            foreach (Socket client in userList)            {                if (client != clientSend)//将信息广播给其他用户                {                    client.Send(Encoding.Default.GetBytes(IPToAddress(clientSend)+":"+userStr));                }            }        }        //转换出连来客户的IP地址        private string IPToAddress(Socket soket)        {            return (soket.RemoteEndPoint as IPEndPoint).Address.ToString();        }    }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ChatRoomService{    class Program    {        static void Main(string[] args)        {            Service ss = new Service();            ss.Start();            Console.ReadLine();        }    }}

客户端

客户端的功能开始十分简单,可以发送信息给服务器。也可以接收服务器转发过来其他客户端的信息。

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;namespace ChatRoom{    class ClientRoom    {        Socket clientSocket;        public ClientRoom()        {            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化服务器        }        /// <summary>        /// 连接服务器        /// </summary>        /// <param name="Ip"></param>        /// <param name="port"></param>        public void Connected(string Ip,int port)        {            clientSocket.Connect(Ip,port);            Console.WriteLine("连接成功");            // ClientSocket.Bind(new IPEndPoint());            Thread RecvThread = new Thread(RecvMessage);            RecvThread.IsBackground = true;            RecvThread.Start();        }       public void Send(String str)        {            clientSocket.Send(Encoding.Default.GetBytes(str));        }        /// <summary>        /// 接受信息        /// </summary>        private void RecvMessage()        {            try            {                byte[] strByte = new byte[500 * 1024];                int len = clientSocket.Receive(strByte);                Console.WriteLine(Encoding.Default.GetString(strByte, 0, len));            }            catch (Exception e) //服务器关闭            {                Console.WriteLine("服务器关闭");                Thread.CurrentThread.Abort();//关闭时切断进程            }            RecvMessage();        }            }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ChatRoom{    class Program    {        static void Main(string[] args)        {            ClientRoom client = new ClientRoom();            client.Connected("127.0.0.1", 5566);            string str = Console.ReadLine();            while (!str.Equals("q"))            {                client.Send(str);                str = Console.ReadLine();            }            Console.ReadLine();        }    }}

可以正常对话,测试一下。假装和自己对话

C#如何基于Socket实现多人聊天功能

目前还没有解决沾包问题

以上是“C#如何基于Socket实现多人聊天功能”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯