首页 > 范文大全 > 正文

浅谈在PowerBuilder中实现Socket通信

开篇:润墨网以专业的文秘视角,为您筛选了一篇浅谈在PowerBuilder中实现Socket通信范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:随着计算机技术以及网络通信技术的发展,Socket技术已经成为了网络编程的基础,SocketAPI提供了进程之间的通信功能。powerbuilder作为一门程序开发语言在开发信息管理系统以及各类跨平台数据库中有着广泛的应用。文章简单介绍了Socket的通信原理以及使用方法,并以聊天程序为例讲解了如何在PowerBuilder中利用Winsock控件增强网络功能,实现socket通信

关键词:套接字;会话层;数据报;TCP套接字;UDP套接字

中图分类号:TP393 文献标识码:A文章编号:1009-3044(2010)02-334-03

On the Socket Communication is Implemented in PowerBuilder

LU Lu, WANG Yan-ping

(Zhengzhou Railway Vocational and Technical College, Zhengzhou 450052, China)

Abstract: With the computer technology and network communication technology, Socket technology has become the basis of network programming, SocketAPI provide a process of communication between. PowerBuilder as a program development language in the development of information management systems and a variety of cross-platform database has a wide range of applications. Article a brief introduction of the Socket communication theory and the use of methods, and to chat program as an example to explain how to use Winsock control in PowerBuilder to enhance network capabilities to achieve Socket Communications.

Key words: socket; session layer; datagrams; TCP socket; UDP socket

Socket编程接口由4BSD UNIX首先提出,目的是解决不同网络间通信问题。Socket接口为进程间通信提供了一种新的手段,它不但能用于同一机器中的进程之间的通信,而且支持网络通信功能。要想弄清楚Socket的工作原理,必须对网络通讯技术有所了解。在计算机界,为了保证各种网络、各种机器、各种操作系统之间能进行互联,进行数据交换,采取了开放式互联模型,即OSI模型,它将网络通讯划分为7个层次。

1 OSI七层模型概述

OSI模型成为计算机之间,以及网络间进行通信的主要的结构模型。从上到下,各层名称及其描述依次为:

1) 第七层:应用层(Application Layer):定义了用于在网络中进行通信和数据传输的接口 ―用户程式;提供标准服务,比如虚拟终端、文件以及任务的传输和处理。

2) 第六层:表示层(Presentation Layer):掩盖不同系统间的数据格式的不同性;指定独立结构的数据传输格式;进行数据的编码和解码、加密和解密、压缩和解压缩。

3) 第五层:会话层(Session Layer):管理用户会话和对话;控制用户间逻辑连接的建立和挂断;报告上一层发生的错误。

4) 第四层:传输层(Transport Layer):管理网络中端到端的信息传送;通过错误纠正和流控制机制提供可靠且有序的数据包传送;提供面向无连接的数据包的传送。

5) 第三层:网络层(Network Layer):定义网络设备间如何传输数据;根据唯一的网络设备地址路由数据包;提供流和拥塞控制以防止网络资源的损耗。

6) 第二层:数据链路层(Data Link Layer):定义操作通信连接的程序;封装数据包为数据帧;监测和纠正数据包传输错误。

7) 第一层:物理层(Physical Layer):定义通过网络设备发送数据的物理方式;作为网络媒介和设备间的接口;定义光学、电气以及机械特性。

通过OSI模型,信息可以从一台计算机的软件应用程序传输到另一台的应用程序上。比如,要实现计算机A与计算机B之间通信,实际上,通信过程是计算机A上的应用程序要将信息发送到计算机B的应用程序。中间过程如下:

计算机A中的应用程序需要将信息先发送到其应用层(第七层),然后此层将信息发送到表示层(第六层),表示层将数据转送到会话层(第五层),如此继续,直至物理层(第一层)。在物理层,数据被放置在物理网络媒介中并被发送至计算机B。计算机B的物理层接收来自物理媒介的数据,然后将信息向上发送至数据链路层(第二层),数据链路层再转送给网络层,依次继续直到信息到达计算机B的应用层。最后,计算机B的应用层再将信息传送给应用程序接收端,从而完成通信过程。

2 Socket概述

2.1 套接字(Socket)所处位置

套接字大致位于OSI模型的会话层。会话层为两台计算机之间的数据流提供管理和控制服务。作为该层的一部分,套接字提供一个隐藏从导线上获取比特和字节的复杂性的抽象。换句话说,套接字允许我们让应用程序表明它想发送一些字节即可传输数据。套接字隐藏了完成该项工作的具体细节。

2.2 套接字的类型

套接字一般有两种类型:TCP套接字和UDP套接字。两者都接收传输协议数据包并将其内容向前传送到表示层。

TCP 把消息分解成数据包(数据报,Datagrams),并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。

UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。一般而言,UDP 强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。

2.3 Socket的使用方法

下面,我们一一给出重要的Socket系统调用的使用方法。

1) 创建 Socket。调用格式为:sockid = socket (af, type, protocol)其参数意义如下:

af:地址族,指本socket所用地址类型。

type:类型,指创建socket的应用程序所希望的通信服务器类型。

protocol:协议,指该socket请求的协议。

2) 指定本地地址―bind()调用。

bind()将本地socket地址与所创建的socket联系起来,即将本socket地址赋予socket,以指定本地半相关。bind()的作用相当于给socket命名,调用格式为bind(sockid,localaddr,addrlen)

其参数意义如下:

sockid:socket号。

localaddr:本地socket地址。

addrlen:地址长度。

3) 建立socket连接―connect()与 accept()调用。

这两个系统调用用于完成整个相关的建立。其中connect用于建立连接。调用格为

connect(sockid,destaddr,addrlen),其中destaddr为指向对方socket地址(信宿地址)结构的指针。

accept()用于面向连接的服务器,其调用格式为:

newsock =accept(sockid,clientaddr,paddrlen),其中clientaddr为指向客户socket地址指针,paddrlen为客户socket地址长度。

4) listen()调用

此调用用于面向连接服务器,表明它愿意接收连接,listen()在accept()之前调用,格式为

listen (sockid,quelen),其中quelen 为请求队列长度。

5) 发送数据―write(),writev(),send()与sendto(),sendmsg()

用于socket数据发送的系统调用一共有五个,其中三个,write(),writev()和send()用于面向连接传输,其余两个用于无连接传输。面向连接的调用可以不指定信宿地址,而无连接的调用必须指定。假如无连接socket的双方均调用过connect(),可以认为是建立有连接的socket,也可以面向连接调用发送数据。

6) 接收数据―read(),readv(),recv()与recvfrom(),recvmsg()

接收数据与发送数据系统调用是一一对应的,两者参数的最大区别是,前者buffer是一个指针,其所指单元初值为欲读数据长度,调用后的值是实际读出的值。

2.4 Socket控件

针对Socket API存在的使用复杂、同步阻塞等问题,Microsoft公司对其进行了封装,开发了WinSock控件。该控件具体使用简单、可靠性强、支持事件等特性,对于开发人员而言,就是一个典型的对象,有属性、方法和事件,因此可以极高地提高软件的开发效率。

Winsock控件对用户是不可视的,可以很容易地访问TCP和UDP网络服务。其可以被Microsoft Access, Visual Basic,Visual C++或Visual FoxPro开发人员使用。要编写客户和服务器应用程序,不需要了解TCP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。

数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。

如果创建客户应用程序,就必须知道服务器计算机名或者IP地址(RemoteHost属性),还要知道进行“侦听”的端口(RemotePort属性),然后调用Connect方法。

如果创建服务器应用程序,就应设置一个收听端口(LocalPort属性)并调用Listen方法。当客户计算机需要连接时就会发生ConnectionRequest事件。为了完成连接,可调用ConnectionRequest事件内的Accept方法。

建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用SendData方法。当接收数据时会发生DataArrival事件。调用DataArrival 事件内的GetData方法就可获取数据。

3 在PB中使用Socket控件的方法

3.1 注册控件

Winsock控件是微软件公司提供的处理网络通信的控件,用它可以进行局域网或则INTERNET的编程开发。该控件并不是默认随Windows 操作系统自带的。有两种方法可以获得它,一是通过安装Visual Studio开发环境; 另外一个方法是下载MsWinsck.ocx文件,然后使用“regsvr32 mswinsck.ocx”命令行进行注册。下面以聊天程序为例演示具体用法。

3.1.1 创建服务器端程序

打开PowerBuilder,然后创建WorkSpace和application对象;创建主窗口w_server对象,并放置控件,如图1所示。

接下来为控件的事件写入以下代码:

Cb_listen控件的clicked事件:

ole_socket.object.localport = 1500;

ole_socket.object.listen();

lb_msg.additem ("开始监听");

ole_socket控件的ConnectionRequest事件

if this.object.state 0 then

this.object.close();

end if

this.object.accept( requestid);

lb_msg.additem ("己经和客户端建立连接!");

ole_socket控件的DataArrival事件

string buf;

this.object.getdata ( ref buf);

lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 客户机端说:"+buf );

cb_send控件的Clicked事件

string buf ;

buf = sle_text.text;

ole_socket.object.senddata ( buf);

lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 服务器端说:"+ buf);

3.1.2 创建客户端程序。

创建过程与创建服务器端相似,这里就不再重复。客户端程序的窗口界面如图2所示。

接下来为控件的事件写入以下代码:

Cb_connect事件的clicked事件

ole_socket.object.remotehost = em_host.text;

ole_socket.object.remoteport = integer ( em_port.text);

ole_socket.object.connect();

lb_msg.additem ( "己经和服务器端建立连接!" ) ;

Ole_socket控件的DataArriavl事件

string buf;

ole_socket.object.getdata ( ref buf ) ;

lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 服务器端说:"+ buf);

cb_send控件的clicked事件

string buf;

buf = sle_text.text;

ole_socket.object.sendData ( buf) ;

lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 客户机端说:"+buf ) ;

4 结论

PB是开发大型MIS及各类数据库跨平台应用的首选。从数据库前端工具来讲甚至远远超过了Oracle的Develop系列等专门的工具,从通用语言角度来讲功能也与VB等不相上下。但是多媒体和网络功能与其他工具相比较弱,该文针对这种情况,结合实际工作中的经验,讨论了如何在PB中通过使用Winsock控件增强网络功能,不足之处,敬请指正。

参考文献:

[1] Donahoo M J.TCP/IP Sockets编程(C语言实现)[M].陈宗斌,译.北京:清华大学出版社,2009.

[2] Iseminger D.网络连接服务开发人员参考库Windows Sockets和QOS[M].北京:机械工业出版社,2001(1).

[3] 蒋东兴.Windows Sockets 网络程序设计大全[M].北京:清华大学出版社,1999.

[4] 蒋东兴,林鄂华.Windows Sockets网络程序设计指南[M].北京:清华大学出版社,1995.

[5] 彭建.基于Sockets的桌面视频会议系统研究[D].长沙:中南大学,2002.

[6] Hatfield B.PowerBuilder 5 应用程序开发指南[M].史森,译.4版.北京:清华大学出版社,1997.

[7] 陈桂友.PowerBuilder数据库开发技术[M].北京:机械工业出版社,2009.

[8] 崔社武.PowerBuilder 9.0基础应用与系统开发[M].北京:电子工业出版社,2004.