當前位置:首頁 » 城管服務 » 創建服務

創建服務

發布時間: 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