C#网络编程初探(2)

来源:互联网 发布:输入数组并求最小值 编辑:程序博客网 时间:2024/06/05 04:58
 C#网络编程初探(2)
作者: 马金虎   www.ASPCool.com 时间:2002-6-25 18:00:29  阅读次数:7244

     三.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 ( ) ;
  }
  }

原创粉丝点击