国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

使用.NET訪問 Internet(3) Paul_Ni(原作)

2024-07-10 13:08:12
字體:
來源:轉載
供稿:網友
使用.net訪問 internet(3) paul_ni(原作)

作者:中國資訊網 來源:zixuen.com 加入時間:2005-5-12 www.zixuen.com

使用 tcp 服務


tcpclient 類使用 tcp 從 internet 資源請求數據。tcpclient 的方法和屬性提取某個 socket 實例的創建細節,該實例用于通過 tcp 請求和接收數據。由于到遠程設備的連接表示為流,因此可以使用 .net 框架流處理技術讀取和寫入數據。
tcp 協議建立與遠程終結點的連接,然后使用此連接發送和接收數據包。tcp 負責確保將數據包發送到終結點并在數據包到達時以正確的順序對其進行組合。
若要建立 tcp 連接,必須知道承載所需服務的網絡設備的地址以及該服務用于通訊的 tcp 端口。internet 分配號碼機構 (internet assigned numbers authority, iana) 定義公共服務的端口號(請訪問 http://www.iana.org/assignments/port-numbers)。iana 列表中所沒有的服務可使用 1,024 到 65,535 這一范圍中的端口號。
下列代碼說明如何設置 tcpclient 以連接到 tcp 端口 13 上的時間服務器。
[c#]
using system;
using system.net.sockets;
using system.text;

public class tcptimeclient {
  private const int portnum = 13;
  private const string hostname = "host.contoso.com";

  public static int main(string[] args) {
    try {
      tcpclient client = new tcpclient(hostname, portnum);

      networkstream ns = client.getstream();
      
      byte[] bytes = new byte[1024];
      int bytesread = ns.read(bytes, 0, bytes.length);

      console.writeline(encoding.ascii.getstring(bytes,0,bytesread));

      client.close();

    } catch (exception e) {
      console.writeline(e.tostring());
    }

    return 0;
  }
}
tcplistener 用于監視 tcp 端口上的傳入請求,然后創建 sockettcpclient 實例來管理與客戶端的連接。start 方法啟用偵聽,而 stop 方法禁用端口上的偵聽。accepttcpclient 方法接受傳入的連接請求并創建 tcpclient 以處理請求,acceptsocket 方法接受傳入的連接請求并創建 socket 以處理請求。
下面的代碼說明如何使用 tcplistener 創建網絡時間服務器以監視 tcp 端口 13。當接受傳入的連接請求時,時間服務器用來自宿主服務器的當前日期和時間進行響應。
[c#]
using system;
using system.net.sockets;
using system.text;

public class tcptimeserver {

  private const int portnum = 13;

  public static int main(string[] args) {
    bool done = false;
    
    tcplistener listener = new tcplistener(portnum);

    listener.start();

    while (!done) {
      console.write("waiting for connection...");
      tcpclient client = listener.accepttcpclient();
      
      console.writeline("connection accepted.");
      networkstream ns = client.getstream();

      byte[] bytetime = encoding.ascii.getbytes(datetime.now.tostring());

      try {
        ns.write(bytetime, 0, bytetime.length);
        ns.close();
        client.close();
      } catch (exception e) {
        console.writeline(e.tostring());
      }
    }

    listener.stop();

    return 0;
  }
  
}

使用 udp 服務


udpclient 類使用 udp 與網絡服務通訊。udpclient 類的屬性和方法提取某個 socket 實例的創建細節,該示例用于通過 udp 請求和接收數據。
udp 的優點是簡單易用,并且能夠同時向多個地址廣播消息。但由于 udp 協議是一個無連接協議,因此發送到遠程終結點的 udp 數據文報不一定能夠到達,也不一定能夠以發送的相同順序到達。使用 udp 的應用程序必須準備處理丟失的和順序有誤的數據文報。
若要使用 udp 發送數據文報,必須知道承載所需服務的網絡設備的網絡地址以及該服務用于通訊的 udp 端口號。internet 分配號碼機構 (internet assigned numbers authority, iana) 定義公共服務的端口號(請訪問     http://www.iana.org/assignments/port-numbers)。iana 列表中所沒有的服務可使用 1,024 到 65,535 這一范圍中的端口號。
特殊網絡地址用于支持基于 ip 的網絡上的 udp 廣播消息。下面探討的內容以 internet 上使用的 ip 版本 4 地址族作為示例。
ip 版本 4 地址使用 32 位指定網絡地址。對于使用 255.255.255.0 網絡掩碼的 c 類地址,這些位被分為四個八位字節。當以十進制數表示時,這四個八位字節構成熟悉的以點分隔的四部分表示法,如 192.168.100.2。前兩個八位字節(此示例中為 192.168)構成網絡號;第三個八位字節 (100) 定義子網;最后一個八位字節 (2) 是主機標識符。
將 ip 地址的所有位均設置為 1(即 255.255.255.255)可構成有限的廣播地址。將 udp 數據文報發送到此地址可將消息傳遞到該廣播網絡上的任何主機。由于路由器從不轉發發送到此地址的消息,因此只有已連接的網絡上的主機才可看到這些廣播。
通過將部分地址的所有位全都設置為 1,可以將廣播定向到特定的網絡部分。例如,若要將廣播發送到以 192.168 打頭的 ip 地址標識的網絡上的所有主機,請將地址的子網和主機部分全都設置為 1,如 192.168.255.255。若要將廣播限制在單個子網,則只將主機部分設置全都為 1,如 192.168.100.255。
udpclient 類可向任何網絡廣播地址廣播,但它無法偵聽發送到網絡的廣播。必須使用 socket 類才能偵聽網絡廣播。
當所有接收者都位于單個網絡中時,或者當許多客戶端需要接收廣播時,廣播地址將起作用。當接收者為網絡的一小部分時,應將消息發送到多路廣播組,在那里只有加入此組的客戶端才能接收到消息。范圍從 224.0.0.2 到 244.255.255.255 的 ip 地址保留為主機組地址。ip 號 224.0.0.0 被保留,而 224.0.0.1 分配給所有 ip 主機的固定組。
下面的示例使用 udpclient 偵聽端口 11000 上的多路廣播地址組 224.168.100.2 的 udp 數據文報廣播。它接收消息字符串并將消息寫入控制臺。
 [c#]
using system;
using system.net;
using system.net.sockets;
using system.text;
 
public class udpmulticastlistener {
 
   private static readonly ipaddress groupaddress = 
     ipaddress.parse("224.168.100.2");
   private const int groupport = 11000;
   
  private static void startlistener() {
    bool done = false;
    
    udpclient listener = new udpclient();
    ipendpoint groupep = new ipendpoint(groupaddress,groupport);
 
    try {
      listener.joinmulticastgroup(groupaddress);
      listener.connect(groupep);
      
      while (!done) {
        console.writeline("waiting for broadcast");
        byte[] bytes = listener.receive( ref groupep);
 
        console.writeline("received broadcast from {0} :/n {1}/n",
          groupep.tostring(),
          encoding.ascii.getstring(bytes,0,bytes.length));
      }
 
      listener.close();
      
    } catch (exception e) {
      console.writeline(e.tostring());
    }
    
  }
 
  public static int main(string[] args) {
    startlistener();
 
    return 0;
  }
}

下面的示例使用 udpclient 將 udp 數據文報發送到端口 11000 上的多路廣播地址組 224.268.100.2。它發送命令行上指定的消息字符串。
 [c#]
using system;
using system.net;
using system.net.sockets;
using system.text;
 
public class udpmulticastsender {
 
   private static ipaddress groupaddress = 
     ipaddress.parse("224.168.100.2");
   private static int groupport = 11000;
   
  private static void send( string message) {
    udpclient sender = new udpclient();
    ipendpoint groupep = new ipendpoint(groupaddress,groupport);
 
    try {
      console.writeline("sending datagram : {0}", message);
      byte[] bytes = encoding.ascii.getbytes(message);
 
      sender.send(bytes, bytes.length, groupep);
      
      sender.close();
      
    } catch (exception e) {
      console.writeline(e.tostring());
    }
    
  }
 
  public static int main(string[] args) {
    send(args[0]);
 
    return 0;
  }
}

套接字


system.net.sockets 命名空間包含 windows 套接字接口的托管實現。system.net 命名空間中的所有其他網絡訪問類都建立在該套接字實現之上。
.net 框架 socket 類是 winsock32 api 提供的套接字服務的托管代碼版本。大多數情況下,socket 類方法只是將數據封送到它們的本機 win32 副本中并處理任何必要的安全檢查。
socket 類支持兩種基本模式:同步和異步。在同步模式中,對執行網絡操作的函數(如 send 和 receive)的調用一直等到操作完成后才將控制返回給調用程序。在異步模式中,這些調用立即返回。

創建套接字


在可以使用套接字與遠程設備通訊之前,必須使用協議和網絡地址信息初始化套接字。socket 類的構造函數具有指定套接字用來建立連接的地址族、套接字類型和協議類型的參數。下面的示例創建一個 socket,它可用于在基于 tcp/ip 的網絡(如 internet)上通訊。
 [c#]
socket s = new socket(addressfamily.internetwork, 
  sockettype.stream, protocoltype.tcp);

若要使用 udp 而不是 tcp,請更改協議類型,如下面的示例所示。
 [c#]
socket s = new socket(addressfamily.internetwork, 
  sockettype.dgram, protocoltype.udp);

addressfamily 枚舉指定 socket 類用來解析網絡地址的標準地址族(例如,addressfamily.internetwork 成員指定 ip 版本 4 地址族)。
sockettype 枚舉指定套接字的類型(例如,sockettype.stream 成員指示一個用于通過流控制發送和接收數據的標準套接字)。
protocoltype 枚舉指定在 socket 上通訊時使用的網絡協議(例如,protocoltype.tcp 指示套接字使用 tcp;protocoltype.udp 指示套接字使用 udp)。
創建 socket 后,它既可以初始化與遠程終結點的連接,也可以接收來自遠程設備的連接。

使用客戶端套接字


在可以通過 socket 初始化對話之前,必須在應用程序和遠程設備之間創建一個數據管道。盡管存在其他網絡地址族和協議,但本示例說明如何創建與遠程服務的 tcp/ip 連接。
tcp/ip 使用一個網絡地址和一個服務端口號來唯一標識設備。網絡地址標識網絡上的特定設備;端口號標識要連接到的該設備上的特定服務。網絡地址和服務端口的組合稱為終結點,它在 .net 框架中由 endpoint 類表示。為每個受支持的地址族定義了 endpoint 的子代;對于 ip 地址族,該類為 ipendpoint。
dns 類向使用 tcp/ip internet 服務的應用程序提供域名服務。resolve 方法查詢 dns 服務器以將用戶友好的域名(如“host.contoso.com”)映射到數字形式的 internet 地址(如 192.168.1.1)。resolve 返回一個 iphostenty 實例,該實例包含所請求名稱的地址和別名的列表。大多數情況下,可以使用 addresslist 數組中返回的第一個地址。下面的代碼獲取一個 ipaddress 實例,該實例包含服務器 host.contoso.com 的 ip 地址。
 [c#]
iphostentry iphostinfo = dns.resolve("host.contoso.com");
ipaddress ipaddress = iphostinfo.addresslist[0];

internet 分配號碼機構 (internet assigned numbers authority, iana) 定義公共服務的端口號(有關更多信息,請訪問 http://www.iana.org/assignments/port-numbers)。其他服務可以具有在 1,024 到 65,535 范圍內的注冊端口號。下面的代碼將 host.contoso.com 的 ip 地址與端口號組合,以便為連接創建遠程終結點。
 [c#]
ipendpoint ipe = new ipendpoint(ipaddress,11000);

確定了遠程設備的地址并選擇了用于連接的端口后,應用程序可以嘗試建立與遠程設備的連接。下面的示例使用現有的 ipendpoint 實例與遠程設備連接,并捕獲引發的任何異常。
 [c#]
try {
  s.connect(ipe);
} catch(argumentnullexception ae) {
  console.writeline("argumentnullexception : {0}", ae.tostring());
} catch(socketexception se) {
  console.writeline("socketexception : {0}", se.tostring());
} catch(exception e) {
  console.writeline("unexpected exception : {0}", e.tostring());
}

使用同步客戶端套接字


同步客戶端套接字在等待網絡操作完成時掛起應用程序。同步套接字不適用于在操作中大量使用網絡的應用程序,但它們可以為其他應用程序啟用對網絡服務的簡單訪問。
若要發送數據,請將字節數組傳遞到 socket 類的數據發送方法(send 和 sendto)之一。下面的示例使用 encoding.ascii 屬性將字符串編碼到字節數組緩沖區中,然后使用 send 方法將該緩沖區傳輸到網絡設備。send 方法返回發送到網絡設備的字節數。
 [c#]
byte[] msg = system.text.encoding.ascii.getbytes("this is a test");
int bytessent = s.send(msg);

send 方法從緩沖區中移除字節,并用網絡接口將這些字節排隊以便發送到網絡設備。網絡接口可能不會立即發送數據,但它最終是會發送的,只要連接是用 shutdown 方法正常關閉的。
若要接收來自網絡設備的數據,請將緩沖區傳遞到 socket 類的數據接收方法(receive 和 receivefrom)之一。同步套接字將掛起應用程序,直到從網絡接收字節或者套接字關閉為止。下面的示例接收來自網絡的數據,然后將其顯示在控制臺上。該示例假定來自網絡的數據是用 ascii 編碼的文本。receive 方法返回從網絡接收的字節數。
 [c#]
byte[] bytes = new byte[1024];
int bytesrec = s.receive(bytes);
console.writeline("echoed text = {0}",
  system.text.encoding.ascii.getstring(bytes, 0, bytesrec));

不再需要套接字時需要釋放它,具體方法是調用 shutdown 方法,然后調用 close 方法。下面的示例釋放 socket。socketshutdown 枚舉定義常數以指示是關閉用于發送的套接字、用于接收的套接字還是用于兩者的套接字。
 [c#]
s.shutdown(socketshutdown.both);
s.clos
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 碌曲县| 青铜峡市| 叙永县| 沙田区| 宜章县| 历史| 潮州市| 宿州市| 平陆县| 诸城市| 鹤庆县| 佳木斯市| 阿拉尔市| 西乌珠穆沁旗| 旌德县| 崇仁县| 开阳县| 呼伦贝尔市| 大埔县| 紫金县| 泸溪县| 大余县| 抚顺市| 罗定市| 天峨县| 昔阳县| 基隆市| 霍山县| 苍梧县| 屏东市| 青州市| 北流市| 屯昌县| 桑植县| 镇远县| 百色市| 赫章县| 洱源县| 慈溪市| 吐鲁番市| 綦江县|