1. 程式人生 > >Socket通訊的Demo

Socket通訊的Demo

Demo

不講細節了,直接上程式碼, 如果要實現比較複雜的socket功能,最好不要像下面自己寫,使用fastsocket等框架。

Socket服務埠的程式碼:

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

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //點選開始監聽時 在服務端建立一個負責監聽IP和埠號的Socket
            Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse("127.0.0.1") ;
            //建立物件埠
            IPEndPoint point = new IPEndPoint(ip, 8087);

            socketWatch.Bind(point);//繫結埠號
            Console.WriteLine("listen success!");
            socketWatch.Listen(10);//設定監聽

            //建立監聽執行緒
            Thread thread = new Thread(Listen);
            thread.IsBackground = true;
            thread.Start(socketWatch);

            while (true)
            {
                Console.WriteLine("please send information to client:");
                Send(Console.ReadLine());
            }

            //Console.ReadLine();
        }

        static Socket socketSend;
        static void Listen(object o)
        {
            try
            {
                
                Socket socketWatch = o as Socket;
                while (true)
                {
                    socketSend = socketWatch.Accept();//等待接收客戶端連線
                    Console.WriteLine(socketSend.RemoteEndPoint.ToString() + ":" + "connect success!");
                    //開啟一個新執行緒,執行接收訊息方法
                    Thread r_thread = new Thread(Received);
                    r_thread.IsBackground = true;
                    r_thread.Start(socketSend);
                }
            }
            catch { }
        }

        static void Received(object o)
        {
            try
            {
                Socket socketSend = o as Socket;
                while (true)
                {
                    //客戶端連線伺服器成功後,伺服器接收客戶端傳送的訊息
                    byte[] buffer = new byte[1024 * 10];
                    //實際接收到的有效位元組數
                    int len = socketSend.Receive(buffer);
                    if (len == 0)
                    {
                        break;
                    }
                    string str = Encoding.UTF8.GetString(buffer, 0, len);
                    Console.WriteLine(socketSend.RemoteEndPoint + ":" + str);
                }
            }
            catch { }
        }

        static void Send(string str)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(str);
            socketSend.Send(buffer);
        }
    }
}

Socket客戶端的程式碼:

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

namespace ConsoleApp2
{
    class Program
    {
        static Socket socketSend;
        static void Main(string[] args)
        {
            //建立客戶端Socket,獲得遠端ip和埠號
            socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32("8087"));

            socketSend.Connect(point);
            Console.WriteLine("connect success!");
            //開啟新的執行緒,不停的接收伺服器發來的訊息
            Thread c_thread = new Thread(Received);
            c_thread.IsBackground = true;
            c_thread.Start();


            Console.WriteLine("please send information to server:");
            string msg = Console.ReadLine();
            byte[] buffer = new byte[1024 * 1024 * 3];
            buffer = Encoding.UTF8.GetBytes(msg);
            socketSend.Send(buffer);

            Console.ReadLine();
        }

        static void Received()
        {
            while (true)
            {
                try
                {
                    byte[] buffer = new byte[1024 * 1024 * 3];
                    //實際接收到的有效位元組數
                    int len = socketSend.Receive(buffer);
                    if (len == 0)
                    {
                        break;
                    }
                    string str = Encoding.UTF8.GetString(buffer, 0, len);
                    Console.WriteLine(socketSend.RemoteEndPoint + ":" + str);
                }
                catch { }
            }
        }
    }
}

如果想更牛X的話,可以寫成非同步。

參考文件

https://www.cnblogs.com/wangkaining/p/6089627.html

下面兩篇可以看socket原理

https://www.cnblogs.com/ysyn/p/3399351.html

http://www.cnblogs.com/dotnet261010/p/6211900.html