自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C# Socket類相關(guān)知識的學(xué)習(xí)

開發(fā) 后端
Socket類為網(wǎng)絡(luò)通信提供了一套豐富的方法和屬性。本文就介紹了C# Socket類方面的相關(guān)知識。

C# Socket 類為網(wǎng)絡(luò)通信提供了一套豐富的方法和屬性。Socket 類允許您使用 ProtocolType 枚舉中所列出的任何一種協(xié)議執(zhí)行異步和同步數(shù)據(jù)傳輸。Socket 類遵循異步方法的 .NET Framework 命名模式;例如,同步 Receive 方法對應(yīng)于異步 BeginReceive 和 EndReceive 方法。

如果應(yīng)用程序在執(zhí)行期間只需要一個線程,請使用下面的方法,這些方法適用于同步操作模式。

如果當(dāng)前使用的是面向連接的協(xié)議(如 TCP),則服務(wù)器可以使用 Listen 方法偵聽連接。Accept 方法處理任何傳入的連接請求,并返回可用于與遠(yuǎn)程主機(jī)進(jìn)行數(shù)據(jù)通信的 Socket??梢允褂么朔祷氐?Socket 來調(diào)用 Send 或 Receive 方法。如果要指定本地 IP 地址和端口號,請在調(diào)用 Listen 方法之前先調(diào)用 Bind 方法。如果您希望基礎(chǔ)服務(wù)提供程序?yàn)槟峙淇捎枚丝?,請使用端口?0。如果希望連接到偵聽主機(jī),請調(diào)用 Connect 方法。若要進(jìn)行數(shù)據(jù)通信,請調(diào)用 Send 或 Receive 方法。

如果當(dāng)前使用的是無連接協(xié)議(如 UDP),則根本不需要偵聽連接。調(diào)用 ReceiveFrom 方法可接受任何傳入的數(shù)據(jù)報。使用 SendTo 方法可將數(shù)據(jù)報發(fā)送到遠(yuǎn)程主機(jī)。

若要在執(zhí)行過程中使用單獨(dú)的線程處理通信,請使用下面的方法,這些方法適用于異步操作模式。

如果當(dāng)前使用的是面向連接的協(xié)議(如 TCP),則可使用 Socket、BeginConnect 和 EndConnect 方法來連接偵聽主機(jī)。通過使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以進(jìn)行異步數(shù)據(jù)通信??梢允褂?BeginAccept 和 EndAccept 處理傳入的連接請求。

如果您使用的是 UDP 等無連接協(xié)議,則可以使用 BeginSendTo 和 EndSendTo 來發(fā)送數(shù)據(jù)報,而使用 BeginReceiveFrom 和 EndReceiveFrom 來接收數(shù)據(jù)報。

如果對一個套接字執(zhí)行多個異步操作,它們不一定按啟動時的順序完成。

當(dāng)數(shù)據(jù)發(fā)送和數(shù)據(jù)接收完成之后,可使用 Shutdown 方法來禁用 Socket。在調(diào)用 Shutdown 之后,可調(diào)用 Close 方法來釋放與 Socket 關(guān)聯(lián)的所有資源。

通過C# Socket 類,您可以使用 SetSocketOption 方法來配置 Socket??梢允褂?GetSocketOption 方法來檢索這些設(shè)置。

注意

如果要編寫相對簡單的應(yīng)用程序,而且不需要最高的性能,則可以考慮使用 TcpClient、TcpListener 和 UdpClient。這些類為 Socket 通信提供了更簡單、對用戶更友好的接口。

Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows CE 平臺說明: 并非所有設(shè)備的操作系統(tǒng)會支持全部的套接字選項(xiàng)。

服務(wù)器端代碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8.  
  9. using System.Threading;  
  10. using System.Net;  
  11. using System.Net.Sockets;  
  12.  
  13. namespace ChatToolServer  
  14. {  
  15.     public partial class Form1 : Form  
  16.     {  
  17.         //server-用于處理客戶端連接請求的socket  
  18.         Socket clientSocket = null;  
  19.         delegate void del();  
  20.       
  21.         public Form1()  
  22.         {  
  23.             InitializeComponent();  
  24.         }  
  25.         //server-偵聽方法  
  26.         private void listen()  
  27.         {  
  28.             //獲取服務(wù)器IP  
  29.             string hostName = Dns.GetHostName();  
  30.             IPAddress[] ip = Dns.GetHostAddresses(hostName);  
  31.             IPAddress HostIp = ip[0];  
  32.  
  33.             //創(chuàng)建一個網(wǎng)絡(luò)端點(diǎn)  
  34.             IPEndPoint iep = new IPEndPoint(HostIp, 82);  
  35.  
  36.             //創(chuàng)建服務(wù)端服務(wù)端套接字  
  37.             Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  38.  
  39.             //將套接字與網(wǎng)絡(luò)端點(diǎn)綁定  
  40.             serverSocket.Bind(iep);  
  41.  
  42.             //將套接字置為偵聽狀態(tài),并設(shè)置最大隊(duì)列數(shù)為10  
  43.             serverSocket.Listen(10);  
  44.  
  45.             //以同步方式從偵聽套接字的連接請求隊(duì)列中提取第一個掛起的連接請求,然后創(chuàng)建并返回新的 Socket  
  46.             //新的套接字:包含對方計算機(jī)的IP和端口號,可使用這個套接字與本機(jī)進(jìn)行通信    
  47.             clientSocket = serverSocket.Accept();  
  48.             if (clientSocket != null)  
  49.             {  
  50.                 MessageBox.Show(”連接成功!”);  
  51.             }  
  52.              
  53.         }  
  54.  
  55.         private void send_Click(object sender, EventArgs e)  
  56.         {  
  57.             if (this.textBox1.Text != “”)//不能發(fā)送空消息  
  58.             {               
  59.                     try 
  60.                     {  
  61.                         //發(fā)送數(shù)據(jù)  
  62.                         string message = textBox1.Text;  
  63.                         byte[] sendbytes = System.Text.Encoding.UTF8.GetBytes(message);  
  64.                         int successSendBtyes = clientSocket.Send(sendbytes, sendbytes.Length, SocketFlags.None);  
  65.                     }  
  66.                     catch (Exception exp)  
  67.                     {  
  68.                         MessageBox.Show(exp.Message);  
  69.                     }  
  70.                     //將發(fā)送的數(shù)據(jù)顯示到對話窗口并使對話窗口的滾動條一直停留在最下方  
  71.                     this.textBox2.Text +=”服務(wù)器:”+”\r\n” +textBox1.Text + “\r\n”;//發(fā)完一條消息就換行顯示  
  72.                     this.textBox2.SelectionStart = this.textBox2.Text.Length;  
  73.                     this.textBox2.ScrollToCaret();  
  74.                     this.textBox1.Text = “”;//將發(fā)送窗口清空  
  75.                 
  76.             }  
  77.             else 
  78.             {  
  79.                 MessageBox.Show(”發(fā)送內(nèi)容不能為空”);  
  80.             }  
  81.                  
  82.         }  
  83.  
  84.         private void Form1_Load(object sender, EventArgs e)  
  85.         {  
  86.             //server-創(chuàng)建并運(yùn)行偵聽線程  
  87.             Thread threadListen = new Thread(new ThreadStart(listen));  
  88.             threadListen.Start();  
  89.         }  
  90.  
  91.         private void timer1_Tick(object sender, EventArgs e)  
  92.         {          
  93.                 byte[] receiveBytes = new byte[1024];  
  94.                 //如果偵聽后取得客戶端連接,并且客戶端的緩沖區(qū)中有內(nèi)容可讀,開始接收數(shù)據(jù)  
  95.                 if (clientSocket != null)  
  96.                 {  
  97.  
  98.                     if (clientSocket.Poll(100, SelectMode.SelectRead))  
  99.                     {  
  100.                         int successReceiveBytes = clientSocket.Receive(receiveBytes);  
  101.                         this.textBox2.Text += “客戶端:” +”(”+ clientSocket.RemoteEndPoint.ToString()+”)”+”\r\n” +  
  102.                              System.Text.Encoding.UTF8.GetString(receiveBytes, 0, successReceiveBytes) + “\r\n”;  
  103.                         this.textBox2.SelectionStart = this.textBox2.Text.Length;//使對話窗口的滾動條一直停留在最下方  
  104.                         this.textBox2.ScrollToCaret();  
  105.                     }  
  106.  
  107.                 }  
  108.         }  
  109.     }  

客戶端代碼;

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8.  
  9. using System.Net;  
  10. using System.Net.Sockets;  
  11. using System.Threading;  
  12.  
  13. namespace ChatToolClient  
  14. {  
  15.     public partial class Form1 : Form  
  16.     {  
  17.         Socket clientSocket = null;//客戶端套接字  
  18.         public Form1()  
  19.         {  
  20.             InitializeComponent();  
  21.         }  
  22.  
  23.         private void Form1_Load(object sender, EventArgs e)  
  24.         {  
  25.             try 
  26.             {  
  27.                 //建立與服務(wù)器連接的套接字  
  28.                 IPAddress ip = IPAddress.Parse(”172.16.94.134″);  
  29.                 IPEndPoint iep = new IPEndPoint(ip, 82);  
  30.                 clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  31.                 clientSocket.Connect(iep);  
  32.                 textBox2.Text = “連接成功” + “\r\n”;  
  33.                  
  34.             }  
  35.             catch (Exception exp)  
  36.             {  
  37.                 MessageBox.Show(exp.Message);  
  38.             }  
  39.         }  
  40.  
  41.         private void send_Click(object sender, EventArgs e)  
  42.         {  
  43.  
  44.             if (textBox1.Text != “”)  
  45.             {  
  46.                 try 
  47.                 {  
  48.                     //發(fā)送數(shù)據(jù)  
  49.                     string message = textBox1.Text;  
  50.                     byte[] sendbytes = System.Text.Encoding.UTF8.GetBytes(message);  
  51.                     int successSendBtyes = clientSocket.Send(sendbytes, sendbytes.Length, SocketFlags.None);  
  52.                 }  
  53.                 catch (Exception exp)  
  54.                 {  
  55.                     MessageBox.Show(exp.Message);  
  56.                 }  
  57.                 //將發(fā)送的數(shù)據(jù)顯示到對話窗口并使對話窗口的滾動條一直停留在最下方  
  58.                 this.textBox2.Text += “我自己:”+”\r\n”+textBox1.Text + “\r\n”;//發(fā)完一條消自己息就換行顯示  
  59.                 this.textBox2.SelectionStart = this.textBox2.Text.Length;  
  60.                 this.textBox2.ScrollToCaret();  
  61.                 this.textBox1.Text = “”;//將發(fā)送窗口清空  
  62.             }  
  63.             else 
  64.             {  
  65.                 MessageBox.Show(”發(fā)送內(nèi)容不能為空”);  
  66.             }  
  67.         }  
  68.  
  69.         private void timer1_Tick(object sender, EventArgs e)  
  70.         {  
  71.             byte[] receiveBytes = new byte[1024];  
  72.             if (clientSocket.Poll(100, SelectMode.SelectRead))  
  73.             {  
  74.                 int successReceiveBytes = clientSocket.Receive(receiveBytes);  
  75.                 this.textBox2.Text +=”服務(wù)器:”+”\r\n”+  
  76.                             System.Text.Encoding.UTF8.GetString(receiveBytes, 0, successReceiveBytes) + “\r\n”;  
  77.                 this.textBox2.SelectionStart = this.textBox2.Text.Length;//使對話窗口的滾動條一直停留在最下方  
  78.                 this.textBox2.ScrollToCaret();  
  79.             }       
  80.         }  
  81.     }  

C# Socket類方面的知識就介紹到這里,希望對大家有所幫助。

【編輯推薦】

  1. 淺析C#啟動停止SQL數(shù)據(jù)庫服務(wù)之方法
  2. VB.NET與C#語言之間的比較分析
  3. C# override重寫與new隱藏的區(qū)別
  4. 詳述C#泛型集合相關(guān)內(nèi)容
  5. 從Socket看Visual C#.Net網(wǎng)絡(luò)程序開發(fā)
責(zé)任編輯:book05 來源: 99081
相關(guān)推薦

2009-08-21 08:41:44

C#反射

2009-08-28 10:22:47

C# DLLImpor

2009-08-13 14:59:00

C#數(shù)據(jù)訪問層

2009-08-05 18:39:54

C#異常類

2009-08-10 14:03:08

C# COM接口

2009-08-07 13:30:20

C# Excel導(dǎo)入

2009-09-01 15:25:01

C#位域

2009-08-03 16:45:02

C#異步Socket

2009-08-18 16:45:40

C# Raw Sock

2009-06-12 09:22:44

VB.NET類型C#

2009-08-27 17:14:36

C# Socket

2009-08-24 17:07:09

C# 泛型

2010-01-15 18:35:25

C++的類

2009-08-06 15:12:22

C#異常機(jī)制

2009-08-05 18:28:05

C#異常處理

2009-07-30 18:20:21

C#繼承

2009-08-04 17:08:12

C# Thread類

2009-08-03 18:12:31

C#抽象類

2009-08-27 16:18:47

C#類C#結(jié)構(gòu)體

2009-08-07 14:00:06

C#路徑
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號