专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » socket怎么实现:Visual C#托管Socket的实现思路方法(一) »正文

socket怎么实现:Visual C#托管Socket的实现思路方法(一)

来源: 发布时间:星期五, 2009年1月9日 浏览:84次 评论:0
  Socket就是套接字它是网络编程中最常用遇到概念和工具在TCP/IP网络中传送和接收数据就会经常使用到Socket由于使用Socket能够在网络上处理复杂数据所以在各种网络应用涉及到数据传送和接收般都会使用Socket可见要掌握网络编程精通Socket是非常重要由于Socket本身复杂性决定了掌握它是比较困难Visual C#是微软公司推荐开发.Net平台应用主要语言随着.Net深入人心目前很多有远见公司都把以前软件Software转向了.Net平台掌握网络编程始终是学习种开发语言重点点对于Visual C#也同样如此Visual C#实现网络功能其关键也是掌握托管Socket使用思路方法本文就来详细介绍Visual C#中利用托管Socket实现网络数据传送和接收实现思路方法及其注意事项 

  .Visual C#中操作Socket:

  虽然Visual C#可以使用NetworkStream来传送、接收数据但NetworkStream在使用中有很大局限性利用NetworkStream只能传送和接收类型数据如果要传送些复杂数据如: 2进制数据等它就显得能力有限了但使用NetworkStream在处理自身可操作数据时确要比Socket方便许多Socket(套接字)几乎可以处理任何在网络中需要传输数据类型

  我们知道Visual C#和Visual C++区别的就是Visual C#没有属于自己类库而Visual C++却是有Visual C#使用类库是.Net框架为所有开发.Net平台语言提供个公用类库——.Net FrameWork SDKVisual C#主要网络功能主要使用.Net FrameWork SDK中提供 2个命名空间“.Net.Sockets”和“.Net”而实现Socket使用是命名空间“.Net.Sockets”中Socket类Visual C#通过创建Socket类例子来实现Socket托管版本在Visual C#中创建完Socket例子后可以通过此Socket例子Bind思路方法绑定到网络中指定终结点也可以通过其Connect思路方法向指定终结点建立连接连接创建完毕就可以使用其Send或SendTo思路方法将数据发送到Socket;同样使用其Receive或ReceiveFrom思路方法从Socket中读取数据在Socket使用完毕后请使用其Shutdown思路方法禁用Socket并使用Close思路方法关闭Socket表01和表02是Socket类中常用属性和思路方法及其简要介绍说明

  属性

  介绍说明

  AddressFamily

  获取Socket地址族

  Available

  获取已经从网络接收且可供读取数据量

  Blocking

  获取或设置个值该值指示Socket是否处于阻塞模式

  Connected

  获取个值该值指示Socket是否已连接到远程资源

  Handle

  获取Socket操作系统句柄

  LocalEndPo

  获取本地终结点

  ProtocolType

  获取Socket协议类型

  RemoteEndPo

  获取远程终结点

  SocketType

  获取Socket类型

  表01:Socket类常用属性及其介绍说明

  思路方法

  介绍说明

  Accept

  创建新Socket以处理传入连接请求

  BeginAccept

  开始个异步请求以创建新Socket来接受传入连接请求

  BeginConnect

  开始对网络设备连接异步请求

  BeginReceive

  开始从连接Socket中异步接收数据

  BeginReceiveFrom

  开始从指定网络设备中异步接收数据

  BeginSend

  将数据异步发送到连接

  BeginSendTo

  向特定远程主机异步发送数据

  Bind

  使Socket和个本地终结点相关联

  Close

  强制Socket连接关闭

  Connect

  建立到远程设备连接

  EndAccept

  结束异步请求以创建新Socket来接受传入连接请求

  EndConnect

  结束挂起异步连接请求

  EndReceive

  结束挂起异步读取

  EndReceiveFrom

  结束挂起、从特定终结点进行异步读取

  EndSend

  结束挂起异步发送

  EndSendTo

  结束挂起、向指定位置进行异步发送

  GetSocketOption

  返回Socket选项

  IOControl

  为Socket设置低级别操作模式

  Listen

  将Socket置于侦听状态

  Poll

  Receive

  接收来自连接Socket数据

  ReceiveFrom

  接收数据文报并存储源终结点

  Select

  确定个或多个套接字状态

  Send

  将数据发送到连接

  SendTo

  将数据发送到特定终结点

  SetSocketOption

  设置Socket选项

  Shutdown

  禁用某Socket上发送和接收

  表02:Socket类常用思路方法及其介绍说明

  其中“BeginAccept”和“EndAccept”、“BeginConnect”和“EndConnect”、

  “BeginReceive”和“EndReceive”、“BeginReceiveFrom”和“EndReceiveFrom”、

  “BeginSend”和“EndSend”、“BeginSendTo”和“EndSendTo”是 6组异步思路方法

  其功能分别相当于“Accept”、“Connect”、“Receive”、“ReceiveFrom”、

  “Send”和“SendTo”思路方法

  下面就通过个具体举例来介绍Visual C#中如何通过托管Socket实现数据传送和接收具体思路方法

  本文举例其实是由 2部分组成也可以看成是客户机和服务器客户机功能是通过

  Socket向服务器创建连接并在连接完成后向服务器发送数据;服务器通过侦听端口接受网络Socket连接请求并在连接完成后接收从客户机发送来数据并显示出来下面首先来介绍Visual C#通过托管Socket实现客户机具体思路方法

  Visual C#托管Socket实现思路方法() (2)   

  作者:王天 发文时间:2003.11.19  

   2.本文介绍设计、调试、运行软件Software环境:

  (1).微软公司视窗2000服务器版

  (2).Visual Studio .Net正式版.Net FrameWork SDK版本号3705

   4.利用Socket来传送数据:

  Visual C#在使用Socket传送数据时要注意下列问题解决思路方法:

  1.创建Socket例子使用此例子创建和远程终结点连接并判断连接是否成功建立

  2.发送数据到Socket实现数据传送

  这些问题解决思路方法都可以在下面介绍代码中找到相对应部分由于下面代码都有详细注解

  这里就不详细介绍下面是利用Socket传送数据具体实现步骤:

  1.启动Visual Studio .Net并新建个Visual C#项目

  项目名称为【利用Socket来发送数据】

  2.把Visual Studio .Net当前窗口切换到【Form1.cs(设计)】窗口

  并从【工具箱】中【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件并执行相应操作:

   2个TextBox组件个用以输入远程主机IP地址个用以输入往远程主机传送数据

  个StausBar组件用以显示运行状况

  个ListBox组件用以显示已传送数据信息

   3个Label组件

   2个Button组件名称分别为button1、button2并在这 2个组件被拖入窗体后分别双击它们则系统会在Form1.cs文件中自动产生这 2个组件Click事件对应处理代码

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

  4.以下面代码替代系统产生InitializeComponent过程:

private void InitializeComponent ( )
{
this.label1 = .Windows.Forms.Label ( ) ;
this.textBox1 = .Windows.Forms.TextBox ( ) ;
this.button1 = .Windows.Forms.Button ( ) ;
this.label2 = .Windows.Forms.Label ( ) ;
this.textBox2 = .Windows.Forms.TextBox ( ) ;
this.listBox1 = .Windows.Forms.ListBox ( ) ;
this.statusBar1 = .Windows.Forms.StatusBar ( ) ;
this.label3 = .Windows.Forms.Label ( ) ;
this.button2 = .Windows.Forms.Button ( ) ;
this.SuspendLayout ( ) ;
this.label1.Location = .Drawing.Po ( 24 , 20 ) ;
this.label1.Name = "label1" ;
this.label1.Size = .Drawing.Size ( 74 , 30 ) ;
this.label1.TabIndex = 0 ;
this.label1.Text = "IP地址:" ;
this.textBox1.BorderStyle = .Windows.
     Forms.BorderStyle.FixedSingle ;
this.textBox1.Location = .Drawing.Po ( 94 , 18 ) ;
this.textBox1.Name = "textBox1" ;
this.textBox1.Size = .Drawing.Size ( 166 , 21 ) ;
this.textBox1.TabIndex = 1 ;
this.textBox1.Text = "" ;
this.button1.FlatStyle = .Windows.Forms.FlatStyle.Flat ;
this.button1.Location = .Drawing.Po ( 280 , 14 ) ;
this.button1.Name = "button1" ;
this.button1.Size = .Drawing.Size ( 62 , 28 ) ;
this.button1.TabIndex = 2 ;
this.button1.Text = "连接" ;
this.button1.Click .EventHandler ( this.button1_Click ) ;
this.label2.Location = .Drawing.Po ( 16 , 64 ) ;
this.label2.Name = "label2" ;
this.label2.TabIndex = 3 ;
this.label2.Text = "发送信息:" ;
this.textBox2.BorderStyle = .Windows.
     Forms.BorderStyle.FixedSingle ;
this.textBox2.Location = .Drawing.Po ( 94 , 58 ) ;
this.textBox2.Name = "textBox2" ;
this.textBox2.Size = .Drawing.Size ( 166 , 21 ) ;
this.textBox2.TabIndex = 4 ;
this.textBox2.Text = "" ;
this.listBox1.ItemHeight = 12 ;
this.listBox1.Location = .Drawing.Po ( 20 , 118 ) ;
this.listBox1.Name = "listBox1" ;
this.listBox1.Size = .Drawing.Size ( 336 , 160 ) ;
this.listBox1.TabIndex = 6 ;
this.statusBar1.Location = .Drawing.Po ( 0 , 295 ) ;
this.statusBar1.Name = "statusBar1" ;
this.statusBar1.Size = .Drawing.Size ( 370 , 22 ) ;
this.statusBar1.TabIndex = 7 ;
this.statusBar1.Text = "无连接" ;
this.label3.Location = .Drawing.Po ( 14 , 94 ) ;
this.label3.Name = "label3" ;
this.label3.Size = .Drawing.Size ( 128 , 23 ) ;
this.label3.TabIndex = 8 ;
this.label3.Text = "已经发送信息:" ;
this.button2.FlatStyle = .Windows.Forms.FlatStyle.Flat ;
this.button2.Location = .Drawing.Po ( 280 , 54 ) ;
this.button2.Name = "button2" ;
this.button2.Size = .Drawing.Size ( 62 , 28 ) ;
this.button2.TabIndex = 9 ;
this.button2.Text = "发送" ;
this.button2.Click .EventHandler
     ( this.button2_Click ) ;
this.AutoScaleBaseSize = .Drawing.Size ( 6 , 14 ) ;
this.ClientSize = .Drawing.Size ( 370 , 317 ) ;
this.Controls.AddRange ( .Windows.Forms.Control {
  this.button2 ,
  this.statusBar1 ,
  this.listBox1 ,
  this.textBox2 ,
  this.label2 ,
  this.button1 ,
  this.textBox1 ,
  this.label1 ,
  this.label3} ) ;
this.FormBorderStyle = .
     Windows.Forms.FormBorderStyle.FixedSingle ;
this.MaximizeBox = false ;
this.Name = "Form1" ;
this.Text = "利用Socket来发送数据" ;
this.ResumeLayout ( false ) ;
}


  至此【利用Sokcet来传送数据】项目设计后界面就完成了具体如图01所示:

  图01:【利用Sokcet来传送数据】项目设计界面

  5.在Form1.cs文件开头导入命名空间代码区添加下列代码

  下列代码是导入下面中使用到类所在命名空间:

using ;
using .Drawing ;
using .Collections ;
using .ComponentModel ;
using .Windows.Forms ;
using .Data ;
using .Net.Sockets ;
//使用到TcpListen类
using .Net ;


  Visual C#托管Socket实现思路方法() (3)   

  作者:王天 发文时间:2003.11.19  

  6.在Form1代码区中加入下列代码下列代码作用是定义全局变量和创建全局使用例子:

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 , .EventArgs e )
{
//以下代码是判断是否和远程终结点成功连接
try
{
 stSend = Socket ( AddressFamily.InterNetwork ,
         SocketType.Stream , ProtocolType.Tcp ) ;
 //个Socket例子
 IPEndPo tempRemoteIP = IPEndPo
         ( IPAddress.Parse ( textBox1.Text ) , port ) ;
 //根据IP地址和端口号创建远程终结点
 EndPo epTemp = ( EndPo ) 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 , .EventArgs e )
{
iLength = textBox2.Text.Length ;
//获取要发送数据长度
Byte [ ] bySend = [ iLength ] ;
//根据获取长度定义个Byte类型
bySend = .Text.Encoding.Default.GetBytes
     ( textBox2.Text ) ;
//按照指定编码类型把串指定到指定Byte
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 )
{
 ( tcpConnect )
{
 Byte [ ] bySend = [ 4 ] ;
 //根据串“STOP”长度来定义Byte
 bySend = .Text.Encoding.
         Default.GetBytes ( "STOP" ) ;
  i = stSend.Send ( bySend ) ;
 //发送控制码
 stSend.Close ( ) ;
 //关闭套接字
}
( disposing )
{
  ( components != null )
 {
 components.Dispose ( ) ;
 }
}
base.Dispose ( disposing ) ;
}


  至此在上述步骤都正确执行后【利用Socket来传送数据】就全部完成了 

   5.利用Socket来接收数据:

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

  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文件编辑界面

  4.以下面代码替代系统产生InitializeComponent过程::

private void InitializeComponent ( )
      {
      this.button1 = .Windows.Forms.Button ( ) ;
      this.listBox1 = .Windows.Forms.ListBox ( ) ;
      this.statusBar1 = .Windows.Forms.StatusBar ( ) ;
      this.SuspendLayout ( ) ;
      this.button1.FlatStyle = .Windows.Forms.FlatStyle.Flat ;
      this.button1.Location = .Drawing.Po ( 96 , 16 ) ;
      this.button1.Name = "button1" ;
      this.button1.Size = .Drawing.Size ( 80 , 34 ) ;
      this.button1.TabIndex = 0 ;
      this.button1.Text = "监听" ;
      this.button1.Click .EventHandler ( this.button1_Click ) ;
      this.listBox1.ItemHeight = 12 ;
      this.listBox1.Location = .Drawing.Po ( 16 , 68 ) ;
      this.listBox1.Name = "listBox1" ;
      this.listBox1.Size = .Drawing.Size ( 258 , 172 ) ;
      this.listBox1.TabIndex = 1 ;
      this.statusBar1.Location = .Drawing.Po ( 0 , 251 ) ;
      this.statusBar1.Name = "statusBar1" ;
      this.statusBar1.Size = .Drawing.Size ( 292 , 22 ) ;
      this.statusBar1.TabIndex = 2 ;
      this.statusBar1.Text = "无连接" ;
      this.AutoScaleBaseSize = .Drawing.Size ( 6 , 14 ) ;
      this.ClientSize = .Drawing.Size ( 292 , 273 ) ;
      this.Controls.AddRange ( .Windows.Forms.Control {
      this.statusBar1 ,
      this.listBox1 ,
      this.button1} ) ;
      this.FormBorderStyle = .Windows.Forms.FormBorderStyle.FixedSingle ;
      this.MaximizeBox = false ;
      this.Name = "Form1" ;
      this.Text = "利用Socket来接收数据" ;
      this.ResumeLayout ( false ) ;
      }


  至此【利用Socket来接收数据】项目设计后界面就完成了具体如图02所示:

      //设定标示位判断侦听状态
      private Socket stRead ;

  7.在Form1.cs中Main的后添加下列代码下列代码作用是定义过程“Listen”此过程功能是监听“8000”端口号接收网络中连接请求建立连接并获取接收数据时使用Socket例子并以Socket例子来接收客户机发送来数据并根据客户机发送来控制码来断开网络连接释放资源:

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: