1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > .NET网络编程学习(二)

.NET网络编程学习(二)

时间:2020-12-06 08:39:13

相关推荐

.NET网络编程学习(二)

.Sockets有很多类,其中最重要的就是Socket类.

Socket类

public class Socket : IDisposable

Socket 类为网络通信提供了一套丰富的方法和属性。Socket 类允许您使用 ProtocolType 枚举中所列出的任何一种协议执行异步和同步数据传输。

public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);

其中,addressFamily 参数指定Socket使用的寻址方案,比如AddressFamily.InterNetwork表明为IP版本4的地址;socketType参数指定 Socket的类型,比如SocketType.Stream表明连接是基于流套接字的,而SocketType.Dgram表示连接是基于数据报套接字的。protocolType参数指定Socket使用的协议,比如ProtocolType.Tcp表明连接协议是运用TCP协议的,而 Protocol.Udp则表明连接协议是运用UDP协议的。

Socket 类对异步方法遵循 .NET Framework 命名模式。例如,同步的 Receive 方法对应于异步的 BeginReceive 和 EndReceive 方法。

(1)如果当前使用的是面向连接的协议(如 TCP),则服务器可以使用 Listen 方法侦听连接。Accept 方法处理任何传入的连接请求,并返回可用于与远程主机进行数据通信的 Socket。可以使用此返回的 Socket 来调用 Send 或 Receive 方法。如果要指定本地 IP 地址和端口号,请在调用 Listen 方法之前先调用 Bind 方法。如果您希望基础服务提供程序为您分配可用端口,请使用端口号 0。如果希望连接到侦听主机,请调用 Connect 方法。若要进行数据通信,请调用 Send 或 Receive 方法。

(2)如果当前使用的是无连接协议(如 UDP),则根本不需要侦听连接。调用 ReceiveFrom 方法可接受任何传入的数据报。使用 SendTo 方法可将数据报发送到远程主机。

同步模式的Socket编程的基本过程如下:

(1)创建一个Socket实例对象。

(2)将上述实例对象连接到一个具体的终结点(EndPoint)。

(3)连接完毕,就可以和服务器进行通讯:接收并发送信息。

(4)通讯完毕,用ShutDown()方法来禁用Socket。

(5)最后用Close()方法来关闭Socket。

对于基于Tcp的Socket,涉及到服务器端的侦听(Listen)和客户端的连接(Connect)

以下通过一个简单的Http服务器程序来看看服务器端的程序设计:

(1)BaseConnection是个封装Socket表示一个连接的类.

Code

publicclassBaseConnection

{

Socketsock;

publicBaseConnection(Socketsock)

{

this.sock=sock;

}

//把客户端请求文件中的字符替换掉

stringProcessString(stringinput)

{

StringBuilderresult=newStringBuilder();

for(inti=0;i<input.Length;i++)

{

if(input[i]=='/')

{

result.Append('\\');

}

else

{

result.Append(input[i]);

}

}

returnresult.ToString();

}

///<summary>

///读取请求信息,返回客户端请求的文件名

///</summary>

///<returns></returns>

publicstringgetRequest()

{

strings=null;

byte[]buff=newbyte[1024];

intrecCount=0;

try

{

//从socket读取请求信息

recCount=sock.Receive(buff,buff.Length,SocketFlags.None);

s=ASCIIEncoding.ASCII.GetString(buff,0,recCount);

Console.WriteLine("请求的详细信息是:"+s);

if(s.IndexOf("GET")>-1)

{

s=s.Substring(5);

intfend=s.IndexOf("");

s=s.Substring(0,fend);//取得请求文件的路径及文件名

}

returnProcessString(s);

}

catch(Exceptione)

{

Console.WriteLine(e.Message);

}

return"";

}

///<summary>

///返回客户端请求的文件

///</summary>

///<paramname="fname"></param>

publicvoidsendResponse(stringfname)

{

byte[]buff=newbyte[1024];

stringfilePath=@"C:\Inetpub\wwwroot\"+fname;

intcount=0;

if(filePath.IndexOf("..")>-1)//使访问的文件限制在目录C:\Inetpub\wwwroot\下

{

Console.WriteLine("没有权限访问!");

return;

}

Console.WriteLine("lookfor"+filePath);

if(File.Exists(filePath))//检查文件是否存在

{

using(BinaryReaderfs=newBinaryReader(File.Open(filePath,FileMode.Open)))

{

while((count=fs.Read(buff,0,1024))>0)

{

sock.Send(buff,count,SocketFlags.None);//发送信息

}

}

}

else

{

thrownewFileNotFoundException("文件:"+filePath+"不存在!");

}

}

publicvoidConClose()//关闭socket

{

sock.Shutdown(SocketShutdown.Both);

sock.Close();

}

}

(2)Main方法

Code

staticvoidMain(string[]args)

{

Socketssock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

IPAddresshostIp=Dns.GetHostEntry("localhost").AddressList[0];

IPEndPointep=newIPEndPoint(hostIp,80);

ssock.Bind(ep);//绑定

Console.WriteLine("开始侦听.");

//开始侦听

ssock.Listen(32);

while(true)

{

Socketsock=ssock.Accept();//等待客户端请求

Console.WriteLine("有一个客户端请求");

BaseConnectionclient=newBaseConnection(sock);

try

{

stringfile=client.getRequest();

Console.WriteLine("客户端请求的文件是:"+file);

client.sendResponse(file);

}

catch(Exceptione)

{

Console.WriteLine(e.Message);

}

finally

{

client.ConClose();//关闭连接

}

Console.WriteLine("结束一个请求");

Console.WriteLine("");

}

} (3)测试

假设在你C:\Inetpub\wwwroot目录下有一个info.html

启动服务器端:

打开浏览器输入:http://localhost/info.html

结果如下:

同时服务器端输出:

虽然很简单,但我们却的确写了一个http服务器程序.

主要参考资料:MSDN

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。