Visual C#网络编程Word文件下载.docx
- 文档编号:19187982
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:28
- 大小:46.01KB
Visual C#网络编程Word文件下载.docx
《Visual C#网络编程Word文件下载.docx》由会员分享,可在线阅读,更多相关《Visual C#网络编程Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
而在服务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。
使用完Socket后,记住使用Shutdown方法禁用Socket,并使用Close方法关闭Socket。
其间用到的方法/函数有:
Socket.Connect方法:
建立到远程设备的连接
publicvoidConnect(EndPointremoteEP)(有重载方法)
Socket.Send方法:
从数据中的指示位置开始将数据发送到连接的Socket。
publicintSend(byte[],int,SocketFlags);
(有重载方法)
Socket.SendTo方法将数据发送到特定终结点。
publicintSendTo(byte[],EndPoint);
Socket.Receive方法:
将数据从连接的Socket接收到接收缓冲区的特定位置。
publicintReceive(byte[],int,SocketFlags);
Socket.ReceiveFrom方法:
接收数据缓冲区中特定位置的数据并存储终结点。
publicintReceiveFrom(byte[],int,SocketFlags,refEndPoint);
Socket.Bind方法:
使Socket与一个本地终结点相关联:
publicvoidBind(EndPointlocalEP);
Socket.Listen方法:
将Socket置于侦听状态。
publicvoidListen(intbacklog);
Socket.Accept方法:
创建新的Socket以处理传入的连接请求。
publicSocketAccept();
Socket.Shutdown方法:
禁用某Socket上的发送和接收
publicvoidShutdown(SocketShutdownhow);
Socket.Close方法:
强制Socket连接关闭
publicvoidClose();
可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP使用一个网络地址和一个服务端口号来唯一标识设备。
网络地址标识网络上的特定设备;
端口号标识要连接到的该设备上的特定服务。
网络地址和服务端口的组合称为终结点,在.NET框架中正是由EndPoint类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。
.Net同时也为每个受支持的地址族定义了EndPoint的子代;
对于IP地址族,该类为IPEndPoint。
IPEndPoint类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务的连接点。
用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,.Net中有两种类可以得到IP地址实例:
IPAddress类:
IPAddress类包含计算机在IP网络上的地址。
其Parse方法可将IP地址字符串转换为IPAddress实例。
下面的语句创建一个IPAddress实例:
IPAddressmyIP=IPAddress.Parse("
192.168.1.2"
);
Dns类:
向使用TCP/IPInternet服务的应用程序提供域名服务。
其Resolve方法查询DNS服务器以将用户友好的域名(如"
"
)映射到数字形式的Internet地址(如192.168.1.1)。
Resolve方法返回一个IPHostEnty实例,该实例包含所请求名称的地址和别名的列表。
大多数情况下,可以使用AddressList数组中返回的第一个地址。
下面的代码获取一个IPAddress实例,该实例包含服务器的IP地址。
IPHostEntryipHostInfo=Dns.Resolve("
IPAddressipAddress=ipHostInfo.AddressList[0];
你也可以使用GetHostName方法得到IPHostEntry实例:
IPHosntEntryhostInfo=Dns.GetHostByName("
)
在使用以上方法时,你将可能需要处理以下几种异常:
SocketException异常:
访问Socket时操作系统发生错误引发
ArgumentNullException异常:
参数为空引用引发
ObjectDisposedException异常:
Socket已经关闭引发
在掌握上面得知识后,下面的代码将该服务器主机(的IP地址与端口号组合,以便为连接创建远程终结点:
IPEndPointipe=newIPEndPoint(ipAddress,11000);
确定了远程设备的地址并选择了用于连接的端口后,应用程序可以尝试建立与远程设备的连接。
下面的示例使用现有的IPEndPoint实例与远程设备连接,并捕获可能引发的异常:
try{
s.Connect(ipe);
//尝试连接
}
//处理参数为空引用异常
catch(ArgumentNullExceptionae){
Console.WriteLine("
ArgumentNullException:
{0}"
ae.ToString());
//处理操作系统异常
catch(SocketExceptionse){
SocketException:
se.ToString());
catch(Exceptione){
Unexpectedexception:
e.ToString());
需要知道的是:
Socket类支持两种基本模式:
同步和异步。
其区别在于:
在同步模式中,对执行网络操作的函数(如Send和Receive)的调用一直等到操作完成后才将控制返回给调用程序。
在异步模式中,这些调用立即返回。
另外,很多时候,Socket编程视情况不同需要在客户端和服务器端分别予以实现,在客户端编制应用程序向服务端指定端口发送请求,同时编制服务端应用程序处理该请求,这个过程在上面的阐述中已经提及;
当然,并非所有的Socket编程都需要你严格编写这两端程序;
视应用情况不同,你可以在客户端构造出请求字符串,服务器相应端口捕获这个请求,交由其公用服务程序进行处理。
以下事例语句中的字符串就向远程主机提出页面请求:
stringGet="
GET/HTTP/1.1\r\nHost:
"
+server+"
\r\nConnection:
Close\r\n\r\n"
;
远程主机指定端口接受到这一请求后,就可利用其公用服务程序进行处理而不需要另行编制服务器端应用程序。
综合运用以上阐述的使用VisualC#进行Socket网络程序开发的知识,下面的程序段完整地实现了Web页面下载功能。
用户只需在窗体上输入远程主机名(Dns主机名或以点分隔的四部分表示法格式的IP地址)和预保存的本地文件名,并利用专门提供Http服务的80端口,就可以获取远程主机页面并保存在本地机指定文件中。
如果保存格式是.htm格式,你就可以在Internet浏览器中打开该页面。
适当添加代码,你甚至可以实现一个简单的浏览器程序。
实现此功能的主要源代码如下:
//"
开始"
按钮事件
privatevoidbutton1_Click(objectsender,System.EventArgse){
//取得预保存的文件名
stringfileName=textBox3.Text.Trim();
//远程主机
stringhostName=textBox1.Text.Trim();
//端口
intport=Int32.Parse(textBox2.Text.Trim());
//得到主机信息
IPHostEntryipInfo=Dns.GetHostByName(hostName);
//取得IPAddress[]
IPAddress[]ipAddr=ipInfo.AddressList;
//得到ip
IPAddressip=ipAddr[0];
//组合出远程终结点
IPEndPointhostEP=newIPEndPoint(ip,port);
//创建Socket实例
Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
//尝试连接
socket.Connect(hostEP);
catch(Exceptionse)
MessageBox.Show("
连接错误"
+se.Message,"
提示信息
MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
//发送给远程主机的请求内容串
stringsendStr="
+hostName+
//创建bytes字节数组以转换发送串
byte[]bytesSendStr=newbyte[1024];
//将发送内容字符串转换成字节byte数组
bytesSendStr=Encoding.ASCII.GetBytes(sendStr);
//向主机发送请求
socket.Send(bytesSendStr,bytesSendStr.Length,0);
catch(Exceptionce)
发送错误:
+ce.Message,"
//声明接收返回内容的字符串
stringrecvStr="
//声明字节数组,一次接收数据的长度为1024字节
byte[]recvBytes=newbyte[1024];
//返回实际接收内容的字节数
intbytes=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);
//创建文件流对象实例
FileStreamfs=newFileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);
//写入文件
fs.Write(content,0,content.Length);
catch(Exceptionfe)
文件创建/写入错误:
+fe.Message,"
提示信息"
MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
//禁用Socket
socket.Shutdown(SocketShutdown.Both);
//关闭Socket
socket.Close();
程序在WindowsXP中文版、.NetFrameworkd中文正式版、VisualStudio.Net中文正式版下调试通过
___________________________________________________
我修正如下:
usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Data;
usingSystem.Net.Sockets;
usingSystem.Net;
usingSystem.IO;
usingSystem.Text;
namespacewinsocket
{
///<
summary>
///SummarydescriptionforForm1.
/summary>
publicclassForm1:
System.Windows.Forms.Form
{
privateSystem.Windows.Forms.Buttonbutton1;
privateSystem.Windows.Forms.Labellabel1;
privateSystem.Windows.Forms.TextBoxtextBox1;
privateSystem.Windows.Forms.TextBoxtextBox2;
privateSystem.Windows.Forms.Labellabel2;
privateSystem.Windows.Forms.TextBoxtextBox3;
privateSystem.Windows.Forms.Labellabel3;
///Requireddesignervariable.
privateSystem.ComponentModel.Containercomponents=null;
publicForm1()
//
//RequiredforWindowsFormDesignersupport
InitializeComponent();
//TODO:
AddanyconstructorcodeafterInitializeComponentcall
}
///Cleanupanyresourcesbeingused.
protectedoverridevoidDispose(booldisposing)
if(disposing)
if(components!
=null)
components.Dispose();
base.Dispose(disposing);
#regionWindowsFormDesignergeneratedcode
///RequiredmethodforDesignersupport-donotmodify
///thecontentsofthismethodwiththecodeeditor.
privatevoidInitializeComponent()
this.button1=newSystem.Windows.Forms.Button();
this.label1=newSystem.Windows.Forms.Label();
this.textBox1=newSystem.Windows.Forms.TextBox();
this.textBox2=newSystem.Windows.Forms.TextBox();
this.label2=newSystem.Windows.Forms.Label();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual C#网络编程 C# 网络 编程