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

 更新时间:2022年02月11日 07:49:27   作者:以前是少年  
这篇文章主要为大家详细介绍了C#基于Socket实现多人聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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# 中使用隐式和显式操作符的示例

    C# 中使用隐式和显式操作符的示例

    这篇文章主要介绍了C# 中使用隐式和显式操作符的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • C# 中 System.Index 结构体和 Hat 运算符(^)的使用示例

    C# 中 System.Index 结构体和 Hat 运算符(^)的使用示例

    这篇文章主要介绍了C# 中 System.Index 结构体和 Hat 运算符(^)的使用示例,帮助大家更好的理解和使用C#,感兴趣的朋友可以了解下
    2020-09-09
  • 通过C#实现获取PDF页面大小、方向和旋转角度

    通过C#实现获取PDF页面大小、方向和旋转角度

    在处理PDF文件时,了解页面的大小、方向和旋转角度等信息对于PDF的显示、打印和布局设计至关重要,本文将介绍如何使用免费.NET 库通过C#来读取PDF页面的这些属性,需要的朋友可以参考下
    2024-08-08
  • Unity3D实现批量下载图片功能

    Unity3D实现批量下载图片功能

    这篇文章主要为大家详细介绍了Unity3D实现批量下载图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • C#利用OpenCvSharp实现玉米粒计数

    C#利用OpenCvSharp实现玉米粒计数

    这篇文章主要为大家详细介绍了C#如何结合OpenCVSharp4实现玉米粒计数,文中的示例代码简洁易懂,具有一定的学习价值,需要的小伙伴可以参考下
    2023-11-11
  • C#中尾递归的使用、优化及编译器优化

    C#中尾递归的使用、优化及编译器优化

    这篇文章主要介绍了C#中尾递归的使用、优化及编译器优化,本文讲解了递归运用、尾递归优化、编译器优化等内容,需要的朋友可以参考下
    2015-04-04
  • C# xmlSerializer简单用法示例

    C# xmlSerializer简单用法示例

    这篇文章主要介绍了C# xmlSerializer简单用法,结合实例形式分析了C#基于xmlSerializer操作xml的读取、输出等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • C#导出数据到Excel文件的方法

    C#导出数据到Excel文件的方法

    这篇文章主要介绍了C#导出数据到Excel文件的方法,涉及C#操作Excel的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 浅析C# 基础语法的使用

    浅析C# 基础语法的使用

    本篇文章对C#中基础语法的使用。进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • C#实现弹窗提示输入密码

    C#实现弹窗提示输入密码

    这篇文章主要为大家详细介绍了C#实现弹窗提示输入密码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论