C# Socket 簡單的控制台案例


一、服務器端

1. 實例化並設置socket實例對象

    a.創建ip地址和端口

    b.綁定監聽地址

    c.設置一下允許同時訪問數

2. 監聽連接

    a.通過啟動一個新的線程執行,這樣主線程不會假死(啟動線程,所帶的參數必須是object類型)

    b.利用循環等待連接並返回一個負責通信的socket實例

    c.返回的socket實例中可以獲取到所連接客服的IP地址

3. 接收客服的發送過來的消息

    a.在監聽方法中啟動一個新的線程執行

    b.利用循環獲取發送過來的消息,調用獲取消息的方法需要傳遞一個字節變量參數,作為容器。方法返回值為int,表示獲取到的有效字節數

    c.如果有效字節數為0則跳出循環

    d.接收到消息給客服的返回消息

4. 控制台程序服務器端代碼

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace ServerSocket
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Socket serverSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Any;
            IPEndPoint point = new IPEndPoint(ip, 2333);
            //socket綁定監聽地址
            serverSocket.Bind(point);
            Console.WriteLine("Listen Success");
            //設置同時連接個數
            serverSocket.Listen(10);

            //利用線程后台執行監聽,否則程序會假死
            Thread thread = new Thread(Listen);
            thread.IsBackground = true;
            thread.Start(serverSocket);

            Console.Read();
        }

        /// <summary>
        /// 監聽連接
        /// </summary>
        /// <param name="o"></param>
        static void Listen(object o)
        {
            var serverSocket = o as Socket;
            while (true)
            {
                //等待連接並且創建一個負責通訊的socket
                var send = serverSocket.Accept();
                //獲取鏈接的IP地址
                var sendIpoint = send.RemoteEndPoint.ToString();
                Console.WriteLine($"{sendIpoint}Connection");
                //開啟一個新線程不停接收消息
                Thread thread = new Thread(Recive);
                thread.IsBackground = true;
                thread.Start(send);
            }
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="o"></param>
        static void Recive(object o)
        {
            var send = o as Socket;
            while (true)
            {
                //獲取發送過來的消息容器
                byte[] buffer = new byte[1024 * 1024 * 2];
                var effective = send.Receive(buffer);
                //有效字節為0則跳過
                if (effective == 0)
                {
                    break;
                }
                var str = Encoding.UTF8.GetString(buffer,0, effective);
                Console.WriteLine(str);

           var buffers = Encoding.UTF8.GetBytes("Server Return Message");
           send.Send(buffers);

            }
        }
    }
}

二、客戶端

1. 實例化並進行連接socket實例對象

    a.創建ip地址和端口(服務器的IP和端口)

    b.與服務器端建立鏈接

2. 接收服務器發送的消息

    a.啟動一個新的線程執行

    b.利用循環獲取發送過來的消息,調用獲取消息的方法需要傳遞一個字節變量參數,作為容器。方法返回值為int,表示獲取到的有效字節數

    c.如果有效字節數為0則跳出循環

3. 給服務器發送消息

    a. 調用socket對象的send()方法直接發送

4. 控制台程序客戶端代碼

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace SocketClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            //創建實例
            Socket socketClient = new Socket(SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse("192.168.0.111");
            IPEndPoint point = new IPEndPoint(ip, 2333);
            //進行連接
            socketClient.Connect(point);
            
            //不停的接收服務器端發送的消息
            Thread thread = new Thread(Recive);
            thread.IsBackground = true;
            thread.Start(socketClient);

            //不停的給服務器發送數據
            int i = 0;
            while (true)
            {
                i++;
                var buffter = Encoding.UTF8.GetBytes($"Test Send Message:{i}");
                var temp = socketClient.Send(buffter);
                Thread.Sleep(1000);
            }
            
        }


        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="o"></param>
        static void Recive(object o)
        {
            var send = o as Socket;
            while (true)
            {
                //獲取發送過來的消息
                byte[] buffer = new byte[1024 * 1024 * 2];
                var effective = send.Receive(buffer);
                if (effective == 0)
                {
                    break;
                }
                var str = Encoding.UTF8.GetString(buffer, 0, effective);
                Console.WriteLine(str);
            }
        }
    }
}

 


免責聲明!

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



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