.net webService 的传输协议 7

 

TCP 通信

  TCP提供了与另一个机器的虚拟连接。它使得你能用某个序列(sequence)发送消息,甚至能接收交付的通知,这意味着你可以让消息重新发送,即可靠的通信。

 在tcp规范中,消息被称为包(page)。

 webservices和SOAP发送消息,你可能想发送一条可靠的soap消息,或者单向消息。HTTP是一个建立在TCP之上的协议,因为有一个连接用于处理请求消息和响应消息。

 HTTP之上的SOAP消息逐个检查在更低级的TCP,作为现在,你可以在没有http包装的简单TCP之上发送SOAP消息。

 所以如果你要在,net创建TCP连接,你要使用System.Net.Sockets.Socket类或更简单的System.Net.Sockets.TcpClient或System.Net.Sockets.TcpListener类

  在TCP连接上发送数据,可以使用TCPClient类:

      TcpClient tcpClient=new TcpClient();

      tcpClient.Connect('tcp地址',55);

  假设你成建立连接了,就可以对客户端的NetworkStream对象进行读和写:

     NetworkStream stream=tcpClient.getStream();

检查NetworkStream是很重要的,确保它根据你想做的事,确定你可以对它进行读或写

  if(stream.canWrite && stream.canRead);

假设,你可以对它进行写入,你需要创建一个字节数据组以写入流中。在你使用代码创建这个例子中,你将写入ASCII文本,而System.Test.Encoding.ASCII对象

有一个静态方法正好用于这个目的

  Byte[] buffer=Encoding.ASCII.GetBytes("要写入的文本");//转化成字节数据

然后,仍然使用NetworkStream的write方法,你就可以在网络上写出这个文本

  stream.write(buffer,0,buffer.Length);

 

在此时,另一端收到一个TCP消息。

要监听发送消息,你可以使用TcpListener类。创建这个类时,你可以将端口设置它需要监听的端口。

例如:

  TcpListener listener=new TcpListener("监听的端口");

一旦创建这个类,你需要调用Start方法让它开始监听请求:

  listener.start();

此时,你可以监听任何挂起的请求,或者只是等待一个被阻塞的方法调用AcceptTcpClient将会阻塞,直到收到一个请求,然后返回一个TcpClient对象。

这里还有AcceptSocket方法,它返回一个Socket:

  TcpClient client=listener.AcceptTcpClient();

现在,你需要读出TcpClient的NetworkStream以便接收消息,并写入到流中将它们发送出去。在这种情况下,你需要从客户端接收一条消息.

例如:

    NetworkStream stream=client.GetStream();

    Byte[] buffer=new Byte[1024];

    int read=stream.Read(buffer,0,1024);

    MessageBox.Show(Encoding.ASCII,GetString(buffer,0,read));

    如果要对这个例子做修改,可以使用System.Threading.Thread在它自己的线程上摆脱(spin off)监听器.

 

 

使用UDP的不可靠消息

  UDP是一个无连接(connectionless)协议---这意味着当一个客户端发送一条消息它不会知道服务器是否接收它。在UDP的世界里,每个人都是客户端,没有任何服务器

---每个人都可以监听,并且每个人都可以发送消息。

  .Net通过惟一的UdpClient类体现这一点;没有像TCP的TcpListener监听器一样的UdpListener。UdpClient类负责监听引入的请求并且发送它们。

如何像之前的聊天程序那样,你需要加入一个多址通信(multicast)组。

例如:

     IPAddress multicastAddress=IPAddress.Pares("Ip地址")

    UpdClient client=new UpdClient(555);//端口

    client.JoinMulticastGroup(multicastAddress,100);

   你加入了这个多址通信组,你可以循环接受在那个多址通信中的任何客户端的消息:

  例如:

       while(true)

    {

      IPEndPoint endpoint=null;

      Byte[] buffer=client.Receive(ref endpoint);

      String message=Encoding.ASCII.GetString(buffer);

      MessageBox.Show(message);

     }  

    记住通过删除多址通信组来清理代码:

      client.DropMulticastgroup(multicastAddress);

    如果要发送消息,需要加入多址通信组,像接受消息一样:

    例如:

      IPAddress multicastAddress=IPAddress.Parse("ip地址");

      IPEndPoint m_RemoteEP=new IPEndPoint(multicastAddress,555);

      UdpClient client =new UdpClient(555);

      client.JoinMulticastGroup(multicastAddress,100);

      接着,你需要创建一个用作发送数据表的字节数组:

        Byte[] buffer=new Byte[text.Length+1];

        int length=Encoding.ASCII.GetBytes(text.ToCharArray(),0,text.Length,buffer,0);

        client.send(buffer,length,m_RemotEP);

 

e-mail 中SOAP:SMTP

  SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用于发送e-mail消息的协议.

  .net 框架提供一个用于发送SMTP邮件消息类。你可以在System.Web.Mail命名空间找到这个类。它包含了

  构造邮件消息和发送邮件消息的支持.还有这个版本是基于windows200或更晚版本的操作系统(不包括家庭版)中SMTP的功能。

  例如:

    首先要System.web.Mail命名空间

    接着你就可以创建MailMessage对象,它包含发送消息:

      MailMessage message=new MailMessage();

      message.To="发送者邮箱“;

      message.From="接受者邮箱";

      message.Subject="标题";

      message.Body="消息主题内容";

      message.BodyFormat=MesageMail.Text;//"消息内容的格式";

   最后,你只需要设置服务器的名,并且发送消息:

      SmtpMail.SmtpServer="localhost";

      SmtpMail.send(message);

    还可以同MailAttachMent类通过SOAP消息发送文件

    message.AttachMents.Add(new MailAttachMail("c:\\xxx.txt"));

 

web的传输协议:HTTP

  Http :是一个面向连接的协议,它基于请求和响应消息的。TCP和UDP是基于目的地数据二进制布局和请求的其他元数据的,而HTTP是基于文本的.

   在.NET 框架之下,有好几种可以发出HTTP请求,目前主要讲两种 一种简单WebClient,另一种是webRequest API比较难使用,但功能强大.

  

 A. WebClient类

    要是用WebClient类首先之前一样要构造对象

      WebClient client=new WebClient();

   接着你需要设置用于请求消息的凭据(credential),假设你想设置为HTTP验证。web资源是匿名的,则可以跳过这一步,否则需要设置凭据,下面是默认的凭据:

      client.Credentials=CredentialCahe.DefaultCredentials;

   现在你可以发送请求:

        如果是GET请求,被发送到web服务器,浏览器所使用的一种请求----使用DownloadData 和DownloadFile方法

      Byte[] page=client.DownloadData("内容");

    接着,你可以将字符组转换为字符串,或者你想解析的形式:

     string message=Encoding.ASCII.GetString(page);

   如果是POST,则通过UploadFile和UploadData方法,你可以使用webClient上载数据.存在一个主要问题:它们都是同步方法,也就是说会阻塞线程,直到方法完成为止。

 

  B.webRequst 类

    其他主要的 HTTP API由WebRequest 类组成,WebRequest是一个抽象类,它被HttpWebRequest类实现。这个复杂的类包括了异步支持,也是一个基于流的API。

  创建一个WebRequest对象,必须使用WebRequest类的静态Create方法:

    WebRequest request=WebRequest.Create(“url”);

  同样要设置凭据

    request.Credentials=CredentialCache.DefaultCredentials;

  接着,应用程序应该将动词设置为POSt,并且SOAPAction设置为表单指定的动作:

    request.Method="Post";

    request.ContentType="text/xml";

    request.Headers.add("SOAPAction",Action.Text);

    现在,这个应用程序需要接受请求SOAP消息的输入,并且将它写出到WebRequest的响应Stream

    Byte[] buffer=Syste.Text.UTF8Encoding.UTF8.GetBytes('内容');

    request.ContentLength=buffer.Length;

    Stream requestStream=request.GetRequestStream();

    requestStream.Write(buffer,0,buffer.Length);

    requestStream.Close();

    为了访问Stream,WebRequest类提供了一个用于发送POST数据点方法。这个流可以接受任何类型的数据;

它来自System.IO命名空间的基本的Stream

  还有设置ContentLenth要手动的操作,WebRequest不会自动设置,为什么要设置了,如果你没有正确的设置这个属性,将不能从服务器接受到任何响应

相反,在某一点将超时异常。

      在System.Net的类中的WebRequest类是抽象的,也就是说,它不包括任何实现。相反它提供了一个独立于传输的(transport-independent)模型,用于

实现请求--响应协议.例如:HTTP。

  实际上,这里使用的实际的实现是HttpWebRequest类.这个类模式还指定需要为WebResponse类,还使用HttpWebResponse类。

  

     

posted on 2013-08-28 11:50  紫色的冰  阅读(436)  评论(0编辑  收藏  举报