C#託管Socket的實現方法(3)

6.在Form1的class代碼區中加入下列代碼,下列代碼的作用是定義全局變量和創建全局使用的實例:
int port = 8000 ;
//定義偵聽端口號
private TcpClient tcpc ;
//對服務器端創建TCP連接
private Socket stSend ;
//創建發送數據套接字
private bool tcpConnect = false ;
//定義標識符,用以表示TCP連接是否建立 
7.用下列代碼替換Form1.cs中的button1組件的Click事件對應的處理代碼,下列代碼的功能是初始化以創建的Socket實例,並向遠程終結點提出連接申請,並判斷連接是否建立:
private void button1_Click
object sender , System.EventArgs e )
{
//以下代碼是判斷是否和遠程終結點成功連接
try
{
stSend 
= new Socket ( AddressFamily.InterNetwork ,
SocketType.Stream , ProtocolType.Tcp ) ;
//初始化一個Socket實例
IPEndPoint tempRemoteIP = new IPEndPoint
( IPAddress.Parse ( textBox1.Text ) , port ) ;
//根據IP地址和端口號創建遠程終結點
EndPoint epTemp = ( EndPoint ) tempRemoteIP ;
stSend.Connect ( epTemp ) ;
//連接遠程主機的8000端口號
statusBar1.Text = "成功連接遠程計算機!" ;
tcpConnect 
= true ;
button1.Enabled 
= false ;
button2.Enabled 
= true ;
}

catch ( Exception )
{
statusBar1.Text 
= "目標計算機拒絕連接請求!" ;
}

}
  8.用下列代碼替換Form1.cs中button2組件的Click事件對應的處理代碼,下列代碼的功能是通過已建立的連接,利用Socket來傳送數據到遠程主機。
private void button2_Click
object sender , System.EventArgs e )
{
int iLength = textBox2.Text.Length ;
//獲取要發送的數據的長度
Byte [ ] bySend = new byte [ iLength ] ;
//根據獲取的長度定義一個Byte類型數組
bySend = System.Text.Encoding.Default.GetBytes
( textBox2.Text ) ;
//按照指定編碼類型把字符串指定到指定的Byte數組
int i = stSend.Send ( bySend ) ;
//發送數據
listBox1.Items.Add ( textBox2.Text ) ;
}
 
9.用下列代碼替換Form1.cs中“清理所有正在使用的資源。”對應的代碼。其作用是在程序退出之前,判斷連接狀態,如果沒有退出,則向遠程主機發送 控制碼“STOP”,用以斷開和遠程主機的連接,並清除相應資源。所謂控制碼就是網絡應用程序之間彼此交換信息的一種自定義碼子,應用程序通過接收、發送 這些碼子,可以明確網絡應用程序的行爲,保證執行的一致性,也就少了很多出錯的機率。控制碼在編寫遠程控制方面的應用程序時使用比較多。之所以要有這一步 是因爲在用Visual C#編寫網絡應用程序的時候,很多人都遇到這樣的情況。當程序退出後,通過Windows的“資源管理器”看到的是進程數目並沒有減少。這是因爲程序中使 用的線程可能並沒有有效退出。雖然Thread類中提供了“Abort”方法用以中止進程,但並不能夠保證成功退出。因爲進程中使用的某些資源並沒有回 收。可見在某些情況下,依靠Visual C#的垃圾回收器也不能保證完全的回收資源,這時就需要我們自己手動回收資源的。下面就是手動回收資源採用的一種方法:
protected override void Dispose ( bool disposing )
{
if ( tcpConnect )
{
Byte [ ] bySend 
= new byte [ 4 ] ;
//根據字符串“STOP”長度來定義Byte數組
bySend = System.Text.Encoding.
Default.GetBytes ( 
"STOP" ) ;
int i = stSend.Send ( bySend ) ;
//發送控制碼
stSend.Close ( ) ;
//關閉套接字
}

if ( disposing )
{
if ( components != null )
{
components.Dispose ( ) ;
}

}

base.Dispose ( disposing ) ;
}
至此在上述步驟都正確執行後,【利用Socket來傳送數據】就全部完成了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章