论软件接口中几种底层通讯的实现

一、概述

软件接口是实现一个系统跟另外系统进行信息交互的桥梁,在不同的系统之间,根据系统的关联程度的不同存在紧耦合和松耦合两种:紧耦合要求接口响应反应快,消息不能阻塞;松耦合对响应反应要求比较低。本人主要讨论紧耦合接口通讯实现,在目前应用中,Socket、中间件、SOAP等都用相应的应用,但是应用中发现各通讯方式有自己固有的特征,"适合的才是最好的",这是真理。

在接口和系统信息交互的过程中,两种模式使用得很普遍:同步调用和异步调用,同步调用要求接口发出请求消息后必须等待服务端系统的应答消息,接口阻塞直至超时;异步调用则发出请求消息后,接口可以从事其它处理,定时轮询服务端应答消息和消息或事件通知。同步方式简单,但是很容易造成接口阻塞,造成消息积压超时。

二、技术实现

1、Socket通讯

Socket通讯相对来说是很古老的通讯方式,也是最常用的通讯方式。Socket通讯有阻塞和非阻塞两种方式。在同步方式,采用阻塞编程比较简单,但是为了防止接口阻塞,我们需要设置Socket超时,因此可以使用Socket的SELECT模型(参考如下示例代码):

CurReceLen=0;
  for(;;)
  {
    iResult=select(0,&fdread,NULL,NULL,&timeout);
    if(iResult==0)
    {
      AfxMessageBox("接收应答消息超时!!!",MB_OK|MB_ICONERROR);
      closesocket(Socket);
      return FALSE;
    }
    CurReceLen = recv(Socket, oBuf+ReceLen, len, NO_FLAG_SET);
    if((CurReceLen>0) && (CurReceLen != SOCKET_ERROR))
    {
      oBuf[ReceLen+CurReceLen]=''\0'';
              memcpy((char *)&MsgLen,oBuf,sizeof(WORD32));
              MsgLen=ntohl(MsgLen);
      if(ReceLen+CurReceLen==MsgLen)
      {
        ReceLen+=CurReceLen;
        break;
      }
      ReceLen+=CurReceLen;
    }
  }

在异步方式下,采用非阻塞方式实现比较方便,在非阻塞方式下可使用WSAAsyncSelect模型和WSAEventSelect模型:WSAAsyncSelect模型基于消息,WSAEventSelect模型基于事件,下面的示例代码设置了Socket进行读写和关闭操作的消息:

if (status == SOCKET_ERROR)
  {
    WriteLogFile("Set stream socket module fail!!!IP(%s),
           Port(%d) and error(%d)",
           GetIPAddr((PeerMap+node)->IPAddr),
           (PeerMap+node)->PeerPortNo,
           WSAGetLastError());
    CloseSocket(TempSocket,__LINE__,__FILE__);
    return FALSE;
  }

无论使用阻塞方式或非阻塞方式编程,需要重点考虑的一个问题:粘包现象,即应用发送两个或以上的数据包,在Socket通讯层将数据包合并成一个发送出去,因此接收端收到数据包以后需要对数据包根据应用定义的长度进行拆分,否则导致应用层丢包。

时间: 2024-12-03 21:45:45

论软件接口中几种底层通讯的实现的相关文章

当前Java软件开发中几种认识误区

越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训),以致不能很好驾驭Java项目,甚至导致开发后的Java系统性能缓慢甚至经常当机.很多人觉得这是Java复杂导致,其实根本原因在于:我们原先掌握的关于软件知识(OO方面)不是太贫乏就是不恰当,存在认识上和方法上的误区. 软件的生命性 软件是有生命的,这可能是老调重弹了,但是因为它事关分层架构的原由,反复强调都不过分. 一个有生命的软件首先必须有一个灵活可扩展的基础架构,其次才是完整的功能. 目前很多

介绍几种常见通讯协议中与安全控制相关的标准规范

本文首先介绍了几种常见通讯协议中与安全控制相关的标准规范,以便读者理解 Message Broker 安全管理器的底层工作机制:然后介绍了 Message Broker 安全管理器的功能,如何通过创建安全概要文件来定制化安全控制选项,以及如何为特定消息流启用不同的安全设置.在文章的最后,作者还根据以往的项目经验,提到在实际应用中应当了解和注意的几个事项. 传输协议及安全控制 WebSphere Message Broker(简称 Message Broker)作为企业级的整合中间件和服务总线,提

软件开发中的两种态度

一种态度认为,应该对程序员在软件开发中的行为进行约束(DirectingAttitude). 持这种态度的人认为大部分的程序员水平都不高(谣传说有50%的人低于平均水平),所以应该对他们所做的事情进行管教约束.要防止他们做一些可能会给他们 正在开发的系统带来危害的事情.通常,这种态度体现在一些系统设计和工具中时,你会发现它们会试图阻止程序员去做某些事情,限制程序员的一些做法,以此避 免他们陷入过于复杂的境况. 另一种态度认为程序员都是可以信赖的专业人员,应该给他们做自己任何想做的事情的自由.秉持

Java 调用底层接口的几种方法

Java 调用底层接口 Java 调用底层接口要通过动态链接库进行,在windows下是dll文件,linux是so文件 Java调用动态库所需要关心的问题:     如何装载文件,以及如何定位所要使用的方法:      数据类型是如何对应的:     如何给使用的方法传递参数:     如何获取返回的值. 目前调用底层接口用的比较多的技术包括jni.jna.jnative.Nativecall等 JNI 封装本地接口 JAVA可以通过JNI接口访问本地的动态连接库,从而扩展JAVA的功能.使用

讨论四种关键的质量保证实践在软件开发中的重要性

软件开发和工程被视为非常年轻的职业:但是,它们得到了广泛应用,并且正以比以往更快的速度增长.在许多国家,软件行业目前通常被视为经济增长的主要支柱之一.软件公司常常面临着提供高质量软件的许多困难挑战,而他们也在竭尽所能地让客户满意. 软件质量不可或缺 随着软件变成日常生活中不可或缺的一部分,对软件的需求也明显增长.相应地,高软件质量目前被视为是 "必须具备的" 而不是 "应该具备的".让质量保证团队从一开始就参与到项目规划和执行中,这一点至关重要.然而,仍然有一些公司

PHP中实现进程间通讯

进程 PHP中实现进程间通讯 邱文宇   本文将讨论在PHP4环境下如何使用进程间通讯机制--IPC(Inter-Process-Communication).本文讨论的软件环境是linux+php4.0.4或更高版本.首先,我们假设你已经装好了PHP4和UNIX, 为了使得php4可以使用共享内存和信号量,必须在编译php4程序时激活shmop和sysvsem这两个扩展模块. 实现方法:在PHP设定(configure)时加入如下选项. --enable-shmop --enable-sysv

软件接口的历史和未来

软件的未来其实在很大程度上要指望软件接口的前景如何.我们知道,计算机世界里的接口这两个字具有两种众所周知的含义:其一是指软件本身的狭义"接口",比如各种软件开发API等.其二则指的是人与软件之间的交互界面.我们把这种人-软件之间的接口称作"用户界面",也就是"UI". 这里要讨论的前一种定义: 软件不同部分之间的交互接口.通常就是所谓的API--应用程序编程接口,其表现的形式是源代码.API的发明和发展大大促进了计算机产业的进步,同时API几乎决

软件行为模型中的设计模式

Discovering design patterns in software behavior models Sandeep Mitra and T. M. Rao Department of Computing Sciences The College at Brockport, State University of New York Brockport, NY 14420 585 395-2234 smitra@brockport.edu 探索软件行为模型中的设计模式 Sandeep M

浅谈软件静态测试中的代码审查

摘要:本文描述了软件代码审查的作用.代码审查内容.代码审查过程,并列举一些常见代码审查问题. 关键词:软件测试:代码审查: 一.引言 软件测试常用方法可分为动态测试和静态测试,只有动态测试和静态测试有效结合,才能更好的完成软件测试工作.代码审查是软件静态测试中常用的软件测试方法之一,代码审查时,只要测试人员方法得当.足够细心,往往能够产生意想不到的效果. 二.代码审查的作用 代码审查是在不执行软件的条件下有条理的仔细审查软件代码,从而找出软件缺陷的过程. 代码审查可以找出动态测试难以发现或隔离的