Visual C#.Net 网络程序开发-Socket篇第2/2页

 更新时间:2007年03月09日 00:00:00   作者:  

确定了远程设备的地址并选择了用于连接的端口后,应用程序可以尝试建立与远程设备的连接。下面的示例使用现有的 IPEndPoint 实例与远程设备连接,并捕获可能引发的异常: 

try { 
s.Connect(ipe);//尝试连接 

//处理参数为空引用异常 
catch(ArgumentNullException ae) { 
Console.WriteLine("ArgumentNullException : {0}", ae.ToString()); 

//处理操作系统异常 
catch(SocketException se) { 
Console.WriteLine("SocketException : {0}", se.ToString()); 

catch(Exception e) { 
Console.WriteLine("Unexpected exception : {0}", e.ToString()); 



需要知道的是:Socket 类支持两种基本模式:同步和异步。其区别在于:在同步模式中,对执行网络操作的函数(如 Send 和 Receive)的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中,这些调用立即返回。 

另外,很多时候,Socket编程视情况不同需要在客户端和服务器端分别予以实现,在客户端编制应用程序向服务端指定端口发送请求,同时编制服务端应用程序处理该请求,这个过程在上面的阐述中已经提及;当然,并非所有的Socket编程都需要你严格编写这两端程序;视应用情况不同,你可以在客户端构造出请求字符串,服务器相应端口捕获这个请求,交由其公用服务程序进行处理。以下事例语句中的字符串就向远程主机提出页面请求: 

string Get = "GET / HTTP/1.1\r\nHost: " + server + "\r\nConnection: Close\r\n\r\n"; 


远程主机指定端口接受到这一请求后,就可利用其公用服务程序进行处理而不需要另行编制服务器端应用程序。 

综合运用以上阐述的使用Visual C#进行Socket网络程序开发的知识,下面的程序段完整地实现了Web页面下载功能。用户只需在窗体上输入远程主机名(Dns 主机名或以点分隔的四部分表示法格式的 IP 地址)和预保存的本地文件名,并利用专门提供Http服务的80端口,就可以获取远程主机页面并保存在本地机指定文件中。如果保存格式是.htm格式,你就可以在Internet浏览器中打开该页面。适当添加代码,你甚至可以实现一个简单的浏览器程序。 


实现此功能的主要源代码如下: 

//"开始"按钮事件 
private void button1_Click(object sender, System.EventArgs e) { 
//取得预保存的文件名 
string fileName=textBox3.Text.Trim(); 
//远程主机 
string hostName=textBox1.Text.Trim(); 
//端口 
int port=Int32.Parse(textBox2.Text.Trim()); 
//得到主机信息 
IPHostEntry ipInfo=Dns.GetHostByName(hostName); 
//取得IPAddress[] 
IPAddress[] ipAddr=ipInfo.AddressList; 
//得到ip 
IPAddress ip=ipAddr[0]; 
//组合出远程终结点 
IPEndPoint hostEP=new IPEndPoint(ip,port); 
//创建Socket 实例 
Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
try 

//尝试连接 
socket.Connect(hostEP); 

catch(Exception se) 

MessageBox.Show("连接错误"+se.Message,"提示信息 
,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); 

//发送给远程主机的请求内容串 
string sendStr="GET / HTTP/1.1\r\nHost: " + hostName + 
"\r\nConnection: Close\r\n\r\n"; 
//创建bytes字节数组以转换发送串 
byte[] bytesSendStr=new byte[1024]; 
//将发送内容字符串转换成字节byte数组 
bytesSendStr=Encoding.ASCII.GetBytes(sendStr); 
try 

//向主机发送请求 
socket.Send(bytesSendStr,bytesSendStr.Length,0); 

catch(Exception ce) 

MessageBox.Show("发送错误:"+ce.Message,"提示信息 
,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); 

//声明接收返回内容的字符串 
string recvStr=""; 
//声明字节数组,一次接收数据的长度为1024字节 
byte[] recvBytes=new byte[1024]; 
//返回实际接收内容的字节数 
int bytes=0; 
//循环读取,直到接收完所有数据 
while(true) 

bytes=socket.Receive(recvBytes,recvBytes.Length,0); 
//读取完成后退出循环 
if(bytes<=0) 
break; 
//将读取的字节数转换为字符串 
recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes); 

//将所读取的字符串转换为字节数组 
byte[] content=Encoding.ASCII.GetBytes(recvStr); 
try 

//创建文件流对象实例 
FileStream fs=new FileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite); 
//写入文件 
fs.Write(content,0,content.Length); 

catch(Exception fe) 

MessageBox.Show("文件创建/写入错误:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); 

//禁用Socket 
socket.Shutdown(SocketShutdown.Both); 
//关闭Socket 
socket.Close(); 




程序在WindowsXP中文版、.Net Frameworkd 中文正式版、Visual Studio.Net中文正式版下调试通过 


关于作者 

宋华,96年毕业于承德石油学院电子与电气系计算机应用专业,同年进入中国石油天然气集团公司吐哈油田工作,一直从事网络规划与建设、网站架构与设计,现专门从事Internet应用程序开发及Windows应用程序开发。 

相关文章

  • WPF实现上下滚动字幕效果

    WPF实现上下滚动字幕效果

    这篇文章主要为大家详细介绍了WPF实现上下滚动字幕效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • C#导入导出Excel数据的两种方法

    C#导入导出Excel数据的两种方法

    这篇文章主要为大家详细介绍了C#导入导出Excel数据的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • unity实现动态排行榜

    unity实现动态排行榜

    这篇文章主要为大家详细介绍了unity实现动态排行榜,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • c#判断代码是否执行超时的几种方式总结

    c#判断代码是否执行超时的几种方式总结

    这篇文章主要介绍了c#判断代码是否执行超时的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C#语言中的修饰符汇总

    C#语言中的修饰符汇总

    本文主要介绍的是C#语言中的修饰符,主要从四方面介绍,希望对大家有帮助,一起来看。
    2015-10-10
  • C#简单的通用基础字典实现方法

    C#简单的通用基础字典实现方法

    这篇文章主要介绍了C#简单的通用基础字典实现方法,包含了字典的索引、记录、回调与查询等技巧,需要的朋友可以参考下
    2014-12-12
  • 详解C#实现在Excel单元格中应用多种字体格式

    详解C#实现在Excel单元格中应用多种字体格式

    在Excel中,可对单元格中的字符串设置多种不同样式。本文,将以C#及VB.NET代码为例,介绍如何在Excel同一个单元格中应用多种字体样式,感兴趣的可以了解一下
    2022-05-05
  • C#游戏开发之实现俄罗斯方块游戏

    C#游戏开发之实现俄罗斯方块游戏

    这篇文章主要为大家详细介绍了C#如何实现经典俄罗斯方块游戏,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-01-01
  • DevExpress之ChartControl实现柱状图演示实例

    DevExpress之ChartControl实现柱状图演示实例

    这篇文章主要介绍了DevExpress中ChartControl实现柱状图演示方法,实例展示了相关绘图函数的具体用法,具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • DataGridView设置单元格的提示内容ToolTip

    DataGridView设置单元格的提示内容ToolTip

    这篇文章介绍了DataGridView设置单元格提示内容ToolTip的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02

最新评论