学通C#网络编程——第四篇 TCP应用编程
来源:互联网 发布:淘宝怎么删除空间图集 编辑:程序博客网 时间:2024/06/06 16:38
年底了,人浮躁多了,沉不下去心研究技术了,不过昨天终于抢到了回家的票,很开心。
言归正卷,在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, 0, 1 }), 2222);2 3 listener.Start();
2:好了,已经开启了,服务端程序开始监听该端口的客户端请求了,那么如何获取该请求呢?简单,listener的AcceptTcpClient属性搞定。
1 var myclient = listener.AcceptTcpClient();
3:我们知道TCP传的是字节流,通过myclient.GetStream()就可以获取一个NetworkStream,利用这个Stream就可以进行收发信息了。
<1> 收操作:
1 BinaryReader sr = new BinaryReader(client.GetStream());2 3 //客户端数据4 var data = sr.ReadString();
<2>发操作:也就是所谓的返回值
1 //处理完了之后要返回数据给客户端2 BinaryWriter sw = new BinaryWriter(client.GetStream());3 4 sw.Write(string.Format("当前时间:{0},服务端已经处理完毕!", DateTime.Now));
这里要注意的地方就是AcceptTcpClient是阻塞线程的,直到收到客户端请求才算建立了一个TCP连接,在服务端处理的过程中,后续的客户端的请求将
会处理等待直到前一个请求处理完,说了这么多,就是每一个请求我们都建议开一个线程专门为其服务,类似这样。
//接受客户端的连接请求var myclient = listener.AcceptTcpClient();//用工作线程执行用户的请求Task.Factory.StartNew((obj) =>{ var client = obj as TcpClient; client.Close();}, myclient);
好了,服务器端大概就是这个样子,再有的就是一些相关属性配置了,像wcf那样什么opentime,sendtime啥的。
二:TcpClient
客户端也很简单,只要我们Connect一下端口,然后通过NetworkStream再Send一些数据就OK了。
TcpClient client = new TcpClient();client.Connect(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222);BinaryWriter bw = new BinaryWriter(client.GetStream());bw.Write(string.Format("你好,我来请求你! {0},当前线程:{1}", j, Thread.CurrentThread.ManagedThreadId));
三:模拟
最后我们模拟下,客户端开启100个线程,每个线程请求100次,服务器端对每个线程都用工作线程去处理,是不是找到了netTcpBinding的
感觉,最后一个大家都懂的道理就是线程多了不是好事情。
服务端:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net.Sockets;using System.IO;using System.Threading.Tasks;using System.Threading;using System.Net;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { TcpListener listener = new TcpListener(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222); listener.Start(); //用专门的线程来接受请求 Task.Factory.StartNew(() => { //不间断的接受客户端请求 while (true) { //接受客户端的连接请求 var myclient = listener.AcceptTcpClient(); //用工作线程执行用户的请求 Task.Factory.StartNew((obj) => { var client = obj as TcpClient; BinaryReader sr = new BinaryReader(client.GetStream()); //客户端数据 var data = sr.ReadString(); //客户端ip var ip = (IPEndPoint)client.Client.RemoteEndPoint; Console.WriteLine("当前时间:{0},接受到了来自IP:{1}:{2},的请求,发来的数据为:{3}", DateTime.Now, ip.Address, ip.Port, data); Thread.Sleep(1000 * 5); //处理完了之后要返回数据给客户端 BinaryWriter sw = new BinaryWriter(client.GetStream()); sw.Write(string.Format("当前时间:{0},服务端已经处理完毕!", DateTime.Now)); client.Close(); }, myclient); } }); Console.WriteLine("服务端已经启动..."); Console.Read(); } }}客户端:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net.Sockets;using System.IO;using System.Threading;using System.Threading.Tasks;namespace ConsoleApplication2{ class Program { static void Main(string[] args) { for (int i = 0; i < 100; i++) { Task.Factory.StartNew(() => { for (int j = 0; j < 100; j++) { TcpClient client = new TcpClient(); client.Connect(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222); BinaryWriter bw = new BinaryWriter(client.GetStream()); bw.Write(string.Format("你好,我来请求你! {0},当前线程:{1}", j, Thread.CurrentThread.ManagedThreadId)); BinaryReader sr = new BinaryReader(client.GetStream()); var s = sr.ReadString(); Console.WriteLine("接受到数据:{0}", s); } }); } Console.Read(); } }}
转自:http://www.cnblogs.com/huangxincheng/archive/2013/01/18/2866492.html
- 学通C#网络编程——第四篇 TCP应用编程
- 12篇学通C#网络编程——第四篇 TCP应用编程
- C# 网络编程:TCP编程
- 网络编程—TCP
- 《UNIX网络编程》读书笔记——第四章(基本TCP套接字编程)
- Linux网络编程——tcp的应用教程
- c#网络编程之TCP
- C# TCP 网络编程示例
- C# TCP/IP网络编程
- 网络编程之TCP应用
- Linux 网络编程——TCP编程
- QT网络编程—TCP
- PYthon -网络编程—TCP编程
- C#网络编程系列五:TCP编程
- C#网络编程系列五:TCP编程
- C# 网络编程系列五:TCP编程
- C#网络编程——第二篇 HTTP应用编程(上)
- C#网络编程——第三篇 HTTP应用编程(下)
- Form表单之input文本框操作
- [积累] gerrit 不经代码审核直接push进库的方法
- PowerDesigner利用oracle11gR2中的表逆向生成物理模型
- Mysgit+copssh+git extension+Visual studio windows7 服务器与客户端的搭建
- ubuntu添加新用户
- 学通C#网络编程——第四篇 TCP应用编程
- 论打造团队
- RecyclerView机制分析: State
- Linux 之 JDK 的安装(配置环境变量)
- 为猿七年有余,痒否?痛否?
- iOS开发抓包工具之Charles使用
- 4个理由告诉你Java为何在编程语言中排行第一
- 使用TortoiseGit操作分支的创建与合并
- CUDA总结:Occupancy