C#socket客戶端自己輸入消息發送到服務端通信實現通信


一,服務端代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace ServerDemo1
{
    class Program
    {
        static List<Client> clientList = new List<Client>();
        /// <summary>
        /// 廣播消息
        /// </summary>
        /// <param name="message"></param>
        public static void BroadcastMessage(string message)   //找到相對應的客戶端發送消息
        {
            var notConnectedList = new List<Client>();     
            foreach (var client in clientList)
            {
                if (client.Connected)
                    client.SendMessage(message);  //調用服務端發送消息方法
                else
                {
                    notConnectedList.Add(client);  
                }
            }
            foreach (var temp in notConnectedList)
            {
                clientList.Remove(temp);
            }
        }


        static void Main(string[] args)
        {
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            tcpServer.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888));

            tcpServer.Listen(100);
            Console.WriteLine("server running...");

            while (true)
            {
                Socket clientSocket = tcpServer.Accept();
                clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));
                Console.WriteLine("a client is connected !");
                Client client = new Client(clientSocket);      //把與每個客戶端通信的邏輯(收發消息)放到client類里面進行處理
                clientList.Add(client);
            }
        }
    }
}

處理數據類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;

namespace ServerDemo1
{
    /// <summary>
    /// 用來跟客戶端做通信 
    /// </summary>
    class Client
    {
        private Socket clientSocket;
        private Thread t;
        private byte[] data = new byte[1024];//這個是一個數據容器

        public Client(Socket s)
        {
            clientSocket = s;
            //啟動一個線程 處理客戶端的數據接收
            t = new Thread(ReceiveMessage);
            t.Start();
        }

        private void ReceiveMessage()
        {
            //一直接收客戶端的數據
            while (true)
            {
                //在接收數據之前  判斷一下socket連接是否斷開
                if (clientSocket.Poll(10, SelectMode.SelectRead))
                {
                    clientSocket.Close();
                    break;//跳出循環 終止線程的執行
                }

                int length = clientSocket.Receive(data);
                string message = Encoding.UTF8.GetString(data, 0, length);
                //接收到數據的時候 要把這個數據 分發到客戶端
                //廣播這個消息
                Program.BroadcastMessage(message);
                Console.WriteLine("收到了消息:" + message);
            }
        }

        public void SendMessage(string message)
        {
            byte[] data = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(data);    //將客戶端發送過來的消息返回給服務端
        }

        public bool Connected
        {
            get { return clientSocket.Connected; }
        }
    }
}

客戶端代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace ClientDemo
{
    class Program
    {
        private static byte[] result = new byte[1024];
        static void Main(string[] args)
        {
            //設定服務器IP地址
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                clientSocket.Connect(new IPEndPoint(ip, 8888)); //配置服務器IP與端口
                Console.WriteLine("連接服務器成功");
            }
            catch
            {
                Console.WriteLine("連接服務器失敗,請按回車鍵退出!");
                return;
            }
            //通過clientSocket接收數據
            int receiveLength = clientSocket.Receive(result);
            Console.WriteLine("接收服務器消息:{0}", Encoding.ASCII.GetString(result, 0, receiveLength));
            //通過 clientSocket 發送數據
            string str = "";
            while (str != "exit")
            {
                try
                {
                    Thread.Sleep(1000); //等待1秒鍾
                    Console.WriteLine("向服務器發送消息:");
                    str = Console.ReadLine();
                    clientSocket.Send(Encoding.ASCII.GetBytes(str + "  " + DateTime.Now+"1"));
                    int receiveL = clientSocket.Receive(result);
                    Console.WriteLine("接收服務器消息:{0}", Encoding.ASCII.GetString(result, 0, receiveL));
                }
                catch
                {
                    clientSocket.Shutdown(SocketShutdown.Both);
                    clientSocket.Close();
                    break;
                }
            }
            Console.ReadKey();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM