基于Socket套接字的医学信息传送模块的设计与实现

2014-02-05 02:41王维红樊廷玖
中国医学装备 2014年1期
关键词:调用线程进程

王维红 樊廷玖

基于Socket套接字的医学信息传送模块的设计与实现

王维红① 樊廷玖①

目的:提高数字化影像系统的检索速度、传送效率以及改变传统影像保存的缺陷,提高临床影像诊断质量。方法:设计基于Socket套接字的多线程的医学信息传送模块,通过实现多个线程并行工作而提高程序的运行速度,并实现图像、文件等各类资源的快速传输。结果:将基于Socket套接字的医学信息传送模块运用于医院各科室以及远程医疗系统的各个方面,提高了医学信息传输速度,节省了传输时间和资金。结论:基于Socket套接字的医学信息传送模块的利用可以对医院医学影像资源进行有效管理和充分利用。

套接字;多线程;网络通信

[First-author’s address]The First Hospital of ZiBo, Shandong 55200, China

现代信息技术的进步日新月异,使得数字化的影像保存切实可行,高效率、无胶片化的图像归档和通信系统(picture archiving and communication systems,PACS)应运而生,实现影像传递和共享[1]。但该系统存在人工检索速度慢、传送效率低、图片在传递过程中会发生丢失以及存档归档出错无法查找等问题,同时胶片长期保存易出现霉变、丢失等缺陷,从而影响诊断的准确性。因此,如何利用信息化的手段对医学影像资源进行有效的管理和应用是目前医院需解决的重要问题。

1 Socket套接字及线程概述

1.1 Socket套接字

套接字是网络的基本构件,是可以被命名和寻址的通信端点,使用中的每个套接字均有其类型和一个与之相连接进程[3]。套接字存在通信区域中只与同一区域中的套接字交换数据(跨区域时需要执行某和转换进程方能实现)。即通信双方的一种约定,用套接字中的相关函数完成通信的过程。

套接字分为流式套接字和数据报套接字。流式的套接字可提供可靠的、面向连接的通讯流。数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,且不保证可靠,无差错。基本的套接字函数调用包括:Socket()-创建Socket;bind()-将创建的Socket与本地端口绑定;connect()与accept()-建立Socket连接;listen()-服务器监听是否有连接请求;send()-数据的可控缓冲发送;recv()-可控缓冲接收;closesocket()-关闭Socket;启动函数WSAStartup()-建立与Windows Sockets DLL的连接,终止函数WSAClearup()-终止使用该DLL,这两个函数必须成对使用。

在面向连接的通讯中服务器和客户机在交换数据之前先要建立一个连接,在无连接通讯中数据作为信息的一部分被交换。无论哪一种方式,服务器总是最先启动,将自己绑定在一个套接字上,然后侦听信息。使用面向连接的套接字工作流程如下:启动服务器→通过调用socket()建立一个套接字→调用bind()将该套接字和本地网络地址联系在一起→调用listen()使套接字做好侦听的准备,并规定其请求队列的长度→调用accept()来接收连接。客户在建立套接字后即可调用connect()和服务器建立连接,一旦建立连接客户机与服务器之间便可通过调用read()和write()进行发送和接收数据,待数据传送结束后双方调用close()关闭套接字。

1.2 线程及进程

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,其本身不拥有系统资源,但可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可创建和撤消另一个线程,同一进程中的多线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程有就绪、阻塞和运行3种基本状态。线程和进程的区别在于子进程和父进程有不同的代码和数据空间,而多线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。线程在运行中需要使用计算机的内存资源和CPU,有线程进入了就绪状态,需要有线程调度程序根据优先级来决定何时执行[4]。

进程只是静态的概念,为使进程完成工作而必须至少占有一线程,线程是描述进程内的执行,线程负责执行包含在进程的地址空间中的代码。单个进程可能包含数个线程,可同时执行进程的地址空间中的代码。每个线程有自己的一组CPU寄存器和堆栈。每个进程至少有一个线程在执行其地址空间中的代码,如无线程执行进程地址空间中的代码,进程则无继续存在的理由,系统将自动清除进程及其地址空间。为了运行所有线程,操作系统为每个独立线程安排CPU时间,操作系统以轮转方式向线程提供时间片。创建32位Windows进程时其第1个线程称为主线程,由系统自动生成,可由其主线程生成额外的线程,并又可生成更多的线程[5]。

在单个程序中同时运行多个线程完成不同的工作,称为多线程。多线程是为了使得多个线程并行工作以完成多项任务,提高系统的效率。使用多线程的优点为:①使用线程可将占据长时间程序中的任务放至后台处理;②用户界面更加吸引人,如用户点击按钮触发某些事件的处理,便可弹出进度条显示处理进度;③加快程序运行速度;④创建速度快、系统开销小,创建线程不需要另行分配资源;⑤通信简洁、信息传送速度快,线程间的通信在统一地址空间进程,不需要额外的通信机制;⑥并行性高,线程能独立执行、充分利用和发挥处理器与外围设备并行工作的能力。

2 医学信息传送模块的设计

20世纪90年代初,由Microsoft联合其他公司共同制定了Windows下的网络编程接口,即Windows Sockets规范,其为一套开放的、支持多种协议的Windows下的网络编程接口,较常使用的是传输控制协议/网间协议(TCP/IP)。Socket在计算机中提供了通信端口,可通过其端口与任何具有Socket接口的计算机通信。应用程序在网络上的信息均通过Socket接口来实现[6]。

Windows Sockets的实现由两部分组成:开发组件和运行组件。开发组件是程序员开发Windows Sockets应用程序所使用,包括介绍Windows Sockets实现的文档、Windows Sockets应用程序接口(API)引入库和头文件。运行组件是Windows Sockets应用程序接口的动态连接库(DLL),文件名为WINSOCK.DLL,应用程序在执行时通过装入他实现网络通信功能。

TCP/IP是一种网络通信协议,其中TCP是提供传输层服务,而IP则是提供网络层服务。TCP/IP协议的核心部分是传输层协议(TCP、UDP)、网络层协议(IP)和物理接口层,这3层通常是在操作系统内核中实现,因此用户一般不涉及。编程界面有两种形式:①由内核心直接提供的系统调用;②使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,因此要使用套接字(Socket)来实现。

Winsockets编程之套接字原理在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于非对等作用和通信完全异步两点。客户机/服务器模式在操作过程中采取的是主动请示方式。

(1)服务器方需先启动并根据请示提供相应服务,其流程如下:打开一通信通道并告知本地主机,其愿意在某一个公认地址上接收客户请求→等待客户请求到达该端口→接收到重复服务请求,处理该请求并发送应答信号→返回第二步,等待另一客户请求→关闭服务器。

(2)客户方:打开一通信通道,并连接到服务器所在主机的特定端口→向服务器发送服务请求报文,等待并接收应答;继续提出请求……→请求结束后关闭通信通道并终止。

3 医学信息传送模块的具体实现步骤

网络读写操作是PACS系统的基础,PACS系统通过TCP/IP的网络来交换各种DICOM命令和文件[7]。通过Socket将DICOM命令和文件发送给TCP/IP,实现网络读写功能模块设计的目的。通过编写客户端和服务器程序,完成客户机端的发送及服务器端的侦听和接收。为了优化程序设计,使服务器端不会出现无法响应的现象,采用多线程的编程方法,建立工作者线程进行后台处理。

3.1 客户端程序设计

(1)新建对话框工程client。为了将现有的Socket变成资源,将Socket.h和socket.cpp放到client工程目录下,并在工程中通过project->add to project->files添加这两个文件,通过这其中的类来间接使用Socket[8]。

(2)为了使用windows系统的网络操作功能,在对话框工程server的头文件中通过project->add to project->file加入#include “winsock.h”,并在菜单project->settings->link->input的Object/library modules中加入winsock32.lib。

(3)新建Send按钮,生成其响应函数OnSend,在此函数中,生成一个Socket局部变量,并使用Open函数(两个参数分别是ip地址和端口)打开对服务端的连接,生成一个字符串,使用SendBinary函数(两个参数分别是字符串指针和字符串长度)发送信息。

3.2 服务器端程序设计

(1)新建对话框工程server。为了利用现有的socket编程资源,将socket.h和socket.cpp放到server工程目录下,并在工程中通过project->add to project->files添加这两个文件,通过其中的文件类来间接使用socket[9]。

(2)同客户端程序设计中的第2条。

(3)新建Listen按钮,并生成其响应函数OnListen,在此函数中调用AfxBeginThread()函数创建一个线程。AfxBeginThread()函数首先创建了一个CwinThread实例,然后调用该实例的CreateThread()成员函数创建线程。

3.3 应用程序源代码

3.3.1 客户端程序

3.3.2 服务器端程序

4 结语

基于Socket套接字的多线程医学信息传送模块的实现使得多个线程并行的工作可完成多项任务,并可将程序中占据长时间的任务放到后台去处理,程序的运行速度因此而加快,实现了图像、文件等各类资源的迅速传输[2]。将基于Socket套接字的多线程技术运用到医院各科室之间的影像信息传输、资源共享以及远程医疗系统的各方面,会使传输的速度进一步提高,可节省时间提高工作效率和经济效益。

[1]熊宇,段会龙,吕维雪.图像归档和通讯系统(PACS)的发展与应用[J].国外医学生物医学工程分册,2000,23(2):70-75.

[2]孙钦龙,邵惠鹤.socket套接字在工业数据通信中的应用[J].控制工程,2006,12(2):35-275.

[3]郑灵翔,洪景新.Windows 2000/XP下原始套接字的编程与应用[J].微型机与应用,2002,21(6):27-30.

[4]王静,曲凤娟.基于Socket的多用户并发通信的设计[J].福建电脑,2007(3):164-165.

[5]Noumeir R.DICOM structured report document type definition[J].IEEE Trans Inf Technol Biomed,2003,7(4):318-328.

[6]李泽强,胡淑涛,王华楠.医院小型PACS系统的设计与实现[J].生物医学工程学杂志,2001,18(3):494-496.

[7]姚东明,杨力.PACS在医院信息系统中应用的认识[J].中国卫生事业管理,2002(7):446-447.

[8]张静华.应用套接字模型实现网络通信[J].山西电子技术,2004(4):19-21.

[9]庞文尧,崔婷.基于Winsock的网络实时控制程序开发[J].小型微型计算机系统,2004,25(1):45-47.

Research on the designing and realization of medical information transmission based on the socket

/WANG Wei-hong, FAN Ting-jiu// China Medical Equipment,2014,11(1):36-39.

Objective:To improve the digital image system's retrieval speed and transmission efficiency, change the defect of traditional preservation and improve diagnostic quality of the image.Methods:Medical information transmission based on the socket can make the multi-threading parallel work to improve the running speed of the program, so images and files can be transmitted quickly.Results:Socket–based multi-threading technology is applied to the hospital departments and various remote medical system, that will improve the transmission speed and save time and money.Conclusion:Medical information transmission based on the socket can manage and application the medical imaging effectively.

Socket; Multi-threaded; Network communication

10.3969/J.ISSN.1672-8270.2014.01.013

1672-8270(2014)01-0036-04

R197.324

A

2013-09-09

①淄博市第一医院设备科 山东 淄博 255200

王维红,女,(1973- ),本科学历,工程师。淄博市第一医院设备科,从事医疗设备管理和维修工作。

猜你喜欢
调用线程进程
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
核电项目物项调用管理的应用研究
债券市场对外开放的进程与展望
线程池调度对服务器性能影响的研究*
改革开放进程中的国际收支统计
系统虚拟化环境下客户机系统调用信息捕获与分析①
社会进程中的新闻学探寻
利用RFC技术实现SAP系统接口通信
俄罗斯现代化进程的阻碍