一直想深入研究一下在c#中的Socket编程,苦于没有时间深入做了解,大体对其搞了一番。SOCKET差不多是C#中的比较底层的东西了,其开发和功能使用都是比较复杂的。
主要有两个模型,一个是服务器端的,一个是客户端的,我这里不详细说服务器端的,只说客户端的。所谓的服务器端就是服务器接受的请求并处理,可以把任何HTTP的跑web程序服务器看作是一个端口80的Server(本来就是这样的)。
Client层的编程就比较少被谈及了,因为如是底层的东西对于web程序员大部分时间来说,不怎么接触到,及时作SOAP的研究,也是在SOCKET之上的编程,C#实现SOCKET这里主要有三个步骤:
1:建立IPEndPoint节点
2: 创建一个Socket对象
3:发送请求
4:接受数据(同步篇,本文只说同步接受,异步接受请看下文)
5:数据接受完毕,关闭连接
每个步骤的来说吧:
1:建立IPEndPoint节点建立IPAddress对象与端口,创建IPEndPoint节点:
int port = 80;
string whost = "www.5do8.com";
IPHostEntry iphostinfo = Dns.GetHostEntry(whost);
IPAddress ip = iphostinfo.AddressList[0];
IPEndPoint ipe = new IPEndPoint(ip, port);
2:创建一个Socket对象Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
c.ReceiveTimeout= 10*1000;//设置超时时间
c.Connect(ipe);//连接到服务器
3.发送请求string gStr = "GET / HTTP/1.1\r\nHost: "+whost+"\r\nConnection: Close\r\n\r\n";
byte[] bs = Encoding.ASCII.GetBytes(gStr);//把字符串编码为字节
Console.WriteLine("Send Message");
c.Send(bs, bs.Length, 0);//发送信息
4.SOCKET同步接受数据byte[] RecvBuffer = new byte[1024];
int nBytes, nTotalBytes = 0;
StringBuilder sb = new StringBuilder();
System.Text.Encoding myE=Encoding.UTF8;
while((nBytes = c.Receive(RecvBuffer, 0, 1024, SocketFlags.None)) > 0){
nTotalBytes += nBytes;
sb.Append(myE.GetString(RecvBuffer, 0, nBytes));
}
Console.WriteLine("获取信息:{0}", sb.ToString());//显示服务器返回数据
5.关闭连接c.Close();
关于其中的异常处理,请自行搞定。其中有几个问题需要注意:
1:数据量大的话就可能造成线程堵塞,必须使用异步。同步时建议Sleep,但不保证不丢包。莫名其妙。
2:C#获取页面信息建议使用.NET已经现有的System.Net.WebRequest这个,效率比较高。
天气:大雨,ccdot发表于2008-8-21 15:07:45,阅读了608次,共有个0回复.