c# socket client 端的使用[同步篇]
老农博客 发布于2008-08-21 15:07 | 67次阅读 | 字体:大 小 打印预览
一直想深入研究一下在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对象
[CODE]Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
c.ReceiveTimeout= 10*1000;//设置超时时间
c.Connect(ipe);//连接到服务器
[/CODE]
3.发送请求
[CODE]string gStr = "GET / HTTP/1.1
Host: "+whost+"
Connection: Close
";
byte[] bs = Encoding.ASCII.GetBytes(gStr);//把字符串编码为字节
Console.WriteLine("Send Message");
c.Send(bs, bs.Length, 0);//发送信息
[/CODE]
4.SOCKET同步接受数据
[CODE]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());//显示服务器返回数据
[/CODE]
5.关闭连接
[CODE]c.Close();
[/CODE]
关于其中的异常处理,请自行搞定。其中有几个问题需要注意:
1:数据量大的话就可能造成线程堵塞,必须使用异步。同步时建议Sleep,但不保证不丢包。莫名其妙。
2:C#获取页面信息建议使用.NET已经现有的System.Net.WebRequest这个,效率比较高。
本文出处 :
http://www.5do8.com/blog/doc/642/index.aspx
上一篇:枪毙搜狗爬虫,找工作
下一篇:梦 象棋