TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
首先我简单介绍一下同步TCP编程 与异步TCP编程。
在服务端我们通常用一个TcpListener来监听一个IP和端口。客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收。比如:
TcpListene server = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
TcpClient tc =server.AcceptTcpClient();
这里就一个同步接收的方式,那为什么说同步呢,因为在这个端口下如果同是来了两个客户端请求,第一个连接得到响应,与服务端建立通讯,而第二个请求就会被一直阻塞直到第一个请求完成操作,各个请求之间就好像排个队,顺序执行,这就是同步。
异步呢,就是同时来两个或者多个请求,服务端就同时响应多个客户端,同时给他们连接。各个客户端与服务器的通讯是并行的,一个客户端不必等另一个客户端完成操作。通常用这两个方法来接收一个客户端请求。
BeginAcceptTcpClient()
EndAcceptTcpClient()
//----------------------------------------------------------------------------------------------------------------------
最近练习一个程序 订票客户管理系统。用到TCP编程。
这个程序可以从用三种模式来完成。
1.阻塞模式(仅适合短连接)
这样。
TcpListene server = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
while(true)
{
TcpClient tc =server.AcceptTcpClient();
// do ........................
}
来一个连接服务端端就响应了,然执行操作,如果操作没完成再来一个客户端请求就阻塞你,直到第一个请求完成操作。
总结特点:这种模式简单易行,适合客户端请求次数比较少场景。比如一下来了1000个请求,第一个去执行了 ,剩下的999个被阻塞。
2.多线程+阻塞模式(用于长连接和短连接)
TcpListene server = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
while(true)
{
TcpClient tc =server.AcceptTcpClient();
//接收到客户端请求之后 就起一个线程 负责这个客户端TCP与服务端的通讯
Thread Th=new Thread(F);
Th.start();//有参数加参数没参数不加
}
void F( object oo)
{
//和客户端进行通讯
}
想 这样,一个请求来个,服务端响应然后给你一个线程负责和你的通讯。然后服务端又去响应其他客户端的请求。而不必等待前一个连接是否完成操作。这样模式由于 引入了多线程,就变成了异步操作就要考虑对临界资源的互斥问题,就是让多个线程访问一个资源时候,去同步他们的操作。这里不再说了。
在负责给客户端的方法中 这里我随便写了个F(object oo)如果关闭当前连接。就是异步的端连接, 如果不关就是异步的长连接。根据需要来确定。
总结特点:这种模式由于引入了多线程,提高了系统的效率,但是要考虑临界资源的互斥问题,如何管理线程生命周期。
3 非阻塞模式
就不在用AcceptTcpClient()这种阻塞方式来接收请求。就是来一个请求马上接收。
通常用这两个方法组合使用
TcpListene server = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
server.Start();
server.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), server);
void AcceptClient(IAsyncResult ar)
{
TcpListener server = (TcpListener)ar.AsyncState;
TcpClient client = server.EndAcceptTcpClient(ar);
}
当执行BeginAcceptTcpClient时候编译器就会在线程池中创建一个线程监听连接请求,如果有请求就会自动调用委托的方法(这里的AcceptClient)来完成一个 TcpClient 的实例,再来一个客户端请求,线程池又新建一个线程去实例一个TcpClient对象,当然了如果想做长连接的多客户端与服务端的通讯时候,每一个TcpClient对象是要保存起来的,这只是异步的接收请求而已。
听说做大型项目异步接收用的很多。
TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍的更多相关文章
- TCP同步与异步,长连接与短连接【转载】
原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896 这是今天看到的一篇讲到T ...
- Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】
转自:http://blog.csdn.net/jacobywu/article/details/7475432 阻塞型I/O和非阻塞I/O 阻塞:休眠 非阻塞:异步通知 一 休眠 安全地进入休眠的两 ...
- 阻塞式I/0 和 非阻塞式I/O 同步异步详细介绍
请求描述: `阻塞/非阻塞` 和 `同步/异步` 不是一个概念.举几个简单的例子. 当进程调用一个进行IO操作的API时(比如read函数),在数据没有到达前,read 会挂起,进程会卡住.在数据读取 ...
- JAVA阻塞(IO)和非阻塞(NIO)
查看这篇文章,了解更多关于Java的阻塞和非阻塞替代创建套接字的信息. 套接字使用TCP / IP传输协议,是两台主机之间的最后一块网络通信. 您通常不必处理它们,因为它们之上构建了协议,如HTTP或 ...
- Linux非阻塞IO(四)非阻塞IO中connect的实现
我们为客户端的编写再做一些工作. 这次我们使用非阻塞IO实现connect函数. int connect(int sockfd, const struct sockaddr *addr, sockle ...
- Linux非阻塞IO(三)非阻塞IO中缓冲区Buffer的实现
本文我们来实现回射服务器的Buffer. Buffer的实现 上节提到了非阻塞IO必须具备Buffer.再次将Buffer的设计描述一下: 这里必须补充一点,writeIndex指向空闲空间的 ...
- socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就 ...
- socket阻塞与非阻塞,同步与异步
socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...
- Python番外之 阻塞非阻塞,同步与异步,i/o模型
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就 ...
随机推荐
- javascript基础知识拾遗
1 下面列出的值被当作假 false null undefined '' 0 NaN 其它所有值被当作是真 console.log(undefined || true); //true console ...
- c# TextBox只允许输入数字,禁用右键粘贴,允许Ctrl+v粘贴数字
TextBox只允许输入数字,最大长度为10 //TextBox.ShortcutsEnabled为false 禁止右键和Ctrl+v private void txtNumber_KeyPress( ...
- Moqui学习Day1
运行时目录以及Moqui的xml配置文件 Moqui框架部署运行主要有三个核心部分: 可执行的war包文件 运行时目录 Moqui配置文件XML格式 不管怎么使用这个可执行的war文件,你必须拥有一个 ...
- Daily Scrum – 1/19
Meeting Minutes 绑定了快捷键: 改良了user course: 修了一系列Bug: 准备进行演示 Progress part 组员 今日工作 Time (h) 明日计划 Time ...
- Git的基本使用方法和安装&心得体会
1. git的安装和github的注册.代码托管.创建organization.邀请member. (1)git的安装 因为我电脑是windows系统,所以下载的是git for windows.在官 ...
- Java继承中属性、方法和对象的关系
大家都知道子类继承父类是类型的继承,包括属性和方法!如果子类和父类中的方法签名相同就叫覆盖!如果子类和父类的属性相同,父类就会隐藏自己的属性! 但是如果我用父类和子类所创建的引用指向子类所创建的对象, ...
- 一篇让Java程序猿随时可以翻看的Oracle总结
来源:http://www.cnblogs.com/bzx888/p/4820712.html 有关的语句和操作基本都是按照实战中的顺序来总结的,比如创建用户,建表,序列初始化,插入数据的顺序呢. 这 ...
- JDK的目录
要想深入了解Java必须对JDK的组成, 本文对JDK6里的目录做了基本的介绍,主要还是讲解 了下JDK里的各种可执行程序或工具的用途 Java(TM) 有两个平台 JRE 运行平台,包括Java虚拟 ...
- grunt使用watch和livereload的Gruntfile.js的配置
周末在家看angularJS, 用grunt的livereload的自动刷新, 搞了大半天, 现在把配置贴出来, 免得以后忘记了, 只要按照配置一步步弄是没有问题的; 开始的准备的环境安装是: (1) ...
- 【HDU 5578】Friendship of Frog
题 题意 求相同字母最近距离 分析 用数组保存各个字母最后出现的位置,维护最小距离. 代码 #include <cstdio> int c[30],n,p,a,minl; char ch; ...