首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Visual C# 2005 Socket 網路程式設計完整指南

     編輯:關於C#

.NET Framework 提供 System.Net(高層協議操作)與 System.Net.Sockets(低層 Socket/TCP/UDP 操作)兩大命名空間支援網路程式開發。Socket 類別是 Winsock API 的託管實作,為 TcpClient、TcpListener、UdpClient 等高層類別的基礎。本文詳細說明 Socket 核心概念、關鍵類別、同步/非同步模式與完整 Client/Server 範例。

Socket 核心概念

Socket 可視為應用程式與遠端伺服器間的資料通道。建立 Socket 實例後,透過 Send/SendTo 傳送資料,Receive/ReceiveFrom 接收資料。

建立 Socket 實例

// TCP Socket
Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

// UDP Socket
Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

參數說明:

  • AddressFamily.InterNetwork:IPv4 定址
  • SocketType.Stream:串流/連線導向(TCP)
  • SocketType.Dgram:資料報/無連線(UDP)

關鍵類別與方法

類別/方法用途
IPEndPointIP 位址與埠號組合的網路端點
IPAddress.Parse()字串轉 IPAddress 實例
Dns.Resolve()網域名稱解析為 IP 位址
Socket.Bind()伺服器端綁定本地端點
Socket.Listen()開始監聽連線請求
Socket.Accept()接受連線,回傳新 Socket 處理通訊
Socket.Connect()客戶端主動連線
Socket.Shutdown() / Close()關閉連線與釋放資源

常見例外處理

  • SocketException:作業系統層級網路錯誤
  • ArgumentNullException:參數為 null
  • ObjectDisposedException:Socket 已關閉

同步與非同步模式

  • 同步:Send、Receive 等待操作完成才返回,適合簡單應用。
  • 非同步:BeginSend、BeginReceive 立即返回,配合回呼函數處理完成事件,適合高併發伺服器。

完整 TCP Client/Server 範例

Client 端

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

namespace SocketClient
{
    class Program
    {
        static void Main()
        {
            try
            {
                int port = 2000;
                string host = "127.0.0.1";
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client.Connect(ipe);
                
                string sendStr = "hello! This is a socket test";
                byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
                client.Send(sendBytes, sendBytes.Length, 0);
                
                byte[] recvBytes = new byte[1024];
                int bytes = client.Receive(recvBytes, recvBytes.Length, 0);
                string recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
                Console.WriteLine("Server 回應: " + recvStr);
                
                client.Close();
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
            Console.ReadLine();
        }
    }
}

Server 端

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

namespace SocketServer
{
    class Program
    {
        static void Main()
        {
            try
            {
                int port = 2000;
                IPAddress ip = IPAddress.Parse("127.0.0.1");
                IPEndPoint ipe = new IPEndPoint(ip, port);
                
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                server.Bind(ipe);
                server.Listen(0);
                
                Console.WriteLine("伺服器啟動,等待連線...");
                Socket client = server.Accept();
                Console.WriteLine("客戶端已連線");
                
                byte[] recvBytes = new byte[1024];
                int bytes = client.Receive(recvBytes, recvBytes.Length, 0);
                string recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
                Console.WriteLine("收到訊息: " + recvStr);
                
                string sendStr = "OK! Success!";
                byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
                client.Send(sendBytes, sendBytes.Length, 0);
                
                client.Shutdown(SocketShutdown.Both);
                client.Close();
                server.Shutdown(SocketShutdown.Both);
                server.Close();
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
            Console.ReadLine();
        }
    }
}

先啟動 Server 再執行 Client,即可觀察雙向通訊流程。此範例在 Visual Studio 2005 Express / .NET 2.0 環境測試通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved