iLinux

自由、梦想、飞翔 --- Free Dream Soar

forlinuxID:forlinux
86323次访问,排名1068好友2人,关注者4
forlinux的文章
原创 79 篇
翻译 0 篇
转载 67 篇
评论 74 篇
只爱LINUX的公告
机遇+努力=成功
努力才会有希望...
点击这里给我发消息
最近评论
forlinux:另: 使用 Ndiswrapper时,若linux是64位的,得使用64位的windows驱动程序
bingbingw:谢谢啊,多谢了
vvukqr:WoW Gold
vvukqr:WoW Gold
vvukqr:WoW Gold
文章分类
收藏
相册
只爱这一秒
.NET资源
.net Free soft
dotnet开源
Filehelper-Exp/Imp Data2DB
MSDN-library
Ajax Framework
jquery——The writte less,do more
prototype.js
prototype.js开发者文档
JAVA资源
java开源大全
中国IT实验室ECLIPSE专题
linux资源
202.96.64.144
ChinaUnix网友空间
Cooperative Linux(colinux)
OpenSSH For Windows
Oracle On Linux
Reactos(Wine Base)
Wine模拟器
健兔linux
成都理工大学FTP
班图LINUX
红帽Linux
长江大学FTP
鳥哥的Linux私房菜
lnux社区
linuxsir.org
linux伊甸园
linux公社
PHP资源
Apache with Open SSL
Apache软件历史版本
phpv.net
中日韩翻译
数据库相关
Oracle NetWorking FAQ
友情链接
baidu博客分站
SourceForge主页
漂在生活
闲云
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

转载 VisualC#中托管Socket的实现方法(二)收藏

新一篇: 一不小心又买书了 | 旧一篇: Visual C#托管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文件的编辑界面。

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

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


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

VisualC#中托管Socket的实现方法(二)

图02:【利用Socket来接收数据】项目的设计界面


5.把Visual Studio .Net的当前窗口切换到Form1.cs的代码编辑窗口,并在Form1.cs文件的开头,用下列导入命名空间代码替代系统缺省的导入命名空间代码。

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


6.在Form1.cs中的class代码区中添加下列代码,下列代码的作用是定义全局变量和创建全局使用的实例:

int port = 8000 ;
//定义侦听端口号
private Thread thThreadRead ;
//创建线程,用以侦听端口号,接收信息
private TcpListener	tlTcpListen ;
//侦听端口号
private bool blistener = true ;
//设定标示位,判断侦听状态
private Socket stRead ;
 7.在Form1.cs中的Main函数之后,添加下列代码,下列代码的作用是定义过程“Listen”,此过程的功能是监听“8000”端口号,接收网络中连接请求,建立连接,并获取接收数据时使用的Socket实例,并以Socket实例来接收客户机程序发送来的数据。并根据客户机发送来控制码来断开网络连接,释放资源:
{
   try
      {
	tlTcpListen = new TcpListener ( port )  ;
	//以8000端口号来初始化TcpListener实例
	tlTcpListen.Start ( )  ;
	//开始监听网络的连接请求
	statusBar1.Text = "正在监听..."  ;
	stRead = tlTcpListen.AcceptSocket ( ) ;
	//通过连接请求,并获得接收数据时使用的Socket实例
	EndPoint tempRemoteEP = stRead.RemoteEndPoint  ;
	IPEndPoint tempRemoteIP =  ( IPEndPoint ) tempRemoteEP ;
	//获取请求的远程计算机名称
	IPHostEntry host = Dns.GetHostByAddress
         ( tempRemoteIP.Address ) ;
	string sHostName = host.HostName ;
	statusBar1.Text = "已经连接!" ;
	//循环侦听
	while (  blistener  )
	   {
	     string sTime = DateTime.Now.ToShortTimeString  ( )  ;
		//获取接收数据时的时间
		Byte [ ] byRead =new Byte [ 80 ] ;
		int iRead = stRead.ReceiveFrom 
                  ( byRead , ref tempRemoteEP ) ;
		//获得接收的字节数目
		Byte [ ] byText = new Byte [ iRead ] ;
		//并根据接收到的字节数目来定义字节数组
		Array.Copy  ( byRead , 0 , byText , 0 , iRead ) ;
		string sTemp = System.Text.Encoding.Default.
                   GetString ( byText ) ;
		//判断是否为断开连接控制码
		if  (  sTemp.Trim ( )  == "STOP"  )
		{
			stRead.Close ( ) ;
			tlTcpListen.Stop  (  )  ;
			 //关闭侦听
			statusBar1.Text = "连接已经关闭!"  ;
			thThreadRead.Abort  (   )  ;
			//中止线程
			return ;
		}
		else
		listBox1.Items.Add  (  sTime + " " + sTemp  )  ;
		
	}	catch  (  System.Security.SecurityException  ) 
	{
	MessageBox.Show  (  "侦听失败!"  , "错误"  )  ;
	}
}


8.用下列代码替换Form1.cs中的button1组件的Click事件对应的处理代码,下面代码是以刚刚定义“Listen”过程来初始化线程实例thThreadRead,并启动这个线程:

private void button1_Click ( object sender , System.EventArgs e )
{
thThreadRead = new Thread ( new ThreadStart ( Listen ) ) ;
//以Listen过程来初始化Thread实例
thThreadRead.Start (   ) ;
//启动线程
button1.Enabled = false  ;
}


至此,在保存上述的所有修改步骤之后。一个基于TCP协议的、利用Socket接收端程序的就完成了。图03和图04分别是上述二个示例运行后的界面

VisualC#中托管Socket的实现方法(二)

图03:【利用Socket来传送数据】的运行界面


VisualC#中托管Socket的实现方法(二)

图04:【利用Socket来接收数据】的运行界面


六.总结:

.Net FrameWork SDK中的Socket类的功能是非常强大的,要十分详细的介绍它,非一篇文章所能达到,本文所窥探的也只是其中的很小的一部分。但本文中介绍的二个示例在功能上虽不复杂,但在结构上却非常典型,Socket类的其他方面的应用在结构上大都也是如此。

在上面介绍的内容中,不仅介绍在Visual C#实现端口侦听、网络连接申请、数据发送、数据接收的具体方法,还介绍了在使用Visual C#实现网络功能是所必然要涉及到的如线程创建、线程销毁、资源回收和利用控制码控制程序运行状态等的实现方法。了解并掌握这些对我们编写功能更强、结构更复杂的网络应用程序是非常有帮助的。

最后要和诸位朋友谈一点小体会,就是在编写网络应用程序时,要非常细心,对应用程序在执行的各个环节都要考虑到位,因为在网络中会出现很多意想不到的问题,就是网络状态非常良好,也存在很多使用者方面的问题。如果在编写的程序中缺乏对这些意外的处理,就可能会导致整个应用程序出错,甚至崩溃。

发表于 @ 2006年09月06日 22:04:00|评论(loading...)|编辑

新一篇: 一不小心又买书了 | 旧一篇: Visual C#托管Socket的实现方法(一)

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 只爱LINUX