当前位置:首页 » 城管服务 » 创建服务

创建服务

发布时间: 2021-01-09 05:36:42

服务型政府要怎样建立

服务型政府应该是“阳光政府、创新政府、责任政府、法治政府”等模式交叉、综合渗透的结果。它的建立与发展应遵循以下的方法途径。

(一)在政府行政程序上:公开透明,建设阳光政府。政务必须向公众公开,包括政府组织的使命公开、办事程序公开、常用法规公开以及办事结果公开等。

(二)在政府行政功能上:建设服务型政府。服务型政府理念要成为政府工作的宗旨,寓管理于服务中,为企业发展创造良好的、公平的竞争环境,为公民提供完善的公共服务。

(三)在政府行政机制上:建设创新型政府。政府管理制度创新的必要性,首先是为了提高政府的活力和效率。政府是一种自然垄断性组织,只有引入创新、激励和竞争精神,才能提高效率。其次为了适应政治、经济全球化的需要,必须进行管理制度的创新。最后是为了解决国内经济发展的具体问题,要求政府制度不断创新。

(四)在政府行政技术手段上:建设电子型政府。电子政府是信息化时代的产物,也是建设公共政府体制的重要基础。电子政府的建立,不仅可以使老百姓能够得到更广泛、更便捷的信息和服务,而且可以大大降低行政成本,提高政府服务效率,进一步规范政府行为方式,改变政府与企业、公民之间的信息不对称,做到透明化、公共化,从而减少滋生腐败现象产生的温床。

(五)在政府行政规则上:依法行政,建设法治型政府。市场经济是法制经济,WTO的规则正是建立在法律、法规的基础上,它们要求政府必须依法行政、依法管理经济与社会事务,摒弃行政过程中的“暗箱”操作,提高行政效率。政府的所有权力要源于法律,源于人民的授权,使行政过程发生在法律和人民的密切监督之下。

(六)在职能定位上:建设服务型政府,前提是要明确政府应当承担什么职能。党的十六大对政府职能作了四项界定:经济调节,市场监管,社会管理,公共服务。党的十七大要求“强化社会管理和公共服务”,进一步强调了政府的公共服务职能。

(七)在服务内容上:建立健全符合国情、切实有效的公共服务体系。从世界范围看,20世纪三四十年代以前,政府公共服务体系的基本特征是“有限的公共服务体系”。第二次世界大战以来,一些国家建立了比较成型的公共服务体系。我国的国情比较特殊,这种特殊性表现为“三合一”:我国是一个发展中国家,一个转型国家,一个实行社会主义制度、处于社会主义初级阶段的国家。借鉴国际经验,从国情出发,我国的政府公共服务体系主要应包括四项基本内容。

第一,提供就业服务和基本社会保障等基本民生性服务。

第二,提供教育、医疗、公共文化等公共事业性服务。教育、医疗、文化等领域,情况比较复杂,需要区分营利性和非营利性。对于发展公共事业性服务,政府责无旁贷。

第三,提供环境保护、基础设施建设等公益性基础服务。政府应担负起保护环境的责任,切实推动节能减排。同时,还应加快电网、铁路网、通讯网等基础设施建设,对其中属于商业性的部分交由市场去做,属于公益性的部分直接承担起来。

第四,提供生产安全、消费安全、社会安全等公共安全性服务。对生产安全,企事业单位负有责任,政府也应强化安全服务体系建设和监管职责。而消费、食品和药品安全等都是公共服务体系建设的基础性环节,政府责无旁贷。

(八)在服务方式上:在不断创新中提高公共服务的能力和水平。当今世界,经济社会各个方面都在发生深刻变革,政府管理方式和服务方式也在不断创新。特别是信息化的快速发展,为政府提高管理和服务水平提供了广阔空间。在这种情况下,我国建设服务型政府,应当大力推广运用电子政务等服务手段,使公共服务更加透明、更加高效。

② 如何创建用户定义的服务

在 MS-DOS 命令抄提示符 (运袭行 cmd.EXE),请键入以下命令︰ 路径\INSTSRV。EXE 我的服务 路径\SRVANY。EXE 其中路径是 Windows NT 资源工具包 (即 C:\RESKIT)的驱动器和目录,我的服务是您创建的服务的名称。 示例︰ C:\Program Files\Resource K...

③ 如何创建一个docker service 服务

1. 运行一个Docker实例
Docker首先会尝试从本地取得并运行所需的镜像,如果在本地主机上没有发现,它就会从Docker公共注册中心拉取。这里,我们将会拉取镜像并在 Docker 容器中创建一个Fedora实例,并连接到它的 tty 上的bash shell。
# docker run -i -t fedora bash

2.安装Apache网络服务器
现在,在我们的Fedora基本镜像实例准备好后,我们将会开始交互式地安装Apache网络服务器,而不是为它创建Dockerfile。为了做到这点,我们需要在终端或者shell运行以下命令。
# yum update

# yum install httpd

退出容器的 tty。
# exit

3.保存镜像
现在,我们要去保存在Fedora实例里做的修改。要做到这个,我们首先需要知道实例的容器ID。而为了得到ID,我们又需要运行以下命令(LCTT 译注:在容器外执行该命令)。
# docker ps -a

然后,我们会保存这些改变为一个新的镜像,请运行以下命令。
# docker commit c16378f943fe fedora-httpd

这里,修改已经通过使用容器ID保存起来了,镜像名字叫fedora-httpd。为了确认新的镜像是否在运行,我们将运行以下命令。
# docker images

4. 添加内容到新的镜像
我们自己新的Fedora Apache镜像正成功的运行,现在我们想添加一些我们网站的网页内容到Apache网络服务器,使得网站能够开箱即用。为做到这点,我们需要创建一个新的Dockerfile,它会处理从复制网页内容到启用80端口的所有操作。要达到这样的目的,我们需要使用我们最喜欢的文本编辑器创建Dockerfile文件,像下面演示的一样。
# nano Dockerfile
现在,我们需要添加以下的命令行到文件中。
FROM fedora-httpd
ADD mysite.tar /tmp/
RUN mv /tmp/mysite/* /var/www/html
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/httpd" ]
CMD [ "-D", "FOREGROUND" ]

这里,上述的Dockerfile中,放在mysite.tar里的网页内容会自动解压到/tmp/文件夹里。然后,整个站点会被移动到Apache的网页根目录/var/www/html/,命令expose 80会打开80端口,这样网站就能正常访问了。其次,入口点放在了/usr/sbin/https里面,保证Apache服务器能够执行。

5. 构建并运行一个容器
现在,我们要用刚刚创建的Dockerfile创建我们的容器,以便将我们的网站添加到上面。为做到这,我们需要运行以下命令。
# docker build -rm -t mysite .

建立好我们的新容器后,我们需要要用下面的命令来运行容器。
# docker run -d -P mysite

④ 自己如何搭建服务器。

1、打开控制面板,选择并进入“程序”,双击“打开或关闭Windows服务”,在弹出的窗口中选择“Internet信息服务”下面所有地选项,点击确定后,开始更新服务。

(4)创建服务扩展阅读:

入门级服务器所连的终端比较有限(通常为20台左右),况且在稳定性、可扩展性以及容错冗余性能较差,仅适用于没有大型数据库数据交换、日常工作网络流量不大,无需长期不间断开机的小型企业。

不过要说明的一点就是目前有的比较大型的服务器开发、生产厂商在后面我们要讲的企业级服务器中也划分出几个档次,其中最低档的一个企业级服务器档次就是称之为"入门级企业级服务器",这里所讲的入门级并不是与我们上面所讲的"入门级"具有相同的含义,不过这种划分的还是比较少。

还有一点就是,这种服务器一般采用Intel的专用服务器CPU芯片,是基于Intel架构(俗称"IA结构")的,当然这并不是一种硬性的标准规定,而是由于服务器的应用层次需要和价位的限制。

⑤ 怎么新建电脑系统服务

1、修改注册表 主要有两种方法…… 还有一个好用的命令:sc delete+服务名

在“开始→运行”中键入“regedit.exe”,打开“注册表编辑器”,展开分支“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”,在右侧窗格中显示的就是本机安装的服务项。
如果要新建服务,只须点击“编辑→新建→项”,然后为此项命名,如“test”;然后右击该项,选择“新建→字符串值”或“新建→DWORD值”即可。添加一个服务项目具体需要添加的键值如下:
“DisplayName”,字符串值,对应服务名称;
“Description”,字符串值,对应服务描述;
“ImagePath”,字符串值,对应该服务程序所在的路径;
“ObjectName”,字符串值,值为“LocalSystem”,表示本地登录;
“ErrorControl”,DWORD值,值为“1”;
“Start”,DWORD值,值为2表示自动运行,值为3表示手动运行,值为4表示禁止;
“Type”,DWORD值,应用程序对应10,其它对应20。
另外,还要在“test”项下新建一个“Enum”项。按照以上步骤添加QQ程序为服务,重新启动计算机后,打开“服务”窗口,就可以看到刚才添加的QQ服务。
如果要删除某项服务,只要删除注册表的中相关键值即可,本例中要删除QQ服务,直接删除“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\test”分支即可。

2、使用SC命令 (不错,使用也简单)

先进入命令行 (开始——〉运行——输入CMD),直接输入SC可以查看关于该命令的帮助。

如果要删除一个系统服务,可以使用 SC delete [服务名称],比如删除messager服务,输入SC DELETE MESSAGER。
SC使用这样的语法:
1. SC [Servername] command Servicename [Optionname= Optionvalue]

2. SC [command]

这里使用第一种语法使用SC,使用第二种语法显示帮助。

下面介绍各种参数。

Servername
可选择:可以使用双斜线,如\\myserver,也可以是\\192.168.0.1来操作远程计算机。如果在本地计算机上操作

就不用添加任何参数。

Command
下面列出SC可以使用的命令。

config----改变一个服务的配置。(长久的)

continue--对一个服务送出一个继续控制的要求。

control----对一个服务送出一个控制。

create----创建一个服务。(增加到注册表中)

delete----删除一个服务。(从注册表中删除)

EnumDepend--列举服务的从属关系。

GetDisplayName--获得一个服务的显示名称。

GetKeyName--获得一个服务的服务键名。

interrogate--对一个服务送出一个询问控制要求。

pause----对一个服务送出一个暂停控制要求。

qc----询问一个服务的配置。

query----询问一个服务的状态,也可以列举服务的状态类型。

start----启动一个服务。

stop----对一个服务送出一个停止的要求。

Servicename
在注册表中为service key制定的名称。注意这个名称是不同于显示名称的(这个名称可以用net start和服务控

制面板看到),而SC是使用服务键名来鉴别服务的。

Optionname
这个optionname和optionvalue参数允许你指定操作命令参数的名称和数值。注意,这一点很重要在操作名称和等

号之间是没有空格的。一开始我不知道,结果………………,比如,start= optionvalue,这个很重要。

optionvalue可以是0,1,或者是更多的操作参数名称和数值对。
如果你想要看每个命令的可以用的optionvalue,你可以使用sc command这样的格式。这会为你提供详细的帮助。

Optionvalue
为optionname的参数的名称指定它的数值。有效数值范围常常限制于哪一个参数的optionname。如果要列表请用

sc command来询问每个命令。

Comments
很多的命令需要管理员权限,所以我想说,在你操作这些东西的时候最好是管理员。呵呵!

当你键入SC而不带任何参数时,SC.exe会显示帮助信息和可用的命令。当你键入SC紧跟着命令名称时,你可以得

到一个有关这个命令的详细列表。比如,键入sc create可以得到和create有关的列表。
但是除了一个命令,sc query,这会导出该系统中当前正在运行的所有服务和驱动程序的状态。

当你使用start命令时,你可以传递一些参数(arguments)给服务的主函数,但是不是给服务进程的主函数。

SC create
这个命令可以在注册表和服务控制管理数据库建立一个入口。

语法1
sc [servername] create Servicename [Optionname= Optionvalue]

这里的servername,servicename,optionname,optionvalue和上面的一样,这里就不多说了。这里我们详细说

明一下optionname和optionvalue。

Optionname--Optionvalue
描述

type=----own, share, interact, kernel, filesys
关于建立服务的类型,选项值包括驱动程序使用的类型,默认是share。

start=----boot, system, auto, demand, disabled
关于启动服务的类型,选项值包括驱动程序使用的类型,默认是demand(手动)。

error=----normal, severe, critical, ignore
当服务在导入失败错误的严重性,默认是normal。

binPath=--(string)
服务二进制文件的路径名,这里没有默认值,这个字符串是必须设置的。

group=----(string)
这个服务属于的组,这个组的列表保存在注册表中的ServiceGroupOrder下。默认是nothing。

tag=----(string)
如果这个字符串被设置为yes,sc可以从CreateService call中得到一个tagId。然而,SC并不显示这个标签,所

以使用这个没有多少意义。默认是nothing

depend=----(space separated string)有空格的字符串。
在这个服务启动前必须启动的服务的名称或者是组。

obj=----(string)
账号运行使用的名称,也可以说是登陆身份。默认是localsystem

Displayname=--(string)
一个为在用户界面程序中鉴别各个服务使用的字符串。

password=--(string)
一个密码,如果一个不同于localsystem的账号使用时需要使用这个。

Optionvalue
Optionname参数名称的数值列表。参考optionname。当我们输入一个字符串时,如果输入一个空的引用这意味着

一个空的字符串将被导入。

Comments
The SC CREATE command performs the operations of the CreateService API function.
这个sc create命令执行CreateService API函数的操作。详细请见CreateService。

例1
下面这个例子在一台叫做(\\myserver)的计算机上为一个叫“NewService”的服务建立的一个注册表登记。
sc \\myserver create NewService binpath= c:\winnt\system32\NewServ.exe

按照默认,这个服务会建立一个WIN32_SHARE_PROCESS使用SERVICE_DEMAND_START启动方式。这将不会有任何从属

关系,也将会按照localsystem安全上下关系来运行。

例2
下面这个例子将在本地计算机上,建立一个服务,它将会是一个自动运行服务,并且运行在他自己的进程上。它

从属于TDI组和NetBios服务上。注意,你必须在从属中间增加一个空格的引用。

sc create NewService binpath= c:\winnt\system32\NewServ.exe type= own
start= auto depend= "+TDI Netbios"

例3
服务开发者可以通过临时改变二进制路径(影像路径)的方式来将这个服务运行在内核调试器的上下关系中。下

面这个例子就可以让我们看到如何改变服务的配置。

sc config NewService binpath= "ntsd -d c:\winnt\system32\Newserv.exe"
这个例子会引起服务控制管理器调用ntsd.exe使用下例的参数字符串:
"-d c:\nt\system32\NewServ.exe"

当系统装入newserv.exe时ntsd将会转而打断调试器,所以断点可以被设置在服务代码里。

SC QC
这个SC QC“询问配置”命令可以列出一个服务的配置信息和QUERY_SERVICE_CONFIG结构。

语法1
sc [Servername] qc Servicename [Buffersize]

Parameters
servername和servicename前面已经介绍过了,这里不再多说。

Buffersize,可选择的,列出缓冲区的尺寸。

Comments

SC QC命令显示了QUERY_SERVICE_CONFIG结构的内容。

以下是QUERY_SERVICE_CONFIG相应的区域。
TYPE------dwServiceType
START_TYPE----dwStartType
ERROR_CONTROL----dwErrorControl
BINARY_PATH_NAME--lpBinaryPathName
LOAD_ORDER_GROUP--lpLoadOrderGroup
TAG------dwTagId
DISPLAY_NAME----lpDisplayName
DEPENDENCIES----lpDependencies
SERVICE_START_NAME--lpServiceStartName

例1

下面这个例子询问了在上面例子中建立的“NewService”服务的配置:

sc \\myserver qc NewService

sc显示下面的信息:

SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : c:\winnt\system32\NewServ.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : NewService
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem

NewService有能力和其他的服务共享一个进程。但是它不是自动启动的。二进制文件名是NewServ.exe。这个服务

不依靠与其它的的服务,而且运行在lcoalsystem的安全上下关系中。这些都是调用QueryServiceStatus基本的返

回,如果还需要更多的细节届时,可以看看API函数文件。

SC QUERY

SC QUERY命令可以获得服务的信息。

语法:
sc [Servername] query { Servicename | Optionname= Optionvalue... }

参数:

servername, servicename, optionname, optionvalue不在解释。只谈一下这个命令提供的数值。

Optionname--Optionvalue
Description

type=----driver, service, all
列举服务的类型,默认是service

state=----active, inactive, all
列举服务的状态,默认是active

bufsize=--(numeric value)
列举缓冲区的尺寸,默认是1024 bytes

ri=----(numeric value)
但开始列举时,恢复指针的数字,默认是0

Optionvalue
同上。

Comments

SC QUERY命令可以显示SERVICE_STATUS结构的内容。

下面是SERVICE_STATUS结构相应的信息:
TYPE------dwServiceType
STATE------dwCurrentState, dwControlsAccepted
WIN32_EXIT_CODE----dwWin32ExitCode
SERVICE_EXIT_CODE--dwServiceSpecificExitCode
CHECKPOINT----dwCheckPoint
WAIT_HINT----dwWaitHint

在启动计算机后,使用SC QUERY命令会告诉你是否,或者不是一个启动服务的尝试。如果这个服务成功启动,WIN32_EXIT_CODE区间会将会包含一个0,当尝试不成功时,当它意识到这个服务不能够启动时,这个区间也会提供一个退出码给服务。

例子

查询“NewService"服务状态,键入:

sc query NewService

显示一下信息:

SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

注意,这里存在一个给这个服务的退出码,即使这个服务部不在运行,键入net helpmsg 1077,将会得到对1077错误信息的说明:

上次启动之后,仍未尝试引导服务。

所以,这里我想说一句,希望大家可以活用net helpmsg,这会对你的学习有很大的帮助。

下面在对SC query的命令在说明一下:

列举活动服务和驱动程序状态,使用以下命令:
sc query

显示messenger服务,使用以下命令:
sc query messenger

只列举活动的驱动程序,使用以下命令:
sc query type= driver

列举Win32服务,使用以下命令:
sc query type= service

列举所有的服务和驱动程序,使用以下命令:
sc query state= all

用50 byte的缓冲区来进行列举,使用以下命令:
sc query bufsize= 50

在恢复列举时使用index=14,使用以下命令:
sc query ri=14

列举所有的交互式服务,使用以下命令:
sc query type= service type= interact

⑥ 怎样新建一个Java的Web Service

1.系统条件:
Eclipse Java EE IDE for Web Developers
Java SE 6
Windows XP
2.基本环境搭建:
1)Java SE6 JDK的安装:下载 SE6 JDK,双击,安装默认选项进行安装即可。
2)Eclipse的安装与配置:
安装时直接解压。
配置处有两点,Window>Preferences>Java>Installed JREs确保如下设置:
image
安装路径可能略有不同。
Window>Preferences>Java>Compiler 确保如下设置:
image
3.建立Server端工程和相关包与类:
创建一个Java Project,命名为wsServerHelloWorld:
image
在这个项目下建立包:org.gnuhpc.wsServer
image
在这个包下边建立类:SayHello
image
在SayHello.java文件中输入以下代码:
package org.gnuhpc.wsServer;
import javax.jws.WebService;
@WebService
public class SayHello {
private static final String SALUTATION = "Hello";
public String getGreeting(String name) {
return SALUTATION + " " + name;
}
}
其中注意到@WebService ,这个称作annotation或者metadata,Java SE 5中的Web Services Metadata Specification引入的。Java SE 6中对于Web Services规范的升级以及JAX-WS(Java API for XML Web Services)2.0规范,这些升级使得我们Web Services的创建和调用变得更加容易。使用这些新功能,我们可以仅仅使用简单的Annotations注释从一个Java类创建Web Services。开发者将其类和方法之前用该annotations指定,类告诉runtime engine以Web Service的方式和操作来使能该类和方法。这个annotations可以产生一个可布署的Web Service,是一个WSDL映射annotations,将Java源代码与代表Web Service的WSDL元素连接在了一起。

⑦ 建设服务型党组织的三个服务,五个提升是什么

三个服务是服务中心工作、服务党员队伍、服务职工群众;五个提升是提升服务功能、提升服务能力、提升民主水平、提升工作水平、提升满意程度

汽轮机厂党委在“服务型”党组织建设中,提出了服务中心工作、服务党员队伍、服务职工群众的“三个服务”功能定位。

2009 年,在深入学习实践科学发展观活动中,遵义市委顺应基层党建工作新形势、新任务,以服务基层、服务群众、服务发展为主题;

以构建“五大体系”(上级党组织服务下级党组织,党组织服务党员,党组织和党员服务群众,党组织和党员干部共同服务科学发展,城乡党建一体化)为主要任务;

以实现“五个提升”(提升服务功能、提升服务能力、提升民主水平、提升工作水平、提升满意程度)为主要目标,在全市深入开展服务型党组织创建工作。

(7)创建服务扩展阅读:

坚持以“三服务”引领服务型党组织建设:

一、要找准立足点,遵循“三不”原则。

1、契合不游离,把党组织的日常活动与企业中心工作结合起来,为生产经营和管理助力;

2、参与不干预,主动配合企业行政管理层的工作,参与而不强制企业决策,到位而不越位;

3、渗透不包揽,把基层党组织的政策贯彻到企业的中心工作中去,使企业发展更符合社会主义市场经济方向、更符合国家和地方产业政策要求、更符合企业发展需要。

二、服务中心工作要找准结合点。

党委领导分管或参与经济工作,党政干部轮岗交流与交叉任职。

三、服务中心工作要找准发力点。

围绕产能平衡、降本增效,在党委和党支部层面开展课题调研,为企业中心工作出谋划策;每季度的党建论坛以疏通基层管理瓶颈为目标,开展相关党支部车间现场管理、提升产品质量等议题的“头脑风暴”活动。

⑧ Linux 下如何创建一个服务

Linux系统能提供强大可靠的网络服务,并有管理程序对服务进行管理。例如我们熟悉的Web、FTP和电子邮件等,它们既可以单独运行,也可以被守护进程inetd调用,而且运行得都非常好。但我们不能仅停留在赞叹中,下面就给出两个服务程序程序和一个客户程序的例子,介绍服务程序和客户程序之间是如何沟通的。另外还要编辑配置一些文件,让服务程序也能接受服务管理程序管理。
这两个服务程序功能相同,但一个是独立服务程序,另一个是被inetd调用的服务程序。这是TCP/IP网络服务的两大类,这里将两个程序放在一起是为了比较程序结构和运行方式。两服务程序都在Red Hat Linux 7.1和TurboLinux 7.0上调试通过。
独立服务器
TCP和UDP是两大TCP/IP数据传输方式,套接口是建立服务器客户机连接的机制,首先介绍它们建立通信联系的过程,然后给出一个TCP服务程序例子。
1.TCP套接口通信方式
对于TCP服务器端,服务程序首先调用建立套接口的函数socket(),然后调用绑定服务IP地址和协议端口号函数bind()。绑定成功后调用被动监听函数listen()等待客户连接,还要调用获取连接请求函数accept(),并一直阻塞到客户连接请求的到达,这个函数获取客户机IP地址和协议端口号。
对于TCP客户端,客户程序启动后后调用建立套接口函数socket(),然后调用连接函数connect(),此函数与服务器通过三次握手建立连接。
服务器和客户机建立连接后,就可以使用读函数read()和写函数write()收发数据了。数据交换完成后便各自调用关闭套接口函数close()删除套接口。TCP套接口通信方式见图1所示。
图1 TCP套接口通信方式
2.UDP套接口通信方式
UDP程序与TCP的区别是无需建立连接。服务器首先启动,然后等待用户请求。客户机启动后便直接向服务器请求服务,服务器接到请求后给出应答。
对于UDP服务器端,服务程序首先调用套接口函数socket(),然后调用绑定IP地址和协议端口号函数bind()。之后调用函数recvfrom()接收客户数据,调用sendto()向客户发送数据。
对于UDP客户端,客户机程序启动后调用套接口函数socket(),然后调用sendto()向服务器发送数据,调用recvfrom()接收服务器数据。
双方数据交换成功后,各自调用关闭套接口函数close()关闭套接口。UDP套接口通信方式见图2所示。
图2 UDP套接口通信方式
下面给出独立服务程序的例子。这个程序虽然简单,但是与复杂程序有着相同的结构。
//程序名:server.c
//功能:服务器从客户机读入一个字符,并将排在此字符后面的字符回送客户机
//服务器端口:9000
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int pid; //用于存放fork()执行结果
int server_sockfd,client_sockfd; //用于服务器和客户机套接口描述符
int bind_flag,listen_flag; //用于存放bind()和listen()执行结果
int server_address_length,client_address_length; //作为服务器客户机地址长变量
struct sockaddr_in server_address; //作为服务器地址结构变量(含地址和端口)
struct sockaddr_in client_address; //作为客户机地址结构变量(含地址和端口)
if((pid=fork())!=0) //用fork()产生新进程
exit(0) ;
setsid() ; //以子进程开始下面的程序
函数socket(),创建一个套接口,成功则返回套接口描述符。
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(server_sockfd<0)
{
printf(“socket error /n”);
exit(1);
}
server_address.sin_family=AF_INET;
函数htonl()用于将32位主机字节顺序转换为网络字节顺序,其中参数INADDR_ANY表示任何IP地址。
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
函数htons()用于将16位主机字节顺序转换为网络字节顺序,其中的参数是绑定的端口号,读者可根据环境自行改动,目的是不与其它服务端口冲突。
server_address.sin_port=htons(9000);
server_address_length=sizeof(server_address);
函数bind()用于绑定本地地址和服务端口号,若调用成功返回值为0。
bind_flag=bind(server_sockfd,/
(struct sockaddr *)&server_address,/
server_address_length);
if(bind_flag<0)
{
printf(“bind error /n”);
exit(1);
}
函数listen(),指明服务器的队列长度,被动等待客户连接,调用成功返回值为0。
listen_flag=listen(server_sockfd,5);
if(listen_flag<0)
{
printf(“listen error /n”);
exit(1);
}
while(1)
{
char ch;
函数accept()等待和获取用户请求,为每个新连接请求创建一个新的套接口,调用成功返回新套接口描述符。
client_sockfd=accept(server_sockfd,/
(struct sockaddr *)&client_address,/
&client_address_length);
函数read()和write()用于在服务器和客户机之间传送数据,调用成功返回读和写的字节数。
函数close(),用于程序使用完一个套接口后关闭套接口,调用成功返回值0。其中的参数为accept()创建的套接口的描述符client_sockfd。
read(client_sockfd,&ch,1);
printf(“cli_ch=%c”,ch);
ch++;
write(client_sockfd,&ch,1);
close(client_sockfd);
}
}
程序完成后就可以使用命令进行编译。在命令行中输入“gcc -o server server.c”,将server.c编译成可执行程序server,这时便可用客户程序进行测试。在命令行执行“./server”启动服务程序,执行“netstat -na”查看有无server的服务端口。如果存在,则执行下面编写的客户程序“./client”。不过这仅是手工启动的方法,下面给出用服务管理程序管理server程序的方法。只要在目录/etc/rc.d/init.d下放入服务程序的脚本就能被服务程序读到。在命令行执行“touch server”创建文件server,并将文件属性改成可执行。在管理程序中并不能看到此服务名,脚本文件必须有一些结构才能被管理程序认为是服务程序脚本。
为了减少工作量,拷贝/etc/rc.d/init.d下脚本httpd,将拷贝脚本名命名为server,然后对其编辑。
(1)执行“cp httpd server”。
(2)用文本编辑器vi(其它编辑器亦可)将server打开进入编辑状态。首先用字符串server替换httpd。然后找到daemon server行,如果编写的程序放在变量PATH目录中,不需要修改此行;如果把服务程序放在其它目录中,就要写服务的全路径。例如程序在/root的目录中,就要写成daemon /root/server,还要删除“rm -f /var/run/server.pid”这一行。
(3)执行“chmod 755 server”,将server属性设定为可执行。
此时就可以用chkconfig、ntsysv等工具,在希望的运行级中增加这个新服务程序,然后测试客户机与服务器能否通信。
被xinetd调用的服务程序
在Linux系统中,有很多服务是被xinetd(较早版本使用的是inetd)超级守护服务器启动的。其实凡是基于TCP和UDP的服务都可使用超级守护进程启动,只是在服务量很大影响效率的情况下不被采用。
1.依赖xinetd启动的服务建立通信过程
为了与独立服务器程序比较,我们看一下依赖xinetd的服务器是如何启动的。
(1)xinetd启动时读取/etc/xinetd目录中的文件(早期版本为/etc/inetd文件),根据其中的内容给所有允许启动的服务创建一个指定类型的套接口,并将套接口放入select()中的描述符集合中。
(2)对每个套接口绑定bind(),所用的端口号和其它参数来自/etc/xinetd目录下每个服务的配置文件。
(3)如果是TCP套接口就调用函数listen(),等待用户连接。如果是UDP套接口,就不需调用此函数。
(4)所有套接口建立后,调用函数select()检查哪些套接口是活动的。
(5)若select()返回TCP套接口,就调用accept()接收这个连接。如果为UDP,就不需调用此函数。
(6)xinetd调用fork()创建子进程,由子进程处理连接请求。
◆ 子进程关闭所有其它描述符,只剩下套接口描述符。这个套接口描述符对于TCP是accept()返回的套接口,对于UDP为最初建立的套接口。然后子进程连续三次p()函数,将套接口描述符复制到0、1和2,它们分别对应标准输入、标准输出和标准错误输出,并关闭套接口描述符。
◆ 子进程查看/etc/xinetd下文件中的用户,如果不是root用户,就用调用命令setuid和setgid将用户ID和组ID改成文件中指定的用户。
(7)对于TCP套接口,与用户交流结束后父进程需要关闭已连接套接口。父进程重新处于select()状态,等待下一个可读的套接口。
最后调用配置文件中指定的外部服务程序,外部程序启动后就可与用户进行信息传递了。
2.为xinetd编写专门的服务程序
除了独立服务程序能被xinetd启动外,还可以为xinetd编写专门的程序。此处的例子程序与上面server.c功能相同。不过两者的程序区别是很大的,此例的代码仅相当于上面传输数据的部分。我们还将程序名定为server.c,所以不能放在相同目录中,同名仅是为了和上面程序对照。
#include "unistd.h"
int main()
{
char ch;
read(0,&ch,1);
ch++;
write(1,&ch,1);
}
将程序编译成可执行文件,并做些设置就可被xinetd启动。注意不要和上面的独立服务程序server一起启动,因为客户程序写得比较简单,访问的是固定端口,服务器都设成了相同的端口号。
(1)编辑/etc/services文件,在行末增加一条记录:
server 9000/tcp
(2)在目录/etc/xinetd.d下编写文件server,内容为:
service server
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /home/test/server (此处设置成自己程序所在的目录)
}
如果使用的是较早版本,则需在/etc/inetd.conf文件中添加下面的行:
server tcp nowait root /path/to/yourdirectory/server
(3)执行/etc/rc.d/initd.d/xinetd restart重新启动xinetd服务器。早期版本执行/etc/rc.d/initd.d/inetd restart重新启动inetd。
(4)执行netstat -an查看有没有server程序使用的端口号,如果有就可使用下面客户机程序进行测试了。
客户机程序
下面就客户机函数做一简单介绍。
//程序名client.c
/*功能:从客户的控制台输入一个字符,然后将这个字符送到服务器,并将服务器返回的字符显示出来*/
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int sockfd;//
int address_len;
int connect_flag;
struct sockaddr_in address;
int connect_result;
char client_ch,server_ch;
函数socket()用于建立一个套接口,创建成功返回套接口描述符。
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf(“sockfd error /n”);
}
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(“192.168.0.1”);/*读者根据自己环境改成服务器地址*/
address.sin_port=htons(9000);
address_len=sizeof(address);
函数connect()用于与服务器建立一个主动连接,调用成功返回值为0。
connect_flag=connect(sockfd,(struct sockaddr *)&address,address_len);
if(connect_flag==-1)
{
perror(“client”);
exit(1);
}
printf(“Input a character :”);
函数scanf()用于从控制台输入一个字符,并将字符存入client_ch的地址。函数write()和read()用于传输数据。函数printf()在客户机屏幕上显示服务器传回的字符。函数close()关闭套接口。
scanf(“%c”,&client_ch);
write(sockfd,&client_ch,1);
read(sockfd,&server_ch,1);
printf(“character from server : %c/n”,server_ch);
close(sockfd);
exit(0);
}
执行命令“gcc -o client client.c”,将client.c编译成client。执行“./client”,在程序提示下输入一个字符,就能看到服务器传回的字符。
以上介绍的仅是简单的例子。平时见到的服务程序远比它复杂,而且很多是多协议服务程序或是多协议多服务程序。多协议服务程序就是在main()中分别创建供服务的TCP和UDP套接口。为每个服务分别写出相应程序好处是便于控制,但是这样每个服务都启动两个服务器,而它们的算法响应是一样的,就要耗费不必要的资源,并且出了问题排错也较困难。多服务是将不同的服务集成在一起由一个程序完成,可用一个数组表示服务,数组中的每一项表示某协议某服务的一种,这样很容易扩展程序的服务功能。

⑨ 如何给Android应用创建本地服务

本文通过代码向大家详细介绍和演示这两种的服务的创建过程,代码适用于Android2.3.3以后的版本。


1. 定义清单文件(AndroidManifest.xml)

4. 创建服务启动界面(LocalServiceActivities.java)

package my.android.test;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;

/**

* 该类中包含两种类型服务的客户端:

* 启动类型服务客户端:Controller

* 绑定类型服务客户端:Binding

*/

publicclass LocalServiceActivities {

/**

* Controller类是启动类型服务的客户端,它包含两个按钮:

* start:点击该按钮时,启动服务。

* stop: 点击该按钮时,终止服务。

*/

publicstaticclass Controller extends Activity{

/**

* Activity被首次启动时,调用该方法。

*/

@Override

protectedvoid onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

//填充布局

setContentView(R.layout.local_service_controller);

//查找布局中的启动服务按钮,并设置点击事件监听器。

Button button = (Button)findViewById(R.id.start);

button.setOnClickListener(mStartListener);

//查找布局中的终止服务按钮,并设置点击事件监听器。

button = (Button)findViewById(R.id.stop);

button.setOnClickListener(mStopListener);

}

/**

* start按钮的点击事件监听器实现。

*/

private OnClickListener mStartListener = new OnClickListener(){

publicvoid onClick(View v){

//启动LocalService服务。

startService(new Intent(Controller.this, LocalService.class));

}

};

/**

* stop按钮的点击事件监听器实现。

*/

private OnClickListener mStopListener = new OnClickListener(){

publicvoid onClick(View v){

//终止LocalService服务。

stopService(new Intent(Controller.this, LocalService.class));

}

};

}

/***************************************************************

*以下是绑定型服务客户端的实现

***************************************************************/

/**

* Binding类是绑定类型服务的客户端,它包含两个按钮:

* bind:点击该按钮时,调用bindService()方法绑定并启动服务;

* unbind:点击该按钮时,调用unbindService()方法解除绑定并终止服务。

*/

publicstaticclass Binding extends Activity{

//用于保存服务的绑定状态,true:绑定,false:未绑定

privatebooleanmIsBound;

//用于保存被绑定的本地服务实例。

private LocalService mBoundService;

/**

* 实现监视被绑定服务状态的接口:ServiceConnection

* 绑定类型服务都要实现这个接口,以便监视服务的状态,这个接口中的方法会在

* 应用的主线程中被调用。

*/

private ServiceConnection mConnection = new ServiceConnection(){

/**

* 当连接的服务被创建时,Android系统会调用这个方法,用IBinder对象跟服务建立通信通道。

* @param className:被连接的具体的服务组件的名称

* @param service:服务的通信通道IBinder对象。

*/

publicvoid onServiceConnected(ComponentName className, IBinder service){

//从IBinder对象中获取服务实例。

mBoundService = ((LocalService.LocalBinder)service).getService();

//显示Activity已经与服务建立了连接的提示消息。

Toast.makeText(Binding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show();

}

/**

* 当服务被终止时,Android系统会调用这个方法。

*/

publicvoid onServiceDisconnected(ComponentName className){

//清除客户端服务实例

mBoundService = null;

//显示服务被终止的提示消息。

Toast.makeText(Binding.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show();

}

};

/**

* 绑定并启动服务,bind按钮点击时会调用这个方法。

*/

void doBindService(){

//绑定并启动服务。

bindService(new Intent(Binding.this, LocalService.class), mConnection, Context.BIND_AUTO_CREATE);

mIsBound = true;

}

/**

* 解除与服务的绑定,unbind按钮被点击时会调用这个方法

*/

void doUnbindService(){

//如果服务被绑定,则解除与服务绑定。

if(mIsBound){

unbindService(mConnection);

mIsBound = false;

}

}

/**

* 当Activity被销毁时,调用解除绑定服务的方法,解除被绑定的服务。

*/

@Override

protectedvoid onDestroy(){

super.onDestroy();

//解除被绑定的服务。

doUnbindService();

}

/**

* bind按钮的点击事件监听器接口实现。

*/

private OnClickListener mBindListener = new OnClickListener(){

publicvoid onClick(View v){

//绑定并启动服务。

doBindService();

}

};

/**

* unbind按钮的点击事件监听器接口实现。

*/

private OnClickListener mUnbindListener = new OnClickListener(){

publicvoid onClick(View v){

//解除被绑定的服务。

doUnbindService();

}

};

/**

* Activity被首次启动时,会调用这个方法。

*/

@Override

protectedvoid onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

//填充Activity

setContentView(R.layout.local_service_binding);

//查找布局中的bind按钮,并设置点击事件的监听器

Button button = (Button)findViewById(R.id.bind);

button.setOnClickListener(mBindListener);

//查找布局中的unbind按钮,并设置点击事件的监听器

button = (Button)findViewById(R.id.unbind);

button.setOnClickListener(mUnbindListener);

}

}

}

5. 创建服务(LocalService.java)

package my.android.test;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.HandlerThread;

import android.os.IBinder;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.os.Process;

import android.util.Log;

import android.widget.Toast;

/**

* LocalService基础Android的Service类,实现应用的本地服务组件。

* 该服务使用HandlerThread类创建了服务自己的线程和消息循环,

* 因此,不会因为服务中的长时处理,而阻塞界面的刷新,影响用户体验。

*/

publicclass LocalService extends Service {

//用于保存本服务自己的消息循环对象Looper

private Looper mServiceLooper;

//用于保存内部类ServiceHandler的对象实例,它继承了Android的Handler类,

//用于处理发送给服务的消息。

private ServiceHandler mServiceHandler;

/**

* 这个类用于给客户端提供绑定对象,因为本示例的服务与客户端运行在同一个

* 主进程中,所以不需要处理进程间通信(IPC)

*/

publicclass LocalBinder extends Binder{

LocalService getService(){

//返回本服务的实例。

return LocalService.this;

}

}

/**

* 服务被首次创建时,系统调用这个方法。

* Android服务组件必须覆写这个方法

*/

@Override

publicvoid onCreate(){

//创建线程对象,并启动线程。

HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);

thread.start();

//获取线程的消息循环对象

mServiceLooper = thread.getLooper();

//用线程的消息循环对象创建消息处理对象。

mServiceHandler = new ServiceHandler(mServiceLooper);

}

/**

* 启动类型服务必须实现这个方法,客户端每次调用startService()方法时,

* 系统都会调用这个方法。

* @param intent:它是传递给startService()方法的Intent对象。

* @param flags:有关启动请求的附加数据,可以是:0、START_FLAG_REDELIVERY或START_FLAG_RETRY.

* @param startId:一个唯一的整数,代表一次具体的请求,用于stopSelfResult(int)方法。

*/

@Override

publicint onStartCommand(Intent intent, int flags, int startId){

Log.i("LocalService", "Received star id" + startId + ":" + intent);

//显示服务启动的提示信息

Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();

//获取要传递给服务消息循环的Message对象。

Message msg = mServiceHandler.obtainMessage();

//初始化Message对象的成员变量。

msg.arg1 = startId;

msg.obj = "Message processing......" + startId;

//把消息发送给服务线程的消息循环。

mServiceHandler.sendMessage(msg);

returnSTART_STICKY;

}

/**

* 必须覆写这个方法,服务被终止时要调用这个方法,清理服务所占用的资源。

*/

@Override

publicvoid onDestroy(){

//退出服务线程的消息循环。

mServiceLooper.quit();

//显示服务被退出的提示信息。

Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();

}

/**

* 绑定型服务必须覆写这个方法,启动型服务也可覆写这个方法,只要返回null即可。

*/

@Override

public IBinder onBind(Intent intent){

//返回本服务对象实例。

returnmBinder;

}

privatefinal IBinder mBinder = new LocalBinder();

/**

* 该类继承Android的Handler类,为线程的消息循环提供发送和处理消息的功能,

* 本示例覆写了handleMessage()方法,用来处理发送给服务消息循环的消息。

*/

privatefinalclass ServiceHandler extends Handler{

//类实例化时,需要传入服务线程的消息循环对象

public ServiceHandler(Looper looper){

super(looper);

}

/**

* 覆写Handler类的handleMessage()方法,当服务线程的消息循环接收到外部

* 发送的消息时,会调用这个方法来处理对应的消息,本示例只是简单的向用户提示消息被处理的信息。

*/

@Override

publicvoid handleMessage(Message msg){

long endTime = System.currentTimeMillis() + 5 * 1000;

while (System.currentTimeMillis() < endTime){

synchronized(this){

try{

wait(endTime - System.currentTimeMillis());

CharSequence cs = msg.obj.toString();

Toast.makeText(LocalService.this, cs, Toast.LENGTH_SHORT).show();

//showNotification();

}catch(Exception e){

//

}

}

}

//消息被处理之后,终止本服务。

LocalService.this.stopSelf();

}

}

}

热点内容
影视转载限制分钟 发布:2024-08-19 09:13:14 浏览:319
韩国电影伤口上纹身找心里辅导 发布:2024-08-19 09:07:27 浏览:156
韩国电影集合3小时 发布:2024-08-19 08:36:11 浏览:783
有母乳场景的电影 发布:2024-08-19 08:32:55 浏览:451
我准备再看一场电影英语 发布:2024-08-19 08:14:08 浏览:996
奥迪a8电影叫什么三个女救人 发布:2024-08-19 07:56:14 浏览:513
邱淑芬风月片全部 发布:2024-08-19 07:53:22 浏览:341
善良妈妈的朋友李采潭 发布:2024-08-19 07:33:09 浏览:760
哪里还可以看查理九世 发布:2024-08-19 07:29:07 浏览:143
看电影需要多少帧数 发布:2024-08-19 07:23:14 浏览:121