程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#網絡編程初探(4)

C#網絡編程初探(4)

編輯:關於C語言

五.客戶端的部分代碼:

由於在客戶端不需要偵聽網絡,所以在調用上面沒有程序阻塞情況,所以在下面的代碼中,我們沒有使用到線程,這是和服務器端程序的一個區別的地方。總結上面的這些關鍵步驟,可以得到一個用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#編寫一個網絡上信息傳輸的程序,展現了其豐富的內容,由於篇幅所限,更深,更強大的功能還需要讀者去實踐、探索。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved