Socket入門Demo


一、簡單介紹下Socket編程    申明:.net網絡編程

  1)什么是Socket編程?

    Socket編程就是常說的網絡通訊編程,套接字編程。一般應用於軟件聊天通訊,以及軟件與硬件之間的通訊。

    

    通熟易懂點就是下邊這個意思:

  2)需要用套接字編程,那么套接字有那幾個成員?

    流式套接字(SOCK_STREAM):提供了一種可靠的、面向連接的雙向數據傳輸服務。實現了數據無差錯,無重復的發送,內設流量控制,被傳輸的數據被看做無記錄邊界的字節流

    數據報套接字(SOCK_DGRAM):提供了一種無連接、不可靠的雙向數據傳輸服務。數據以獨立的包形式被發送,並且保留了記錄邊界,不提供可靠性保證。數據在傳輸過程中可能會丟失或重復,並且不能保證在接收端數據按發送順序接收。

    原始套接字(SOCK_RAW):該套接字允許對較低層協議(如IP或ICMP)進行直接訪問。

    說了這么多,其實無非想告訴我們第一種就是Tcp使用在下圖層級的第四層,第二種Udp使用同樣在第四層,第三種底層開發使用在第三層網絡層,也就是剛剛入門不需要使用,開發IP協議使用。這個就和網絡七層協議有關了。這個層級關系如下圖

  3)如何在代碼實現?通信的基本步驟是什么?

 

    服務器端:

    第一步:創建一個用於監聽連接的Socket對像;

    第二步:用指定的端口號和服務器的ip建立一個EndPoint對像;

    第三步:用socket對像的Bind()方法綁定EndPoint;

    第四步:用socket對像的Listen()方法開始監聽;

    第五步:接收到客戶端的連接,用socket對像的Accept()方法創建一個新的用於和客戶端進行通信的socket對像;

    第六步:通信結束后一定記得關閉socket;

    客戶端:

    第一步:建立一個Socket對像;

    第二步:用指定的端口號和服務器的ip建立一個EndPoint對像;

    第三步:用socket對像的Connect()方法以上面建立的EndPoint對像做為參數,向服務器發出連接請求;

    第四步:如果連接成功,就用socket對像的Send()方法向服務器發送信息;

    第五步:用socket對像的Receive()方法接受服務器發來的信息 ;

    第六步:通信結束后一定記得關閉socket;

二、代碼實現篇

  1)創建項目。添加類庫,將類庫的輸出類型改成輸出型類改為控制台應用程序。如下圖

  2)前兩個類庫是tcp協議下的服務端與客戶端的實例。第三個類庫則為udp協議下的通訊。

  3)TCP通訊中,設置前兩個類庫為啟動項,啟動。按順序輸入訪問。

  4)啟動測試UDP如下圖

  5)源碼下載: http://pan.baidu.com/s/1c2cq8hE

  

  總結:1)很簡單在Udp鏈接中,我們必須保持發送端口與接受端口一致,因為只有這樣才能從客戶端發送給服務端接收,也就是”127.0.0.1:2313<<<大家是否“。再返回到客戶端信息。

     2)IPEndPoint相關信息詳見:http://www.cnblogs.com/ssor/archive/2009/08/28/1555904.html

     3)多線程並行編程:http://www.cnblogs.com/ChineseMoonGod/p/5341253.html

     4)最后代碼講解示例下:

static void Main(string[] args)
        {
            Socket socket = null;
            try
            {
                ushort localPort, remotePort;
                IPAddress address;
                InitMsg();


                do
                {
                    Show("請輸入本地端口號:", false);
                    //.TryParse(Read(), out localPort)把輸入的強轉,然后賦值給參數localPort
                    if (ushort.TryParse(Read(), out localPort) == false)
                    {
                        Show("端口號無效");
                    }
                } while (localPort == 0);

                do
                {
                    Show("請輸入遠程IP:", false);

                    if (IPAddress.TryParse(Read(), out address) == false)
                    {
                        Show("遠程IP無效");
                    }
                } while (address == null);

                do
                {
                    Show("請輸入遠程端口號:", false);
                    if (ushort.TryParse(Read(), out remotePort) == false)
                    {
                        Show("端口號無效");
                    }
                } while (remotePort == 0);

                var localPoint = new IPEndPoint(0, localPort);
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                socket.Bind(localPoint);

                // 啟動新線程負責接收數據
                ThreadPool.QueueUserWorkItem(OnReceive, socket);
                Show("服務准備就緒");

                do
                {
                    try
                    {
                        Show("請輸入消息:", false);
                        var msg = Read();
                        if (string.IsNullOrEmpty(msg))
                        {
                            msg = GetMsgRandom();
                        }
                        var sendBuffer = Encoding.Default.GetBytes(msg);
                        // 發送數據
                        EndPoint sendPoint = new IPEndPoint(address, remotePort);
                        var sendLength = socket.SendTo(sendBuffer, sendPoint);
                        if (sendLength != sendBuffer.Length)
                        {
                            Show("發送失敗");
                        }
                        else
                        {
                            Show(string.Format("{0}:{1,-5} >>> {2}", localPoint.Address, localPoint.Port, msg));
                        }
                    }
                    catch (SocketException exception)
                    {
                        Show("");
                        Show(exception.Message);
                    }
                    catch (Exception exception)
                    {
                        Show("");
                        Show(exception.Message);
                        Thread.Sleep(100);
                    }
                } while (true);
            }
            catch (Exception exception)
            {
                Show(exception.Message);
            }
            finally
            {
                if (socket != null)
                {
                    CloseSocket(socket);
                }
            }
        }

            初始化信息的集合(可發動的內容)

            接收輸入的本地端口

            IPEndPoint  本地端口,IP

            多線程實現接收數據

            主機向服務器發動數據,一個信息流。一個IPEndPoint就可以了

            顯示傳輸數據

 


免責聲明!

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



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