12篇学通C#网络编程——第四篇 TCP应用编程
??? 年底了,人浮躁多了,沉不下去心研究技术了,不过昨天终于抢到了回家的票,很开心。 ??? 言归正卷,在WCF出来之后,可能我们玩这些原始的TCP越来越少了,我们知道WCF对TCP进行了再一次的包装,第一反应给我们的或许是 同构系统用TCP,异构系统用HTTP,那么问题来了,异构系统到底可不可以用TCP呢?至少WCF是玩不了的,因为其他语言没有针对.net的“服务 引用”,也没有什么ChannelFactory给你去玩,如果你是一定要追求性能的话,原始的TCP会助你一臂之力的。 ???我们知道最最原始的是玩Socket,由于Socket比较复杂,但是最灵活,C#里面提供了两个简化的包装类:TcpListener和TcpClient。 一:TcpListener ?? 这个是作为服务器端程序而存在的,我们来看看如何使用这服务端。 1: 开启监听地址 1 TcpListener listener = new TcpListener(new System.Net.IPAddress(new byte[] { 127,0,1)">1 }),1)">2222); 2 3 listener.Start(); ? 2:好了,已经开启了,服务端程序开始监听该端口的客户端请求了,那么如何获取该请求呢?简单,listener的AcceptTcpClient属性搞定。 1 var myclient = listener.AcceptTcpClient();
?<1> 收操作: 1 BinaryReader sr = new BinaryReader(client.GetStream()); 3 //客户端数据 4 var data = sr.ReadString();
处理完了之后要返回数据给客户端 2 BinaryWriter sw = BinaryWriter(client.GetStream()); 3 4 sw.Write(string.Format("当前时间:{0},服务端已经处理完毕!",DateTime.Now)); ? 这里要注意的地方就是AcceptTcpClient是阻塞线程的,直到收到客户端请求才算建立了一个TCP连接,在服务端处理的过程中,后续的客户端的请求将 会处理等待直到前一个请求处理完,说了这么多,就是每一个请求我们都建议开一个线程专门为其服务,类似这样。 1 接受客户端的连接请求 2 var myclient = listener.AcceptTcpClient(); 3 4 用工作线程执行用户的请求 5 Task.Factory.StartNew((obj) => 6 { 7 var client = obj as TcpClient; 8 9 client.Close(); 10 11 },myclient);
? 二:TcpClient ?????客户端也很简单,只要我们Connect一下端口,然后通过NetworkStream再Send一些数据就OK了。 1 TcpClient client = TcpClient(); 3 client.Connect(4 5 BinaryWriter bw = 6 7 bw.Write(你好,我来请求你! {0},当前线程:{1}
9 10 ConsoleApplication2 12 13 14 15 16 for (int i = 0; i < 100; i++17 18 Task.Factory.StartNew(() => 20 int j = 0; j < 100; j++21 22 TcpClient client = 23 24 client.Connect(25 26 BinaryWriter bw = 27 28 bw.Write(30 BinaryReader sr = 31 32 var s =33 34 Console.WriteLine(接受到数据:{0}35 } 36 }); 37 } 38 39 40 41 42 } ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |