C# SOCKET發送和接收例子

xmnx 10年前發布 | 5K 次閱讀 C# Socket

Socket 客戶端

using System; using System.Collections.Generic; using System.Linq; using System.Text;

using System.Net; using System.Net.Sockets;

namespace A0140_SocketClient.Sample {

/// <summary>
/// 這個類為一個 Socket 客戶端的例子.
/// 這個類簡單的 連接到 Socket 服務器,并發送一段消息。
/// 然后讀取來自服務器的反饋
/// 最后結束程序.
///
/// 服務端輸出:
/// 開始偵聽 8088 端口……
/// 接收到客戶的連接
/// 接收到來自客戶端的數據為:Hello Socket Server!
///
/// 客戶端輸出:
/// 向服務器發送到了:Hello Socket Server!
/// 從服務器接收到了:Hello Socket Server!
///
/// </summary>
class StockClient
{

    /// <summary>
    /// 字符編碼處理.
    /// </summary>
    private static readonly Encoding ASCII;


    /// <summary>
    /// 用于 發送/接收的端口.
    /// </summary>
    private const int PORT = 8088;


    private const String SEND_MESSAGE = "Hello Socket Server!";


    static StockClient()
    {
        ASCII = Encoding.ASCII;
    }

    public void SendMessage()
    {
        // 構造用于發送的 字節緩沖.
        Byte[] sendBytes = ASCII.GetBytes(SEND_MESSAGE);

        // 構造用于接收的 字節緩沖.
        Byte[] recvBytes = new Byte[256];

        // IP地址.
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");

        // 接入點.
        IPEndPoint ephost = new IPEndPoint(localAddr, PORT);


        // 第一個參數:AddressFamily = 指定 Socket 類的實例可以使用的尋址方案。
        //     Unspecified 未指定地址族。
        //     InterNetwork IP 版本 4 的地址。
        //     InterNetworkV6 IP 版本 6 的地址。
        //
        // 第二個參數:SocketType = 指定 Socket 類的實例表示的套接字類型。
        //     Stream 一個套接字類型,支持可靠、雙向、基于連接的字節流,而不重復數據,也不保留邊界。
        //            此類型的 Socket 與單個對方主機通信,并且在通信開始之前需要建立遠程主機連接。
        //            此套接字類型使用傳輸控制協議 (Tcp),AddressFamily 可以是 InterNetwork,也可以是 InterNetworkV6。
        //
        // 第三個參數:ProtocolType = 指定 Socket 類支持的協議。
        //     Tcp 傳輸控制協議 (TCP)。
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            // 嘗試連接主機.
            s.Connect(ephost);


            Console.WriteLine("向服務器發送到了:{0}", SEND_MESSAGE);

            // 向主機發送數據.
            s.Send(sendBytes, sendBytes.Length, SocketFlags.None);

            // 接收服務器的應答.
            Int32 bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);


            StringBuilder buff = new StringBuilder();

            while (bytes > 0)
            {
                // 將緩沖的字節數組,裝換為字符串.
                String str = ASCII.GetString(recvBytes, 0, bytes);
                // 加入字符串緩存
                buff.Append(str);
                // 再次接受,看看后面還有沒有數據.
                bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
            }

            Console.WriteLine("從服務器接收到了:{0}", buff.ToString());


        }
        catch (Exception ex)
        {
            Console.WriteLine("連接/發送/接收過程中,發生了錯誤!");
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }
        finally
        {
            s.Close();
        }
    }
}

}

Socket 服務端

?using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Collections.Generic; using System.Linq; using System.Text;

using System.Threading;

namespace A0130_SocketServer.Sample {

/// <summary>
/// Socket 服務端例子
/// 
/// 這個例子僅僅處理一個 客戶端的訪問, 處理完畢后退出.
/// 
/// 
/// 服務端的輸出為:
/// 
/// 開始偵聽 8088 端口……
/// 接收到客戶的連接
/// 接收到來自客戶端的數據為:1
/// 
/// 
/// 
/// 客戶端的輸入為:
/// 
/// telnet 127.0.0.1 8088
/// 1
/// 失去了跟主機的連接。
/// 
/// 
/// </summary>
class SocketServer
{

    /// <summary>
    /// 字符編碼處理.
    /// </summary>
    private static readonly Encoding ASCII;


    /// <summary>
    /// 用于 監聽的端口.
    /// </summary>
    private const int PORT = 8088;


    static SocketServer()
    {
        ASCII = Encoding.ASCII;
    }

    public void StartServer()
    {
        TcpListener myListener = null;
        try
        {
            // IP地址.
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");

            // 在 8088 端口 開一個偵聽.
            myListener = new TcpListener(localAddr, PORT);

            // 開始偵聽.
            myListener.Start();
            Console.WriteLine("開始偵聽 {0} 端口……", PORT);

            // 程序在這里暫停, 等待客戶端的接入.
            Socket mySocket = myListener.AcceptSocket();

            // 如果執行到這里,說明接收到了客戶的連接.
            Console.WriteLine("接收到客戶的連接");

            // 字節緩沖.
            Byte[] recvBytes = new Byte[256];

            // 讀取數據到緩沖區當中
            Int32 bytes = mySocket.Receive(recvBytes, recvBytes.Length, SocketFlags.None);

            // 將緩沖區當中的 byte 數組,轉化為 字符串.
            String str = ASCII.GetString(recvBytes, 0, bytes);

            Console.WriteLine("接收到來自客戶端的數據為:{0}", str);

            // 將讀取到的數據,發送回給客戶端.
            mySocket.Send(recvBytes, bytes, SocketFlags.None);
            // 休眠5秒.
            Thread.Sleep(5000);
            // 關閉 Socket
            mySocket.Close();

        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }
        finally
        {

            myListener.Stop();
        }
    }
}

}

</pre>

 本文由用戶 xmnx 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!