• Socket协议的形象描述
      socket的英文原义是“孔”或“插座”。在这里作为4BDS UNIX的进程通信机制,取后一种意思。socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。

    通常短连接是这样:连接->传输数据->关闭连接
    那什么是长连接?一般长连接相对短连接而言的,长连接在传输完数后不关闭连接,而不断的发送包保持连接等待处理下一个数据包。
    such as: 连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
  • 那什么时候用短连接呢?
    一般长连接用于少数client-end  to server-end的频繁的通信,例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
    而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源。(查看来源)
  • TCP/IP通信解读长短链接
    一。通信方式
    主要有以下三大类:
    (一)SERVER/CLIENT方式
      1.一个Client方连接一个Server方,或称点对点(peer to peer):
      2.多个Client方连接一个Server方,这也是通常的并发服务器方式。
      3.一个Client方连接多个Server方,这种方式很少见,主要
      用于一个客户向多个服务器发送请求情况。
  • (二)连接方式
    1.长连接
        Client方与Server方先建立通讯连接,连接建立后不断开,
        然后再进行报文发送和接收。这种方式下由于通讯连接一直
        存在,可以用下面命令查看连接是否建立:
        netstat –f inet|grep 端口号(如5678)。
        此种方式常用于点对点通讯。
    2.短连接
      Client方与Server每进行一次报文收发交易时才进行通讯连
      接,交易完毕后立即断开连接。此种方式常用于一点对多点
      通讯,比如多个Client连接一个Server.
  • (三)发送接收方式
    1.异步
      报文发送和接收是分开的,相互独立的,互不影响。这种方
      式又分两种情况:
      (1)异步双工:接收和发送在同一个程序中,有两个不同的
        子进程分别负责发送和接收
      (2)异步单工:接收和发送是用两个不同的程序来完成。
    2.同步
      报文发送和接收是同步进行,既报文发送后等待接收返回报文。
      同步方式一般需要考虑超时问题,即报文发上去后不能无限等
      待,需要设定超时时间,超过该时间发送方不再等待读返回报
      文,直接通知超时返回。
      实际通信方式是这三类通信方式的组合。比如一般书上提供的
      TCP/IP范例程序大都是同步短连接的SERVER/CLIENT程序。有的
      组合是基本不用的,比较常用的有价值的组合是以下几种:
      同步短连接Server/Client
      同步长连接Server/Client
      异步短连接Server/Client
      异步长连接双工Server/Client
      异步长连接单工Server/Client
      其中异步长连接双工是最为复杂的一种通信方式,有时候经
      常会出现在不同银行或不同城市之间的两套系统之间的通信。
      比如金卡工程。由于这几种通信方式比较固定,所以可以预
      先编制这几种通信方式的模板程序。
    二.报文格式
    通信报文格式多样性更多,相应地就必须设计对应的读写报文的接
    收和发送报文函数。
    (一)阻塞与非阻塞方式 
    1.非阻塞方式
    读函数不停地进行读动作,如果没有报文接收到,等待一段时间后
    超时返回,这种情况一般需要指定超时时间。
    2.阻塞方式
    如果没有报文接收到,则读函数一直处于等待状态,直到有报文到达。
    (二)循环读写方式
    1.一次直接读写报文
    在一次接收或发送报文动作中一次性不加分别地全部读取或全部
    发送报文字节。
    2.不指定长度循环读写
    这一般发生在短连接进程中,受网络路由等限制,一次较长的报
    文可能在网络传输过程中被分解成了好几个包。一次读取可能不
    能全部读完一次报文,这就需要循环读报文,直到读完为止。
    3.带长度报文头循环读写
    这种情况一般是在长连接进程中,由于在长连接中没有条件能够
    判断循环读写什么时候结束,所以必须要加长度报文头。读函数
    先是读取报文头的长度,再根据这个长度去读报文.实际情况中,
    报头的码制格式还经常不一样,如果是非ASCII码的报文头,还必须
    转换成ASCII,常见的报文头码制有:
    (1)n个字节的ASCII码
    (2)n个字节的BCD码
    (3)n个字节的网络整型码

------------------------------------------------------------------------------------------------

基于TCP/IP的通讯有两个步骤:1、连接;2、通讯。client连接到server的监听端口,随后在server端会随机产生一个通讯端口和client进行数据通讯。端口是个unsigned short类型的数据结构。所以最多连接是65535。系统一般要求1024前的端口是系统使用的。建议用户程序的监听端口大于10000,通讯端口是系统随机分配的。假如需要有10万个客户端,程序应该怎么处理呢? 如果只有一个服务器,只能用短连接的方式处理。如果都是长连接就要负载均衡。把连接分到其它服务器上去处理。

Socket协议的更多相关文章

  1. LoadRunner编写Socket协议脚本方法

    本文主要介绍使用LoadRunner手工编写Windows Socket协议测试脚本的方法. 通过LoadRunner编写Windows Socket协议测试脚本,总体说来,比较简单.就像把大象放进冰 ...

  2. Loadrunner 中socket协议RecvBuffer接收到数据长度为空

    socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收.另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接.两种方式 server的开销不同. 今天出现 ...

  3. LR socket协议脚本

    socket协议分为TCP.UDP两种(区别与联系在此不做赘述),一种为长连接.一种为短连接.如果创建连接时在init中对应关闭连接在end中,则为长连接:如果创建关闭连接都是在action则为短连接 ...

  4. php 发邮件的2种方式(使用stmp类、使用socket协议)

    方式1:使用stmp类发送邮件 代码: stmp.php <?php header("Content-Type: text/html; charset=utf-8"); cl ...

  5. 使用LR的socket协议进行进行性能测试,转解决方案

    在用LR对公司delphi开发的C/S程序进行测试时,发现只有选择socket协议可以录制代码,经研究是通过TCP/IP的方式将参数保存在buffer中发送的方式来完成操作,但由于将buffer内容参 ...

  6. loadrunner socket协议问题归纳(6)

    首先让我们先看一下loadrunner- winsock 函数 一览表: lrs_accept_connection 接受侦听套接字连接 lrs_close_socket 关闭打开的套接字       ...

  7. loadrunner socket协议问题归纳(3)

    摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发 ...

  8. loadrunner socket协议问题归纳(0)

    一.概述         Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作.     二.socket概述         soc ...

  9. Loadrunner socket协议lrs_receive函数接收到返回数据包 仍然等待服务器返回--解决

    前段时间在使用loadrunner socket协议发送数据包到到服务器,使用lrs_receive接收服务器应答数据包,已经接收到数据包,但LR仍然在等待服务器端返回,而且日志打印显示每次接收返回都 ...

随机推荐

  1. HTTPS=HTTP + SSL / TLS

    以下的两个链接作为本次编辑的参考 https://www.bennythink.com/school-1.htmlhttps://www.bennythink.com/school-2.html 应一 ...

  2. C++从string中删除所有的某个特定字符

    C++中要从string中删除所有某个特定字符, 可用如下代码 str.erase(std::remove(str.begin(), str.end(), 'a'), str.end()); 其中, ...

  3. 制作一个功能丰富的Android天气App

    简易天气是一个基于和风天气数据采用MD设计的Android天气App.目前的版本采用传统的MVC模式构建.通过丰富多彩的页面为用户提供日常所需的天气资讯. 项目说明 项目放在github上面 地址是: ...

  4. [css]《css揭秘》学习(二)-多重边框

    一.box-shadow属性 box-shadow除了生成投影,还可以用来生成边框:它接受第4个值作为扩张半径,0的x轴偏移+0的y轴偏移+0的模糊值+0的扩张半径,得到的显示效果和边框是一样的:但是 ...

  5. 5种IE hasLayoutt的属性及其值

    hasLayout 是Windows  Internet  Explore 渲染引擎的一个内部组成部分.在 Internet Explore 中,一个元素要么自己对自身内容进行计算大小和组织,要么依赖 ...

  6. Webservice_常用

    官网示例: http://cxf.apache.org/docs/writing-a-service-with-spring.html http://cxf.apache.org/docs/jax-r ...

  7. c++ 继承类强制转换时的虚函数表工作原理

    本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace st ...

  8. IOS任务管理之NSThread使用

    前言: 无论是Android还是IOS都会使用到多任务,多任务的最小单元那就是线程,今天学习总结一下IOS的NSThread使用. NSThread使用? 第一种方式实例化 //selector :线 ...

  9. block之---应用场景:做参数和返回值

    1.做参数 什么时候使用Block充当参数? 封装一个功能,这个功能做什么事情由外界决定,但是什么时候调用由内部决定,这时候就需要把Block充当参数去使用. 模拟需求: 封装一个计算器,怎么计算由外 ...

  10. Dynamics CRM 2015-Form之控制Ribbon Button

    在上一篇中,我用一个例子,简单介绍了如何添加Ribbon Button,以及如何理解RibbonDiffXml,对这方面还不清楚的,可以先看看这篇博文:Dynamics CRM 2015-Form之添 ...