• TCP同步与异步,长连接与短连接【转载】


    【转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到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对象是要保存起来的,这只是异步的接收请求而已。

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

  • 相关阅读:
    matplotlib数据可视化之柱形图
    xpath排坑记
    Leetcode 100. 相同的树
    Leetcode 173. 二叉搜索树迭代器
    Leetcode 199. 二叉树的右视图
    Leetcode 102. 二叉树的层次遍历
    Leetcode 96. 不同的二叉搜索树
    Leetcode 700. 二叉搜索树中的搜索
    Leetcode 2. Add Two Numbers
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/guozhen/p/5841180.html
Copyright © 2020-2023  润新知