zoukankan      html  css  js  c++  java
  • .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类。

      

         

  • 相关阅读:
    Codeforces 897 B.Chtholly's request-思维题(处理前一半)
    Codeforces 897 A.Scarborough Fair-字符替换
    51nod 1649.齐头并进-最短路(Dijkstra)
    牛客网 牛客练习赛7 B.购物-STL(priority_queue)
    牛客网 牛客练习赛7 A.骰子的游戏
    hdu 4737 A Bit Fun 尺取法
    Educational Codeforces Round 15 D. Road to Post Office 数学
    Educational Codeforces Round 15 A, B , C 暴力 , map , 二分
    tyvj 1402 乌龟棋 dp
    vijos 1057 盖房子 dp 最大子正方形
  • 原文地址:https://www.cnblogs.com/jzhou/p/3286861.html
Copyright © 2011-2022 走看看