1. 程式人生 > >C# 之 TcpClient和Socket

C# 之 TcpClient和Socket

OSI七層網路架構

OSI中的層 功能 TCP/IP協議族
應用層 檔案傳輸,電子郵件,檔案服務,虛擬終端; TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示層 資料格式化,程式碼轉換,資料加密; 沒有協議
會話層 解除或建立與別的接點的聯絡; 沒有協議
傳輸層 提供端對端的介面; TCP,UDP
網路層 為資料包選擇路由; IP,ICMP,RIP,OSPF,BGP,IGMP
資料鏈路層 傳輸有地址的幀以及錯誤檢測功能; SLIP,CSLIP,PPP,ARP,RARP,MTU
物理層 以二進位制資料形式在物理媒體上傳輸資料; ISO2110,IEEE802,IEEE802.2

簡單的理解

 物理層:HUB,網線   
 鏈路層:MAC,ARP,交換機   
 網路層:IP,ICMP,IGMP,路由器   
 傳輸層:TCP,UDP   
 會話層:HTTP,SMTP,FTP,POP3   
 表示層:SOAP,SSL   
 應用層:WebService的Method 
-------------------------------  
  Socket是對網路層操作  
  TcpClient是對傳輸層操作  
  ASP.NET是對會話層操作  
-------------------------------
TcpClient是Socket的基礎上的封裝,為了簡化一部分Socket的功能。
1>Socket支援TCP,UDP,IP包,Stream,Dgram等諸多型別

2>而TcpClient只支援TCP和Stream
一般的應用,用TcpClient可以了,或者使用NetStream,如果要做點高階的事情,建議用Socket做。

------------------------------

TcpClient 類(為 TCP 網路服務提供客戶端連線) 

備註

TcpClient 類提供了一些簡單的方法,用於在同步阻止模式下通過網路來連線、傳送和接收流資料。
為使 TcpClient 連線並交換資料,使用 TCP ProtocolType 建立的 TcpListener 或 Socket 必須偵聽是否有傳入的連線請求。可以使用下面兩種方法之一連線到該偵聽器:
建立一個 TcpClient,並呼叫三個可用的 Connect 方法之一。
使用遠端主機的主機名和埠號建立 TcpClient。此建構函式將自動嘗試一個連線。

Note注意

如果要在同步阻止模式下發送無連線資料報,請使用 UdpClient 類。
繼承說明 要傳送和接收資料,請使用 GetStream 方法來獲取一個 NetworkStream。呼叫 NetworkStream 的 Write 和 Read 方法與遠端主機之間傳送和接收資料。使用 Close 方法釋放與 TcpClient 關聯的所有資源。

下面的程式碼示例建立 TcpClient 連線

static void Connect(String server, String message) 
{
  try 
  {
    // Create a TcpClient.
    // Note, for this client to work you need to have a TcpServer 
    // connected to the same address as specified by the server, port
    // combination.
    Int32 port = 13000;
    TcpClient client = new TcpClient(server, port);
    
    // Translate the passed message into ASCII and store it as a Byte array.
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);         

    // Get a client stream for reading and writing.
   //  Stream stream = client.GetStream();
    
    NetworkStream stream = client.GetStream();

    // Send the message to the connected TcpServer. 
    stream.Write(data, 0, data.Length);

    Console.WriteLine("Sent: {0}", message);         

    // Receive the TcpServer.response.
    
    // Buffer to store the response bytes.
    data = new Byte[256];

    // String to store the response ASCII representation.
    String responseData = String.Empty;

    // Read the first batch of the TcpServer response bytes.
    Int32 bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    Console.WriteLine("Received: {0}", responseData);         

    // Close everything.
    stream.Close();         
    client.Close();         
  } 
  catch (ArgumentNullException e) 
  {
    Console.WriteLine("ArgumentNullException: {0}", e);
  } 
  catch (SocketException e) 
  {
    Console.WriteLine("SocketException: {0}", e);
  }
    
  Console.WriteLine("\n Press Enter to continue...");
  Console.Read();
}

官方連結

相關推薦

C# TcpClientSocket

OSI七層網路架構 OSI中的層 功能 TCP/IP協議族應用層 檔案傳輸,電子郵件,檔案服務,虛擬終端; TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet表示層 資料格式化,程

C語言libeventsocket示例

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <netinet/tcp.h> #include <event.h> #i

C goto void(八)

C語言 goto void 我們在 C 語言中經常會見到 void ,也會偶爾見到 goto。那麽 C 語言中既然有 goto ,為什麽我們在代碼中見的很少呢?在以前很多的項目經驗中,我們得到這樣一條潛規則:一般項目都是禁用 goto 的,程序質量與 goto 的出現次數成反比。自

C const volatile(九)

C語言 const volatile 在 C 語言中,我們經常會見到 const 和 volatile 這兩個關鍵字,那麽我們今天就來介紹下這兩個關鍵字。 先來介紹 const 關鍵字。提起 const 關鍵字,我們可能首先想到的是經過它修飾的變量便是常量了。其實我

C struct union(十)

C語言 struct union 在 C 語言中我們經常會使用到 struct 和 union,那麽它們兩個各自有何特點呢?今天我們就一探究竟。 我們先來介紹下 struct 。它可以看做是變量的集合,那麽一個空的結構體占多大內存呢?這是一個有趣的問題,按照理論分析,

C編譯鏈接(十八)

C語言 編譯 靜態鏈接 動態鏈接 我們平時所做的編譯工作其實是由編譯器來完成的,那麽編譯器都是由哪幾部分構成的呢?包括四大部分:預處理器、編譯器、匯編器以及鏈接器組成。我們來看看一個由 file.c 文件是怎樣得到 file.o 文件的,如下 a> 預編譯:

C #error #line(二十一)

C語言 #error #line 我們今天來講下 C 語言中的兩個比較偏僻的知識點,之所以說偏僻是因為在平時的代碼中我們見得很少。首先來說下 #error,它是用於生成一個編譯錯誤消息。用法如下:#error message;註意 message 不需要用雙引號包圍。#error

c#異步Socket通信

tex BE 多個 .sh interval 異步 gets 全局變量 AC 0.基於上一篇的c#之Socket(同步)通信,在幾個大神評論之後,發現是有挺多地方不足的,所以寫了一個改進版本的基於c#的異步Socket通信。再加深一下對Socket的使用和理解。其中客戶端和

C++MutexLockMutexLockGuard封裝

執行 div unistd.h sta lock ptr cas turn sleep thread.h #ifndef __WD_MUTEXLOCK_H__ #define __WD_MUTEXLOCK_H__ #include <pthread.h>

C++讀取寫入檔案

C++之讀取和寫入檔案 在C++中使用std::ifstream來讀取檔案, 使用std::ofstream來寫入檔案,比如txt, yaml等檔案。 讀取檔案 #include <string> #include <fstream> std::string file_name

C 委託事件

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++佇列優先佇列

C++ queue(佇列)Priority queue(優先佇列) 【queue】 C++佇列是一種容器介面卡,它給予程式設計師一種先進先出(FIFO)的資料結構。1.back() 返回一個引用,指向最後一個元素2.empty() 如果佇列空則返回真3.front()

C++new delete

new 和 delete要成對使用,且要採取相同形式。 使用new時,會發生2件事,1.記憶體被分配出來;2.針對此記憶體會有一個(更多)建構函式被呼叫; 使用delete,發生2件事,1.針對此記憶體的解構函式被呼叫;2.記憶體被釋放; 舉例: std::string

C#結構列舉

結構 結構是值型別資料結構,它使變數可以儲存各種資料型別的相關資料,用struct關鍵字來建立結構。結構代表一個記錄,比如你想記錄一個人的各種屬性: 姓名 性別 年齡 愛好 定義結構 用struct語句來定義一個帶有多個成員的新的資料型別

c#imagebyte相互轉換

//將image轉換成byte[]資料 private byte[] imageToByte(System.Drawing.Image _image) { MemoryStream ms = n

C++繼承動態記憶體分配

        接下來看複製建構函式,預設複製建構函式執行成員複製,這對於動態記憶體分配來說是不合適的,但對於派生類成員來說是合適的,因此只需要考慮繼承的基類物件,成員複製將根據資料型別採用相應的複製方式,複製類成員或者整合的類元件的時候,則是使用該類的複製建構函式完成的。所以,派生類的預設複製建構函式使用顯

C#裝箱拆箱

簡介:         我們都知道,C#中的每一種型別要麼是值型別,要麼是引用型別。所以每個物件要麼是值型別的例項,要麼是引用型別的例項。      值型別和引用型別之間的轉換稱為裝箱和拆箱。  

linux c解決使用socket函式返回為0的問題

1、問題: 在 linux 平臺下 寫socket,實現簡單的tcp通訊,服務端第一次呼叫 socket函式返回 0 2、找原因: 我的程式碼是這樣寫的 if ((server_sockfd = socket(AF_INET,SOCK_STREAM, 0) <

c++引用指標的區別聯絡

區別: 1 引用不能為空(必須初始化),指標可為空。 int &a; // error int *a; // ok 2 引用關係一旦被建立,則不能被解除,而指標可以指向別人。 int x = 1, y = 2; int &a = x; a = y;

C++setmultiset紅黑樹

set和multiset 會根據特定的排序準則,自動將元素排序。兩者不同之處,在於multiset允許元素重複,而set不允許重複,如圖1所示。圖1 set和multiset在使用set和multiset之前,需要包含頭標頭檔案<set>,Set 和multise