1. 程式人生 > 其它 >C# Socket 簡單的控制檯案例

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);
            }
        }
    }
}