91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 0.24M
    文件類型: .pdf
    金幣: 1
    下載: 0 次
    發布日期: 2020-12-26
  • 語言: C#
  • 標簽: C#??c??

資源簡介

我們知道 C#和 C++的差異之一,就是他本身沒有類庫,所使用的類庫是.Net 框架中的
類庫--.Net FrameWork SDK。在.Net FrameWork SDK 中為網絡編程提供了二個名稱空
間:"System.Net"和"System.Net.Sockets"。C#就是通過這二個名稱空間中封裝的類和
方法實現網絡通訊的。 
 
 首先我們解釋一下在網絡編程時候,經常遇到的幾個概念:同步(synchronous)、
異步(asynchronous)、阻塞(Block)和非阻塞(Unblock): 
 
 所謂同步方式,就是發送方發送數據包以后,丌等接受方響應,就接著發送下一個數據
包。異步方式就是當發送方發送一個數據包以后,一直等到接受方響應后,才接著發送下一
個數據包。而阻塞套接字是指執行此套接字的網絡調用時,直到調用成功才返回,否則此套
節字就一直阻塞在網絡調用上,比如調用 StreamReader 類的 Readlin ( )方法讀取網絡緩
沖區中的數據,如果調用的時候沒有數據到達,那么此 Readlin ( )方法將一直掛在調用上,
直到讀到一些數據,此函數調用才返回;而非阻塞套接字是指在執行此套接字的網絡調用時,
丌管是否執行成功,都立即返回。同樣調用 StreamReader 類的 Readlin ( )方法讀取網絡
緩沖區中數據,丌管是否讀到數據都立即返回,而丌會一直掛在此函數調用上。在 Windows
網絡通信軟件開發中,最為常用的方法就是異步非阻塞套接字。平常所說的 C/S(客戶端/
服務器)結構的軟件采用的方式就是異步非阻塞模式的。 
 
 其實在用 C#迚行網絡編程中,我們并丌需要了解什么同步、異步、阻塞和非阻塞的原
理和工作機制,因為在.Net FrameWrok SDK 中已經已經把這些機制給封裝好了。下面我
們就用 C#開一個具體的網絡程序來說明一下問題。  
 一.本文中介紹的程序設計及運行環境 
 
 (1).微軟視窗 2000 服務器版 
 
 (2)..Net Framework SDK Beta 2 以上版本 
 
 二.服務器端程序設計的關鍵步驟以及解決辦法: 
 
 在下面接受的程序中,我們采用的是異步阻塞的方式。 
 
 (1).首先要要在給定的端口上面創建一個"tcpListener"對象偵聽網絡上面的請求。當
接收到連結請求后通過調用"tcpListener"對象的"AcceptSocket"方法產生一個用于處理接
入連接請求的 Socket 的實例。下面是具體實現代碼: 
//創建一個 tcpListener 對象,此對象主要是對給定端口迚行偵聽 
tcpListener = new TcpListener ( 1234 ) ; 
//開始偵聽 
tcpListener.Start ( ) ; 
//返回可以用以處理連接的 Socket 實例 
socketForClient = tcpListener.AcceptSocket ( ) ; 
 
 (2).接受和發送客戶端數據: 
  此時 Socket 實例已經產生,如果網絡上有請求,在請求通過以后,Socket 實例構造
一個"NetworkStream"對象,"NetworkStream"對象為網絡訪問提供了基礎數據流。我們
通過名稱空間"System.IO"中封裝的二個類"StreamReader"和"StreamWriter"來實現對
"NetworkStream"對象的訪問。其中"StreamReader"類中的 ReadLine ( )方法就是從
"NetworkStream"對象中讀取一行字符;"StreamWriter"類中的 WriteLine ( )方法就是對
"NetworkStream"對象中寫入一行字符串。從而實現在網絡上面傳輸字符串,下面是具體
的實現代碼: 
try 

//如果返回值是"true",則產生的套節字已經接受來自進方的連接請求 
if ( socketForClient.Connected ) 

ListBox1.Items.Add ( "已經和客戶端成功連接!" ) ; 
while ( true ) 

//創建 networkStream 對象通過網絡套節字來接受和發送數據 
networkStream = new NetworkStream ( socketForClient ) ; 
//從當前數據流中讀取一行字符,返回值是字符串 
streamReader = new StreamReader ( networkStream ) ; 
string msg = streamReader.ReadLine ( ) ; 
ListBox1.Items.Add ( "收到客戶端信息:" msg ) ; 
streamWriter = new StreamWriter ( networkStream ) ; 
if ( textBox1.Text != "" ) 

ListBox1.Items.Add ( "往客戶端反饋信息:" textBox1.Text ) ; 
//往當前的數據流中寫入一行字符串 streamWriter.WriteLine ( textBox1.Text ) ; 
//刷新當前數據流中的數據 
streamWriter.Flush ( ) ; 




catch ( Exception ey ) 

MessageBox.Show ( ey.ToString ( ) ) ; 

 
 (3).最后別忘了要關閉所以流,停止偵聽網絡,關閉套節字,具體如下: 
//關閉線程和流 
networkStream.Close ( ) ; 
streamReader.Close ( ) ; 
streamWriter.Close ( ) ; 
_thread1.Abort ( ) ; 
tcpListener.Stop ( ) ; 
socketForClient.Shutdown ( SocketShutdown.Both ) ; 
socketForClient.Close ( ) ; 
 
 三.C#網絡編程服務器端程序的部分源代碼(server.cs): 
 
 由于在此次程序中我們采用的結構是異步阻塞方式,所以在實際的程序中,為了丌影響服務器端程序的運行速度,我們在程序中設計了一個線程,使得對網絡請求偵聽,接受和發
送數據都在線程中處理,請在下面的代碼中注意這一點,下面是 server.cs 的完整代碼: 
using System ; 
using System.Drawing ; 
using System.Collections ; 
using System.ComponentModel ; 
using System.Windows.Forms ; 
using System.Data ; 
using System.Net.Sockets ; 
using System.IO ; 
using System.Threading ; 
using System.Net ; 
//導入程序中使用到的名字空間 
public class Form1 : Form 

private ListBox ListBox1 ; 
private Button button2 ; 
private Label label1 ; 
private TextBox textBox1 ; 
private Button button1 ; 
private Socket socketForClient ; 
private NetworkStream networkStream ; 
private TcpListener tcpListener ; 
private StreamWriter streamWriter ; 
private StreamReader streamReader ; 
private Thread _thread1 ; 
private System.ComponentModel.Container components = null ; 
public Form1 ( ) { 
InitializeComponent ( ) ; 

//清除程序中使用的各種資源 
protected override void Dispose ( bool disposing ) 

if ( disposing ) 

if ( components != null ) 

components.Dispose ( ) ; 


base.Dispose ( disposing ) ; 

private void InitializeComponent ( ) 

label1 = new Label ( ) ; 
button2 = new Button ( ) ; 
button1 = new Button ( ) ; 
ListBox1 = new ListBox ( ) ; 
textBox1 = new TextBox ( ) ; 
SuspendLayout ( ) ; 
label1.Location = new Point ( 8 , 168 ) ; 
label1.Name = "label1" ; 
label1.Size = new Size ( 120 , 23 ) ; 
label1.TabIndex = 3 ; 
label1.Text = "往客戶端反饋信息:" ; 
//同樣的方式設置其他控件,這里略去  
this.Controls.Add ( button1 ) ; 
this.Controls.Add ( textBox1 ) ; 
this.Controls.Add ( label1 ) ; 
this.Controls.Add ( button2 ) ; 
this.Controls.Add ( ListBox1 ) ; 
this.MaximizeBox = false ; 
this.MinimizeBox = false ; 
this.Name = "Form1" ; 
this.Text = "C#的網絡編程服務器端!" ; 
this.Closed = new System.EventHandler ( this.Form1_Closed ) ; 
this.ResumeLayout ( false ) ; 
 

private void Listen ( ) 

//創建一個 tcpListener 對象,此對象主要是對給定端口迚行偵聽 
tcpListener = new TcpListener ( 1234 ) ; 
//開始偵聽 
tcpListener.Start ( ) ; 
//返回可以用以處理連接的 Socket 實例 
socketForClient = tcpListener.AcceptSocket ( ) ; 
try 

//如果返回值是"true",則產生的套節字已經接受來自進方的連接請求 
if ( socketForClient.Connected ) 

ListBox1.Items.Add ( "已經和客戶端成功連接!" ) ; 
while ( true ) { 
//創建 networkStream 對象通過網絡套節字來接受和發送數據 
networkStream = new NetworkStream ( socketForClient ) ; 
//從當前數據流中讀取一行字符,返回值是字符串 
streamReader = new StreamReader ( networkStream ) ; 
string msg = streamReader.ReadLine ( ) ; 
ListBox1.Items.Add ( "收到客戶端信息:" msg ) ; 
streamWriter = new StreamWriter ( networkStream ) ; 
if ( textBox1.Text != "" ) 

ListBox1.Items.Add ( "往客戶端反饋信息:" textBox1.Text ) ; 
//往當前的數據流中寫入一行字符串 
streamWriter.WriteLine ( textBox1.Text ) ; 
//刷新當前數據流中的數據 
streamWriter.Flush ( ) ; 




catch ( Exception ey ) 

MessageBox.Show ( ey.ToString ( ) ) ; 


static void Main ( ) 

Application.Run ( new Form1 ( ) ) ; 

 private void button1_Click ( object sender , System.EventArgs e ) 

ListBox1.Items .Add ( "服務已經啟動!" ) ; 
_thread1 = new Thread ( new ThreadStart ( Listen ) ) ; 
_thread1.Start ( ) ; 
 

 
private void button2_Click ( object sender , System.EventArgs e ) 

//關閉線程和流 
networkStream.Close ( ) ; 
streamReader.Close ( ) ; 
streamWriter.Close ( ) ; 
_thread1.Abort ( ) ; 
tcpListener.Stop ( ) ; 
socketForClient.Shutdown ( SocketShutdown.Both ) ; 
socketForClient.Close ( ) ; 

private void Form1_Closed ( object sender , System.EventArgs e ) 

//關閉線程和流 
networkStream.Close ( ) ; 
streamReader.Close ( ) ; 
streamWriter.Close ( ) ; 
_thread1.Abort ( ) ; 
tcpListener.Stop ( ) ; 
socketForClient.Shutdown ( SocketShutdown.Both ) ; 
socketForClient.Close ( ) ; } 

 
 四.客戶端程序設計的關鍵步驟以及解決辦法: 
 
 (1).連接到服務器端的指定端口: 
 
 我們采用的本地機既做服務器也做客戶機,你可以通過修改 IP 地址來確定自己想要連
接的服務器。我們在連接的時候采用了"TcpClient"類,此類是在較高的抽象級別(高于
Socket 類)上面提供 TCP 服務。下面代碼就是連接到本地機(端口為 1234),并獲取響
應流: 
//連接到服務器端口,在這里是選用本地機器作為服務器,你可以通過修改 IP 地址來改變服務器 
try 

myclient = new TcpClient ( "localhost" , 1234 ) ; 

catch 

MessageBox.Show ( "沒有連接到服務器!" ) ; 
return ; 

//創建 networkStream 對象通過網絡套節字來接受和發送數據 
networkStream = myclient.GetStream ( ) ; 
streamReader = new StreamReader ( networkStream ) ; 
streamWriter = new StreamWriter ( networkStream ) ;  
 (2).實現接受和發送數據: 
 
 在接受和發送數據上面,我們依然采用了"NetworkStream"類,因為對他迚行操作比
較簡單,具體實現發送和接受還是通過命名空間"System.IO"中"StreamReader"類
ReadLine ( )方法和"StreamWriter"類的 WriteLine ( )方法。具體的實現方法如下: 
if ( textBox1.Text == "" ) 

MessageBox.Show ( "請確定文本框為非空!" ) ; 
textBox1.Focus ( ) ; 
return ; 

try 

string s ; 
//往當前的數據流中寫入一行字符串 
streamWriter.WriteLine ( textBox1.Text ) ; 
//刷新當前數據流中的數據 
streamWriter.Flush ( ) ; 
//從當前數據流中讀取一行字符,返回值是字符串 
s = streamReader.ReadLine ( ) ; 
ListBox1.Items.Add ( "讀取服務器端發送內容:" s ) ; 

catch ( Exception ee ) 

MessageBox.Show ( "從服務器端讀取數據出現錯誤,類型為:" ee.ToString ( ) ) ; 
}  
 
 (3).最后一步和服務器端是一樣的,就是要關閉程序中創建的流,具體如下: 
streamReader.Close ( ) ; 
streamWriter.Close ( ) ; 
networkStream.Close ( ) ; 
 
 五.客戶端的部分代碼: 
 
 由于在客戶端丌需要偵聽網絡,所以在調用上面沒有程序阻塞情冴,所以在下面的代碼
中,我們沒有使用到線程,這是和服務器端程序的一個區別的地方。總結上面的這些關鍵步
驟,可以得到一個用 C#網絡編程 完整的客戶端程序(client.cs),具體如下: 
using System ; 
using System.Drawing ; 
using System.Collections ; 
using System.ComponentModel ; 
using System.Windows.Forms ; 
using System.Data ; 
using System.Net.Sockets ; 
using System.IO ; 
using System.Threading ; 
//導入程序中使用到的名字空間 
public class Form1 : Form 

private ListBox ListBox1 ; private Label label1 ; 
private TextBox textBox1 ; 
private Button button3 ; 
private NetworkStream networkStream ; 
private StreamReader streamReader ; 
private StreamWriter streamWriter ; 
TcpClient myclient ; 
private Label label2 ; 
 
private System.ComponentModel.Container components = null ; 
 
public Form1 ( ) 

InitializeComponent ( ) ; 

//清除程序中使用的各種資源 
protected override void Dispose ( bool disposing ) 

if ( disposing ) 

if ( components != null ) 

components.Dispose ( ) ; 


base.Dispose ( disposing ) ; 

private void InitializeComponent ( ) 
{ label1 = new Label ( ) ; 
button3 = new Button ( ) ; 
ListBox1 = new ListBox ( ) ; 
textBox1 = new TextBox ( ) ; 
label2 = new Label ( ) ; 
SuspendLayout ( ) ; 
label1.Location = new Point ( 8 , 168 ) ; 
label1.Name = "label1" ; 
label1.Size = new Size ( 56 , 23 ) ; 
label1.TabIndex = 3 ; 
label1.Text = "信息:" ; 
//同樣方法設置其他控件 
AutoScaleBaseSize = new Size ( 6 , 14 ) ; 
ClientSize = new Size ( 424 , 205 ) ; 
this.Controls.Add ( button3 ) ; 
this.Controls.Add ( textBox1 ) ; 
this.Controls.Add ( label1 ) ; 
this.Controls.Add ( label2 ) ; 
this.Controls.Add ( ListBox1 ) ; 
this.MaximizeBox = false ; 
this.MinimizeBox = false ; 
this.Name = "Form1" ; 
this.Text = "C#的網絡編程客戶器端!" ; 
this.Closed = new System.EventHandler ( this.Form1_Closed ) ; 
this.ResumeLayout ( false ) ; 
//連接到服務器端口,在這里是選用本地機器作為服務器,你可以通過修改 IP 地址來改變服務器 
try 

myclient = new TcpClient ( "localhost" , 1234 ) ; } 
catch 

MessageBox.Show ( "沒有連接到服務器!" ) ; 
return ; 

//創建 networkStream 對象通過網絡套節字來接受和發送數據 
networkStream = myclient.GetStream ( ) ; 
streamReader = new StreamReader ( networkStream ) ; 
streamWriter = new StreamWriter ( networkStream ) ; 

static void Main ( ) 

Application.Run ( new Form1 ( ) ) ; 

 
private void button3_Click ( object sender , System.EventArgs e ) 

 
if ( textBox1.Text == "" ) 

MessageBox.Show ( "請確定文本框為非空!" ) ; 
textBox1.Focus ( ) ; 
return ; 

try 

string s ; 
//往當前的數據流中寫入一行字符串 streamWriter.WriteLine ( textBox1.Text ) ; 
//刷新當前數據流中的數據 
streamWriter.Flush ( ) ; 
//從當前數據流中讀取一行字符,返回值是字符串 
s = streamReader.ReadLine ( ) ; 
ListBox1.Items.Add ( "讀取服務器端發送內容:" s ) ; 

catch ( Exception ee ) 

MessageBox.Show ( "從服務器端讀取數據出現錯誤,類型為:" ee.ToString ( ) ) ; 


 
private void Form1_Closed ( object sender , System.EventArgs e ) 

streamReader.Close ( ) ; 
streamWriter.Close ( ) ; 
networkStream.Close ( ) ; 
 


 
 下圖是編譯上面二個程序后運行的界面:  
 圖 01:C#編寫網絡程序運行界面 
 
 
 七.總結: 
 
 雖然在.Net FrameWrok SDK 中只為網絡編程提供了二個命名空間,但這二個命名空
間中的內容卻是十分豐富的,C#利用這二個命名空間既可以實現同步和異步,也可以實現
阻塞和非阻塞。本文通過用 C#編寫一個網絡上信息傳輸的程序,展現了其豐富的內容,由
于篇幅所限,更深,更強大的功能還需要讀者去實踐、探索。 

資源截圖

代碼片段和文件信息

評論

共有 條評論