Visual C#.Net 网络程序开发-Socket篇

 更新时间: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应用程序开发。 

相关文章

  • C#使用Excel动态函数实现生成依赖列表

    C#使用Excel动态函数实现生成依赖列表

    这篇文章主要为大家详细介绍了如何在C#中使用 Excel 动态函数生成依赖列表,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • c#后台输出javascript语句示例程序

    c#后台输出javascript语句示例程序

    一个很不错的b/s前台输出弹出对话框、后台写javascript语句、后台直接关闭web页面及一个集成了常用验证的通用类,十分的方便。代码如下
    2013-12-12
  • c#委托学习示例分享

    c#委托学习示例分享

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性,下面是c#委托示例
    2014-03-03
  • 精简高效的C#网站优化经验技巧总结

    精简高效的C#网站优化经验技巧总结

    这篇文章主要为大家介绍了精简高效的C#网站优化经验技巧,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • c# 基于Titanium爬取微信公众号历史文章列表

    c# 基于Titanium爬取微信公众号历史文章列表

    这篇文章主要介绍了c# 基于Titanium爬取微信公众号历史文章列表,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • .NET/C#实现识别用户访问设备的方法

    .NET/C#实现识别用户访问设备的方法

    这篇文章主要介绍了.NET/C#实现识别用户访问设备的方法,结合实例形式分析了C#识别用户访问设备的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • C#实现winform中RichTextBox在指定光标位置插入图片的方法

    C#实现winform中RichTextBox在指定光标位置插入图片的方法

    这篇文章主要介绍了C#实现winform中RichTextBox在指定光标位置插入图片的方法,涉及RichTextBox控件及剪切板的相关操作技巧,非常简单实用,需要的朋友可以参考下
    2016-06-06
  • C#使用Resources资源文件

    C#使用Resources资源文件

    这篇文章介绍了C#使用Resources资源文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#中遍历DataSet数据集对象实例

    C#中遍历DataSet数据集对象实例

    这篇文章主要介绍了C#中遍历DataSet数据集对象实例,经常忘记如何操作DataSet,这里记下来并分享,让需要的朋友可以参考下
    2014-08-08
  • C# 使用Fluent API 创建自己的DSL(推荐)

    C# 使用Fluent API 创建自己的DSL(推荐)

    DSL领域专用语言是描述特定领域问题的语言,听起来很唬人,其实不是什么高深的东西,下面通过实例代码介绍下C# 使用Fluent API 创建自己的DSL,感兴趣的朋友参考下吧
    2021-12-12

最新评论