Socket監聽與TcpListener監聽的區別和用法


socket是針對應用層和傳輸層之間封裝的接口

 

Tcplistener是對socket tcp協議封裝的接口,更便於開發

1.利用Tcp協議編程
1)服務器端:
     a)建立TCP監聽器TcpListener對象。
                   TcpListener tl=new TcpListener(端口號);
     b)啟動監聽器
                    tl.Start();
     c)用監聽器獲取連接進來的套接字(Socket)
                    Socket s=myList.AcceptSocket();
     d)通過Socket的Receive方法獲取客戶端發送的數據
                   byte [] result=new byte[1024];
                   int k=s.Receive(result);
      e)通過Socket的Send方法向客戶端發送數據
                    byte[] st=System.Text.Encoding.Default.GetBytes(“text”);
                    s.Send(st);
      f)在通訊結束后,需要釋放資源結束監聽
                    s.Close();
                    tl.Stop();
2)客戶端:
     a)建立TCP客戶端TcpClient對象。
                    TcpClient tcpclnt = new TcpClient();
     b)連接服務器
                      tcpclnt.Connect(IP地址字符串,端口號);
     c)獲得客戶端網絡傳輸 流
                      Stream stm =tcpclnt.GetStream();
     d)通過Stream的Write方法向服務器端發送的數據
     e)通過Stream的Read方法讀取服務器段發來的數據
     f)在通訊結束后,需要釋放資源,結束和服務器的連接
                      tcpclnt.Close();
2.利用UDP協議編程
a)建立UDP客戶端UdpClient對象。
         UdpClient uc=new UdpClient(端口號);
b)連接對方遠程主機
         uc.Connect(IP地址,對方遠程主機的端口號);
c)通過uc的Receive方法獲取遠程主機發送來的數據
    IPEndPoint ip=new IPEndPoint(IPAddress.Parse(IP字符串),端口號);
    byte[] b=uc.Receive(ref ip);
e)通過uc的Send方法向遠程主機發送數據
          byte[] st=System.Text.Encoding.Default.GetBytes(“text”);
          uc.Send(st);
f)在通訊結束后,需要釋放資源

          uc.Close(); 

 

如果你已在此地址上做了發送數據的socket或tcpclient或udp,那么這個監聽和發送在同一個端口上就會發生錯誤的。



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

class MyTcpListener 

public static void Main() 

TcpListener server=null; 
try 

// Set the TcpListener on port 13000. 
Int32 port = 13000; 
IPAddress localAddr = IPAddress.Parse("127.0.0.1"); 

// TcpListener server = new TcpListener(port); 
server = new TcpListener(localAddr, port); 

// Start listening for client requests. 
server.Start(); 

// Buffer for reading data 
Byte[] bytes = new Byte[256]; 
String data = null; 

// Enter the listening loop. 
while(true) 

Console.Write("Waiting for a connection... "); 

// Perform a blocking call to accept requests. 
// You could also user server.AcceptSocket() here. 
TcpClient client = server.AcceptTcpClient(); 
Console.WriteLine("Connected!"); 

data = null; 

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

int i; 

// Loop to receive all the data sent by the client. 
while((i = stream.Read(bytes, 0, bytes.Length))!=0) 

// Translate data bytes to a ASCII string. 
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
Console.WriteLine("Received: {0}", data); 

// Process the data sent by the client. 
data = data.ToUpper(); 

byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); 

// Send back a response. 
stream.Write(msg, 0, msg.Length); 
Console.WriteLine("Sent: {0}", data); 


// Shutdown and end connection 
client.Close(); 


catch(SocketException e) 

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

finally 

// Stop listening for new clients. 
server.Stop(); 



Console.WriteLine("\nHit enter to continue..."); 
Console.Read(); 

C# .net2.0 套接字編程實例 UDP TCP通信
         首先從原理上解釋一下采用Socket接口的網絡通訊,這里以最常用的C/S模式作為范例,首先,服務端有一個進程(或多個進程)在指定的端口等待客戶來連接,服務程序等待客戶的連接信息,一旦連接上之后,就可以按設計的數據交換方法和格式進行數據傳輸。客戶端在需要的時刻發出向服務端的連接請求。這里為了便於理解,提到了一些調用及其大致的功能。使用socket調用后,僅產生了一個可以使用的socket描述符,這時還不能進行通信,還要使用其他的調用,以使得socket所指的結構中使用的信息被填寫完。
 

  在使用TCP協議時,一般服務端進程先使用socket調用得到一個描述符,然后使用bind調用將一個名字與socket描述符連接起來,對於Internet域就是將Internet地址聯編到socket。之后,服務端使用listen調用指出等待服務請求隊列的長度。然后就可以使用accept調用等待客戶端發起連接,一般是阻塞等待連接,一旦有客戶端發出連接,accept返回客戶的地址信息,並返回一個新的socket描述符,該描述符與原先的socket有相同的特性,這時服務端就可以使用這個新的socket進行讀寫操作了。一般服務端可能在accept返回后創建一個新的進程進行與客戶的通信,父進程則再到accept調用處等待另一個連接。客戶端進程一般先使用socket調用得到一個socket描述符,然后使用connect向指定的服務器上的指定端口發起連接,一旦連接成功返回,就說明已經建立了與服務器的連接,這時就可以通過socket描述符進行讀寫操作了。

 

.NetFrameWork為Socket通訊提供了System.Net.Socket命名空間,在這個命名空間里面有以下幾個常用的重要類分別是:

  ·Socket類這個低層的類用於管理連接,WebRequest,TcpClient和UdpClient在內部使用這個類。

  ·NetworkStream類這個類是從Stream派生出來的,它表示來自網絡的數據流

  ·TcpClient類允許創建和使用TCP連接

  ·TcpListener類允許監聽傳入的TCP連接請求

  ·UdpClient類用於UDP客戶創建連接(UDP是另外一種TCP協議,但沒有得到廣泛的使用,主要用於本地網絡)

  下面我們來看一個基於Socket的雙機通信代碼的C#版本

  首先創建Socket對象的實例,這可以通過Socket類的構造方法來實現:

public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType); 

  其中,addressFamily 參數指定 Socket 使用的尋址方案,socketType 參數指定 Socket 的類型,protocolType 參數指定 Socket 使用的協議。

  下面的示例語句創建一個 Socket,它可用於在基於 TCP/IP 的網絡(如 Internet)上通訊。

Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

  若要使用 UDP 而不是 TCP,需要更改協議類型,如下面的示例所示:

Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

  一旦創建 Socket,在客戶端,你將可以通過Connect方法連接到指定的服務器(你可以在Connect方法前Bind端口,就是以指定的端口發起連接,如果不事先Bind端口號的話,系統會默認在1024到5000隨機綁定一個端口號),並通過Send方法向遠程服務器發送數據,而后可以通過Receive從服務端接收數據;而在服務器端,你需要使用Bind方法綁定所指定的接口使Socket與一個本地終結點相聯,並通過Listen方法偵聽該接口上的請求,當偵聽到用戶端的連接時,調用Accept完成連接的操作,創建新的Socket以處理傳入的連接請求。使用完 Socket 后,使用 Close 方法關閉 Socket。

  可以看出,以上許多方法包含EndPoint類型的參數,在Internet中,TCP/IP 使用一個網絡地址和一個服務端口號來唯一標識設備。網絡地址標識網絡上的特定設備;端口號標識要連接到的該設備上的特定服務。網絡地址和服務端口的組合稱為終結點,在 .NET 框架中正是由 EndPoint 類表示這個終結點,它提供表示網絡資源或服務的抽象,用以標志網絡地址等信息。.Net同時也為每個受支持的地址族定義了 EndPoint 的子代;對於 IP 地址族,該類為 IPEndPoint。IPEndPoint 類包含應用程序連接到主機上的服務所需的主機和端口信息,通過組合服務的主機IP地址和端口號,IPEndPoint 類形成到服務的連接點。

  用到IPEndPoint類的時候就不可避免地涉及到計算機IP地址,System.Net命名空間中有兩種類可以得到IP地址實例:

  ·IPAddress類:IPAddress 類包含計算機在 IP 網絡上的地址。其Parse方法可將 IP 地址字符串轉換為 IPAddress 實例。下面的語句創建一個 IPAddress 實例:

IPAddress myIP = IPAddress.Parse("192.168.0.1"); 

  需要知道的是:Socket 類支持兩種基本模式:同步和異步。其區別在於:在同步模式中,按塊傳輸,對執行網絡操作的函數(如 Send 和 Receive)的調用一直等到所有內容傳送操作完成后才將控制返回給調用程序。在異步模式中,是按位傳輸,需要指定發送的開始和結束。同步模式是最常用的模式,我們這里的例子也是使用同步模式。

原文鏈接:https://blog.csdn.net/vrmogui/article/details/108881978


免責聲明!

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



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