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来传送数据】就全部完成了。 

 

 

五.利用Socket来接收数据:

Visual C#在使用Socket来介绍网络传送来的数据时,要解决下面三个问题,也是完成Visual C#使用Socket来接收数据的三个步骤:

1.侦听网络,接受网络连接申请;

2..获得用以接收数据的Socket实例,并以此实例接收远程主机发送来的数据;

3.根据远程主机发送来的控制码,断开网络连接,并清除资源。

此处接收接收数据,是上面介绍的【利用Socket来传送数据】传送来的数据。

下面就是利用Socket来接收数据的具体实现步骤:

1.启动Viisual Studio .Net,并新建一个Visual C#项目,项目名称为【利用Socket来接收数据】。

2.把Visual Studio .Net的当前窗口切换到【Form1.cs(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并执行相应操作:

一个ListBox组件,用以显示接收的数据。

一个StausBar组件,用以显示接收端程序的运行状况。

一个Button组件,名称为button1,并在这个组件被拖入窗体后,双击它,则系统会在Form1.cs文件中自动产生其Click事件对应的处理代码。

3.【解决方案资源管理器】窗口中,双击Form1.cs文件,进入Form1.cs文件的编辑界面。

 

Posted on 2010-12-20 10:16  Steven Sun  阅读(195)  评论(0编辑  收藏  举报