博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP同步和异步连接_学习笔记
阅读量:4303 次
发布时间:2019-05-27

本文共 1396 字,大约阅读时间需要 4 分钟。

所谓同步连接,就是一个服务器与第一个请求建立连接并通信后,第二个请求将会被阻塞。

所谓异步连接,就是一个服务器可以同时响应多个请求。

 

同步:服务器与接受请求的代码:

 

TcpListene server = newTcpListener(IPAddress.Parse("127.0.0.1"), port);

TcpClient tc =server.AcceptTcpClient();

 

异步:

 

BeginAcceptTcpClient()

EndAcceptTcpClient()

 

 

第一种模式:阻塞模式(同步)

 

TcpListene server = newTcpListener(IPAddress.Parse("127.0.0.1"), port);

while(true)

{

              TcpClient tc =server.AcceptTcpClient();

             //  do ........................

}

来一个连接服务端端就响应了,然执行操作,如果操作没完成再来一个客户端请求就阻塞你,直到第一个请求完成操作。

总结特点:这种模式简单易行,适合客户端请求次数比较少场景。比如一下来了1000个请求,第一个去执行了,剩下的999个被阻塞。

 

第二种模式:多线程+阻塞(异步) 。。。 其实异步感觉就是多线程,涉及到临界资源的互斥问题。

 

TcpListene server = newTcpListener(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)

{

          //和客户端进行通讯

}

 

 

第三种模式:非阻塞模式(异步)

 

 

就不在用AcceptTcpClient()这种阻塞方式来接收请求。就是来一个请求马上接收。

通常用这两个方法组合使用

TcpListene server = newTcpListener(IPAddress.Parse("127.0.0.1"), port);

 server.Start();

 server.BeginAcceptTcpClient(newAsyncCallback(AcceptClient), server);

   voidAcceptClient(IAsyncResult ar)

       {
           TcpListener server = (TcpListener)ar.AsyncState;
           TcpClient client = server.EndAcceptTcpClient(ar);
       }

当执行BeginAcceptTcpClient时候编译器就会在线程池中创建一个线程监听连接请求,如果有请求就会自动调用委托的方法(这里的AcceptClient)来完成一个TcpClient的实例,再来一个客户端请求,线程池又新建一个线程去实例一个TcpClient对象,当然了如果想做长连接的多客户端与服务端的通讯时候,每一个TcpClient对象是要保存起来的,这只是异步的接收请求而已。

转载地址:http://wimws.baihongyu.com/

你可能感兴趣的文章
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>
linux安装docker
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>
工作流中文乱码问题解决
查看>>
maven打包本地依赖包
查看>>
spring boot jpa 实现拦截器
查看>>
jenkins + maven+ gitlab 自动化部署
查看>>
Pull Request流程
查看>>
Lambda 表达式
查看>>
函数式数据处理(一)--流
查看>>