C# socket 實現客戶端連續發送數據


服務器端:

namespace SocketTest
{
     
    class Program
    {
        public static void SendMessage()
        {
            Socket socket = serverSocket.Accept();
            Console.WriteLine("Connected a client:{0}",socket.RemoteEndPoint);
            socket.Send(Encoding.ASCII.GetBytes("welcome to server"));
            //Thread thread = new Thread(ReceiveMessage);
           // thread.Start();
        }

        public static void ReceiveMessage(object obj)
        {
            Socket socket = (Socket)obj;
            byte[] data = new byte[1024];
            int len = socket.Receive(data);
            string dataString = Encoding.ASCII.GetString(data, 0, len);
            Console.WriteLine("Receive Data:{0} from {1}", dataString,socket.RemoteEndPoint);
            //Thread thread = new Thread(SendMessage);
            //thread.Start(socket);
        }


        static Socket serverSocket;
        static void Main(string[] args)
        {
            //定義接收數據長度變量
            int recv;
            //定義接收數據的緩存
            byte[] data = new byte[1024];
            //定義偵聽端口
            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5566);
            //定義套接字類型
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //連接
            serverSocket.Bind(ipEnd);
            //開始偵聽
            serverSocket.Listen(10);
            //控制台輸出偵聽狀態
            Console.Write("Waiting for a client");
            //Socket client;
            while (true)
            {
                    //一旦接受連接,創建一個客戶端
                    Socket client = serverSocket.Accept();
                    //獲取客戶端的IP和端口
                    IPEndPoint ipEndClient = (IPEndPoint)client.RemoteEndPoint;
                    //輸出客戶端的IP和端口
                    Console.WriteLine("Connect with {0} at port {1}", ipEndClient.Address, ipEndClient.Port);
                    //定義待發送字符
                    string welcome = "Welcome to my server";
                    //數據類型轉換
                    data = Encoding.ASCII.GetBytes(welcome);
                    while (true)
                    {
                        
                        try
                        {
                            //發送
                            client.Send(data, data.Length, SocketFlags.None);
                            //接收數據可以用線程也可以不用
                            //ReceiveMessage(client);
                            Thread thread = new Thread(ReceiveMessage);
                            thread.Start(client);
                            ////對data清零
                            //data = new byte[1024];
                            ////獲取收到的數據的長度
                            //recv = client.Receive(data);
                            ////如果收到的數據長度為0,則退出
                            //if (recv == 0)
                            //    break;
                            ////輸出接收到的數據
                            //Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
                            //將接收到的數據再發送出去
                            // client.Send(data, recv, SocketFlags.None);
                        }
                        catch (Exception)
                        {
                            client.Close();
                            serverSocket.Close();

                        }
                    }
                    client.Close();
            }
            //Console.WriteLine("Disconnect form{0}", ipEndClient.Address);
           
            serverSocket.Close();
        

        }
    }
}

客戶端:

namespace Client
{
    class Program
    {
        public static void sendMessage(object obj)
        {
            Socket socket = (Socket)obj;
            string input = Console.ReadLine();

            byte[] data = Encoding.ASCII.GetBytes(input);
            socket.Send(data, data.Length, SocketFlags.None);
            //Thread thread = new Thread(new ParameterizedThreadStart(ReceiveMessage));
            //thread.Start(socket);
        }
        public static void ReceiveMessage(object obj)
        {
            Socket socket = (Socket)obj;
            byte[] data = new byte[1024];
            int len = socket.Receive(data);
            string dataString = Encoding.ASCII.GetString(data, 0, len);
            Console.WriteLine("Receive Data:{0} from {1}", dataString, socket.RemoteEndPoint);
            //Thread thread = new Thread(new ParameterizedThreadStart(SendMessage));
            //thread.Start(socket);
        }
        static void Main(string[] args)
        {
            //定義發送數據緩存
            byte[] data = new byte[1024];
            //定義字符串,用於控制台輸出或輸入
            string input, stringData;
            //定義主機的IP及端口
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint ipEnd = new IPEndPoint(ip, 5566);
            //定義套接字類型
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //嘗試連接
            try
            {
                socket.Connect(ipEnd);
            }
            //異常處理
            catch (SocketException e)
            {
                Console.WriteLine("Fail to connect server");
                Console.WriteLine(e.ToString());
                return;
            }
            //定義接收數據的長度
            int recv = socket.Receive(data);
            //將接收的數據轉換成字符串
            stringData = Encoding.ASCII.GetString(data, 0, recv);
            //控制台輸出接收到的數據
            Console.WriteLine(stringData);
            while(true)
            {
                //Thread thread = new Thread(sendMessage);
                //thread.Start(socket);
                //定義從鍵盤接收到的字符串
                input = Console.ReadLine();
                if (input == "exit")
                {
                    break;
                }
                //將從鍵盤獲取的字符串轉換成整型數據並存儲在數組中    
                data = Encoding.ASCII.GetBytes(input);
                //發送該數組
                socket.Send(data, data.Length, SocketFlags.None);
                ////如果字符串是"exit",退出while循環
                //if (input == "exit")
                //{
                //    break;
                //}
                ////對data清零
                //data = new byte[1024];
                ////定義接收到的數據的長度
                //recv = socket.Receive(data);
                ////將接收到的數據轉換為字符串
                //stringData = Encoding.ASCII.GetString(data, 0, recv);
                ////控制台輸出字符串
                //Console.Write(stringData);
                ////發送收到的數據
                //socket.Send(data, recv, 0);

            }
            Console.WriteLine("disconnect from server");
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();

        }
    }
}

 


免責聲明!

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



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