TCP同步与异步,长连接与短连接

首先我简单介绍一下同步TCP编程 与异步TCP编程。

在服务端我们通常用一个TcpListener来监听一个IP和端口。客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收。比如:

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

TcpClient tc =server.AcceptTcpClient();

这里就一个同步接收的方式,那为什么说同步呢,因为在这个端口下如果同是来了两个客户端请求,第一个连接得到响应,与服务端建立通讯,而第二个请求就会被一直阻塞直到第一个请求完成操作,各个请求之间就好像排个队,顺序执行,这就是同步。

异步呢,就是同时来两个或者多个请求,服务端就同时响应多个客户端,同时给他们连接。各个客户端与服务器的通讯是并行的,一个客户端不必等另一个客户端完成操作。通常用这两个方法来接收一个客户端请求。

BeginAcceptTcpClient()

EndAcceptTcpClient()

//----------------------------------------------------------------------------------------------------------------------

最近练习一个程序 订票客户管理系统。用到TCP编程。

这个程序可以从用三种模式来完成。

1.阻塞模式(仅适合短连接)

这样。

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

while(true)

{

              TcpClient tc =server.AcceptTcpClient();

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

}

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

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

2.多线程+阻塞模式(用于长连接和短连接)

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)

{

          //和客户端进行通讯

}

想这样,一个请求来个,服务端响应然后给你一个线程负责和你的通讯。然后服务端又去响应其他客户端的请求。而不必等待前一个连接是否完成操作。这样模式由于引入了多线程,就变成了异步操作就要考虑对临界资源的互斥问题,就是让多个线程访问一个资源时候,去同步他们的操作。这里不再说了。

在负责给客户端的方法中 这里我随便写了个F(objectoo)如果关闭当前连接。就是异步的端连接,如果不关就是异步的长连接。根据需要来确定。

总结特点:这种模式由于引入了多线程,提高了系统的效率,但是要考虑临界资源的互斥问题,如何管理线程生命周期。

3 非阻塞模式

就不在用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对象是要保存起来的,这只是异步的接收请求而已。

听说做大型项目异步接收用的很多。


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值