C# Socket通信

本文主要介绍C#中使用TCP协议进行同步Socket通信的方法,涵盖了客户端(Client)和服务端(Server)的实现。作为新手,作者分享了学习过程,并欢迎经验丰富的开发者指正。
摘要由CSDN通过智能技术生成

标题 C#Socket通信

1. 关于C#Socket通信,分为同步和异步通信,本文介绍一下同步通信,使用的是TCP协议,通信两端分为客户端(Client)和服务端(Server);
(1)客户端(Client)

 class Program
    {
     
        private static byte[] result = new byte[1024];
        private static Socket clientSocket;
        private static string userName = "DefultName";
        static void Main(string[] args)
        {

            Console.WriteLine("请输入用户名:");
            userName = Console.ReadLine();
            if (string.IsNullOrEmpty(userName))//检测userName是否为空引用
            {
                userName = "DefultName";
            }
            //设定服务器IP地址 
            IPAddress ip = IPAddress.Parse("192.168.1.120");
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                clientSocket.Connect(new IPEndPoint(ip, 8888)); //配置服务器IP与端口 
                Console.WriteLine("连接服务器成功");
                clientSocket.Send(Encoding.UTF8.GetBytes(string.Format("{0}${1}", userName, "加入")));
                Thread reciveThread = new Thread(ReciveMessage);
                reciveThread.Start();
                Thread sendThread = new Thread(SendMessage);
                sendThread.Start();

            }
            catch
            {
                Console.WriteLine("连接服务器失败,请按回车键退出!");
                return;
            }
  
            /// 测试代码块,可有可无
            通过clientSocket接收数据 
            //int receiveLength = clientSocket.Receive(result);
            //Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(result, 0, receiveLength));
            通过 clientSocket 发送数据 
            //for (int i = 0; i < 10; i++)
            //{
            //    try
            //    {
            //        Thread.Sleep(1000);    //等待1秒钟 
            //        string sendMessage = "client send Message Hellp" + DateTime.Now;
            //        clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
            //        Console.WriteLine("向服务器发送消息:{0}" + sendMessage);
            //    }
            //    catch
            //    {
            //        clientSocket.Shutdown(SocketShutdown.Both);
            //        clientSocket.Close();
            //        break;
            //    }
            //}
            //Console.WriteLine("发送完毕,按回车键退出");
            //Console.ReadLine();
        }

        private static void SendMessage()//向服务器发送消息
        {
            while (true)
            {

                string message = Console.ReadLine();

                clientSocket.Send(Encoding.UTF8.GetBytes(string.Format("{0}${1}", userName, message)));
            }
        }

        private static void ReciveMessage()//接受服务器消息
        {
            while (true)
            {
                int receiveNumber = clientSocket.Receive(result);
                string resultMessage = Encoding.UTF8.GetString(result, 0, receiveNumber);
                Console.WriteLine("接收服务器端消息{0}", resultMessage);

            }
        }
    }
}

服务端(Server)

 class Program
    {       
            private static Dictionary<string, Socket> clientSocketDic;//定义字典来存储用户
            private static byte[] result = new byte[1024];
            public static Socket serverSocket;
            private static int port = 8888;
            private static string ip = "192.168.1.120";
            static void Main(string[] args)
            {
                clientSocketDic = new Dictionary<string, Socket>();
                IPAddress ipAddress = IPAddress.Parse(ip);
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//这里使用的是TCP通信协议
                serverSocket.Bind(new IPEndPoint(ipAddress, port));
                serverSocket.Listen(100);

                Thread clientThread = new Thread(ListenClientConnect)
                clientThread.Start();//启动线程
                Console.WriteLine("*************服务器启动*****************");


            }

            static void ListenClientConnect()//监听客户端连接
        {
                while (true)
                {
                    Console.WriteLine("*************等待客户端连接*****************");
                    Socket clientSocket = serverSocket.Accept();
                    try
                    {
                        int receiveNumber = clientSocket.Receive(result);
                        string resultMessage = Encoding.UTF8.GetString(result, 0, receiveNumber);
                        Console.WriteLine(clientSocket.RemoteEndPoint);//打印客户端的IP地址
                        string name = resultMessage.Split('$')[0];//使用$将用户名与Socket分割
                        if (!clientSocketDic.ContainsKey(name))//判断客户端是否断开连接
                        {
                            clientSocketDic.Add(name, clientSocket);
                        }
                        Console.WriteLine(string.Format("{0}:加入成功", name));
                    }
                    catch (Exception e)
                    {
                        clientSocket.Close();
                        // Console.WriteLine(e+"异常");
                    }

                    Thread receiveThread = new Thread(ReceiveMessage);
                    receiveThread.Start(clientSocket);
                }
            }

            private static void ReceiveMessage(object clientSocket)//这里实现多人对话服务,当加入的客户端向服务端发送消息时,所有加入服务端的客户端都能收到消息
            {
                Socket myClientSocket = (Socket)clientSocket;
                while (true)
                {
                    try
                    {
                        if (myClientSocket.Poll(1000, SelectMode.SelectRead))
                        {
                            foreach (KeyValuePair<string, Socket> item in clientSocketDic)
                            {
                                if (item.Value == myClientSocket)
                                {
                                    clientSocketDic.Remove(item.Key);
                                    break;
                                }
                            }
                            myClientSocket.Close();
                            break;
                        }

                        int receiveNumber = myClientSocket.Receive(result);

                        string resultMessage = Encoding.UTF8.GetString(result, 0, receiveNumber);
                        Console.WriteLine(resultMessage);
                        string messageToAllClient = resultMessage.Replace('$', ':');
                        foreach (KeyValuePair<string, Socket> item in clientSocketDic)
                        {
                            if (item.Value.Connected)
                                if (item.Key != resultMessage.Split('$')[0])
                                    item.Value.Send(Encoding.UTF8.GetBytes(messageToAllClient));
                        }
                    }
                    catch (Exception e)
                    {
                          //异常处理
                    }
                }
            }
        
    }

}

在这里插入图片描述
小小新人一枚,如果那里写的不对,请大佬指点一下,笔芯!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值