.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类。