美文网首页c#学习
c#网络编程-聊天小程序

c#网络编程-聊天小程序

作者: 李药师_hablee | 来源:发表于2019-11-29 17:25 被阅读0次

    服务器模块

    sever部分

    server2.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace ConsoleApp8
    {
        class Sever2
        {
            private Socket serverSocket;
            private List<Socket> clientList;//存储连进来的客户端
            //构造函数
            public Sever2()
            {
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                clientList = new List<Socket>();//连一个客户端往里面加一个
            }
            //启动函数
            public void Start()
            {
                serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12305));
                serverSocket.Listen(10);
                Console.WriteLine("服务器启动成功!");
    
                Thread threadAccept = new Thread(Accept);
                threadAccept.IsBackground = true;
                threadAccept.Start();
            }
            private void Accept()
            {
                //接收客户端的方法,会挂起当前线程
                Socket client = serverSocket.Accept();
                IPEndPoint ipPoint = client.RemoteEndPoint as IPEndPoint;
                Console.WriteLine($"{ipPoint.Address} [{ipPoint.Port}]连接成功!");
                clientList.Add(client);
    
                Thread threadReceive = new Thread(Receive);
                threadReceive.IsBackground = true;
                threadReceive.Start(client);
    
                Accept();
            }
            private void Receive(object obj)
            {
                Socket client =obj as Socket;
                IPEndPoint ipPoint = client.RemoteEndPoint as IPEndPoint;
                try
                {
                    byte[] msg = new byte[1024];
                    int msgLen = client.Receive(msg);
                    String msgStr = $"{ipPoint.Address}[{ipPoint.Port}] 说: {Encoding.UTF8.GetString(msg, 0, msgLen)}";
                    Console.WriteLine(msgStr);
                    Broadcast(client, msgStr);
                    //服务器往客户端发消息
                    //client.Send(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(msg, 0, msgLen) + "-楼上说的对"));
    
                    Receive(client);//尾递归
    
                }
                catch
                {
                    string catchStr = $"{ipPoint.Address}[{ipPoint.Port}]断开";
                    Console.WriteLine(catchStr);
                    Broadcast(client, catchStr);
                    clientList.Remove(client);
                }
            }
            private void Broadcast(Socket clientOther, string msg)
            {
                foreach(var item in clientList)
                {
                    if(item==clientOther)
                    {
                        //同一客户端,无需响应
                    }
                    else
                    {
                        item.Send(Encoding.UTF8.GetBytes(msg));
                    }
                }
            }
        }
    }
    

    主程序部分

    Program.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp8
    {
        class Program
        {
            static void Main(string[] args)
            {
                Sever2 sever2 = new Sever2();
                sever2.Start();
                Console.ReadKey();
            }
        }
    }
    

    客户端模块

    client部分

    ClientSocket.cs

    using System;
    using System.Text;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace Client2
    {
        class ClientSocket
        {
            private Socket clientSocket;
            public ClientSocket()
            {
                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //构造函数
            }
            public void Connect(string ip, int port)
            {
                clientSocket.Connect(ip,port);
                Console.WriteLine("连接服务器成功!");
    
                Thread ReceiveThread = new Thread(Receive);
                ReceiveThread.IsBackground = true;
                ReceiveThread.Start();
            }
            private void Receive()
            {
                try
                {
                    byte[] msg = new byte[1024];
                    int msgLen = clientSocket.Receive(msg);
                    Console.WriteLine($"{Encoding.UTF8.GetString(msg, 0, msgLen)}");
                    Receive();
                }
                catch
                {
                    Console.WriteLine("服务器断开");
                }
            }
            public void send(string msg)
            {
                clientSocket.Send(Encoding.UTF8.GetBytes(msg));
            }
        }
    }
    

    主程序部分

    Program.cs

    using System;
    
    namespace Client2
    {
        class Program
        {
            static void Main(string[] args)
            {
                ClientSocket client2 = new ClientSocket();
                client2.Connect("127.0.0.1", 12305);
    
                Console.WriteLine("请输入要发送的内容,输入quit退出");
                string msg = Console.ReadLine();
                while(msg!="quit")
                {
                    client2.send(msg);
                    msg = Console.ReadLine();
                }
    
                Console.ReadKey();
            }
        }
    }
    

    结果

    Snipaste_2019-11-29_17-25-13.png

    相关文章

      网友评论

        本文标题:c#网络编程-聊天小程序

        本文链接:https://www.haomeiwen.com/subject/icvgwctx.html