用什么方法是java应用程序作为一个后台服务运行?NT & unix

虎叔 2000-12-23 12:24:00
就好像数据库那样!
...全文
459 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dmkr 2001-03-08
  • 打赏
  • 举报
回复
robber(海盗),请问你的问题解决了吗?我现在也遇到了同样的问题,
需要用java编写一个NT平台下的标准服务,能告诉我有关的情况吗?谢了!
borz 2001-01-04
  • 打赏
  • 举报
回复
你究竟想做什么?
用java写一个服务器吗?
用javaw可以启动VM,但看不到窗口,也就是可以做到"后台"的效果
Sailor_lee 2001-01-03
  • 打赏
  • 举报
回复
我的方法是利用单子范式来实现Service。
虎叔 2001-01-03
  • 打赏
  • 举报
回复
Sailor_lee:
单子范式可以吗?
请问你是怎么解决的?
The_east_key 2000-12-29
  • 打赏
  • 举报
回复
建议您访问www.etechbase.net/tech,里面有很多资料,也许可以解决您的问题。
访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,选择不同的精确程度,即可以找到你所需要的答案。效果还是可以的。
simoncn 2000-12-27
  • 打赏
  • 举报
回复
Java 中你可以设置 Thread 为 Daemon 类型,这样它会驻留在内存中。这样它就会继续执行,如果你要让其它应用直接调用它的服务:
1. 分布式运算方式:
a.CORBA
b.EJB
c.RMI
2. 基于信息方式:
a.JMS
b.Message Queue
关键是看你要让这种后台服务作哪些操作...
虎叔 2000-12-27
  • 打赏
  • 举报
回复
taolei:
谢谢你贴的程序。


to Jackzhu:
请介绍一下ORB好吗?


Jackzhu 2000-12-26
  • 打赏
  • 举报
回复
利用Java版的ORB发布你的程序,与j2ee的配置服务效果相同
taolei 2000-12-26
  • 打赏
  • 举报
回复
StdAfx.h
#if !defined(AFX_STDAFX_H__7CCCEEAD_83A0_11D4_B105_000021E19FBF__INCLUDED_)
#define AFX_STDAFX_H__7CCCEEAD_83A0_11D4_B105_000021E19FBF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsvc.h>

#endif
//----------------------------------------------------------------


service.h

// Service.h: interface for the CService class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SERVICE_H__7CCCEEB1_83A0_11D4_B105_000021E19FBF__INCLUDED_)
#define AFX_SERVICE_H__7CCCEEB1_83A0_11D4_B105_000021E19FBF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

typedef struct T_SERVICE
{
char ServiceName[128];
char DisplayName[128];
char ExecutePath[_MAX_PATH];
}T_SERVICE;

BOOL LoadServiceSetting(const char* ServiceName,T_SERVICE* pService);
BOOL SaveServiceSetting(T_SERVICE* pService);
void DeleteServiceSetting(const char* ServiceName);

int outputerr(DWORD nErr=0);
inline BOOL outputerr(long nErr)
{
outputerr((DWORD)nErr);
return FALSE;
}
#ifdef _DEBUGLOG
#define WRITELOG writelog
void writelog(const char* fmt,...);
#else
#define WRITELOG
#endif
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);

#endif // !defined(AFX_SERVICE_H__7CCCEEB1_83A0_11D4_B105_000021E19FBF__INCLUDED_)
//----------------------------------------------------------------


StdAfx.cpp
#include "stdafx.h"
//----------------------------------------------------------------

Service.cpp
// Service.cpp: implementation of the CService class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Service.h"

const char REG_PATH[] = "Software\\Free\\ServiceAny";
const char REG_DISPLAYNAME[] = "DisplayName";
const char REG_SERVICENAME[] = "ServiceName";
const char REG_EXECUTEPATH[] = "ExecutePath";

void DeleteServiceSetting(const char* ServiceName)
{
char temp[1024];
sprintf(temp,"%s\\%s",REG_PATH,ServiceName);
::RegDeleteKey(HKEY_LOCAL_MACHINE,temp);
}
BOOL LoadServiceSetting(const char* ServiceName,T_SERVICE* pService)
{
char temp[1024];
sprintf(temp,"%s\\%s",REG_PATH,ServiceName);
HKEY hKey=NULL;
long r = ::RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
temp,NULL,KEY_READ,&hKey);
if (r != 0)
return outputerr(r);
DWORD Type=0;
DWORD cbtemp = sizeof(temp);
r = ::RegQueryValueEx(hKey,REG_SERVICENAME,NULL,&Type,(LPBYTE)temp,&cbtemp);
if (r != 0 || Type != REG_SZ)
{
::RegCloseKey(hKey);
return outputerr(r);
}
strcpy(pService->ServiceName,temp);
cbtemp = sizeof(temp);
r = ::RegQueryValueEx(hKey,REG_DISPLAYNAME,NULL,&Type,(LPBYTE)temp,&cbtemp);
if (r == 0 && Type == REG_SZ)
strcpy(pService->DisplayName,temp);
else
strcpy(pService->DisplayName,pService->ServiceName);
cbtemp = sizeof(temp);
r = ::RegQueryValueEx(hKey,REG_EXECUTEPATH,NULL,&Type,(LPBYTE)temp,&cbtemp);
if (r != 0 || Type != REG_SZ)
{
::RegCloseKey(hKey);
return outputerr(r);
}
strcpy(pService->ExecutePath,temp);
::RegCloseKey(hKey);
return TRUE;
}
static LONG SetRegValue(HKEY hKey,const char* Name,const char* Value)
{
return ::RegSetValueEx(hKey,Name,NULL,REG_SZ,(CONST BYTE*)Value,strlen(Value)+1);
}
BOOL SaveServiceSetting(T_SERVICE* pService)
{
char temp[1024];
sprintf(temp,"%s\\%s",REG_PATH,pService->ServiceName);
HKEY hKey=NULL;
DWORD cbtemp=0;
long r = ::RegCreateKeyEx(
HKEY_LOCAL_MACHINE,temp,NULL,
"",NULL,KEY_WRITE,NULL,&hKey,&cbtemp);
if (r != 0)
return outputerr(r);
if (strlen(pService->DisplayName)==0)
{
strcpy(pService->DisplayName,pService->ServiceName);
}
r = SetRegValue(hKey,REG_SERVICENAME,pService->ServiceName);
if (r != 0)
{
::RegCloseKey(hKey);
return outputerr(r);
}
r = SetRegValue(hKey,REG_DISPLAYNAME,pService->DisplayName);
if (r != 0)
{
::RegCloseKey(hKey);
return outputerr(r);
}
r = SetRegValue(hKey,REG_EXECUTEPATH,pService->ExecutePath);
if (r != 0)
{
::RegCloseKey(hKey);
return outputerr(r);
}
::RegCloseKey(hKey);
return TRUE;
}
#ifdef _DEBUGLOG
void writelog(const char* fmt,...)
{
char msg[2048];
va_list arg;
va_start(arg, fmt);
vsprintf(msg, fmt, arg);
va_end(arg);
FILE* f = fopen("f:\\SrvAny.log","at");
fprintf(f,"%s",msg);
fclose(f);
}
#endif

static char ServiceName[128];
BOOL bLogError = FALSE;
void LogEvent(const char* fmt,...)
{
char msg[2048];
HANDLE hEventSource;
LPTSTR lpszStrings[1];
va_list arg;
va_start(arg, fmt);
vsprintf(msg, fmt, arg);
va_end(arg);
lpszStrings[0] = msg;

hEventSource = RegisterEventSource(NULL, ServiceName);
if (hEventSource != NULL)
{
/* Write to event log. */
ReportEvent(hEventSource,
bLogError?EVENTLOG_ERROR_TYPE:EVENTLOG_INFORMATION_TYPE,
0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
DeregisterEventSource(hEventSource);
}
printf("%s",msg);
}

static SERVICE_STATUS_HANDLE hServiceStatus=NULL;
static SERVICE_STATUS ServiceStatus;
static T_SERVICE Service;
static HANDLE hShutdownEvent=NULL;
static HANDLE hThread=NULL;
DWORD MainThreadId=0;
void SetServiceStatus(DWORD status)
{
ServiceStatus.dwCurrentState = status;
::SetServiceStatus(hServiceStatus,&ServiceStatus);
}
void LogError(DWORD nErr=0)
{
if (nErr==0)
nErr = ::GetLastError();
char temp[1024];
DWORD dwLen = ::FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,
nErr,NULL,temp,sizeof(temp),NULL);
if (dwLen > 0)
temp[dwLen] = NULL;
else
temp[0] = NULL;
bLogError = TRUE;
LogEvent("Win32 Error(%d) %s\n",nErr,temp);
ServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
ServiceStatus.dwServiceSpecificExitCode = nErr;
}

static void WINAPI ServiceHandler(DWORD dwOpcode)
{
switch (dwOpcode)
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
SetServiceStatus(SERVICE_STOP_PENDING);
PostThreadMessage(MainThreadId, WM_QUIT, 0, 0);
break;
case SERVICE_CONTROL_PAUSE:
case SERVICE_CONTROL_CONTINUE:
case SERVICE_CONTROL_INTERROGATE:
default:
break;
}
}
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
char CommandLine[2048];
strcpy(CommandLine,Service.ExecutePath);
if (lpParameter != NULL && strlen((const char*)lpParameter)>0)
{
strcat(CommandLine," ");
strcat(CommandLine,(const char*)lpParameter);
}
char exedir[_MAX_PATH];
strcpy(exedir,Service.ExecutePath);
int n = strlen(exedir);
for(int i=n-1;i>=0;i--)
{
char c = exedir[i];
exedir[i] = NULL;
if (c == '\\')
break;
}
if (!::CreateProcess(
Service.ExecutePath,CommandLine,
NULL,NULL,TRUE,
NULL,NULL,exedir,&si,&pi))
{
LogError();
LogEvent("can't CreateProcess %s\n",CommandLine);
::PostThreadMessage(MainThreadId, WM_QUIT, 0, 0);
return (DWORD)-1;
}
SetServiceStatus(SERVICE_RUNNING);
HANDLE events[2];
events[0] = pi.hProcess;
events[1] = hShutdownEvent;
DWORD r = ::WaitForMultipleObjects(2,events,FALSE,INFINITE);
if (r != WAIT_OBJECT_0)
{
::PostThreadMessage(pi.dwThreadId,WM_QUIT,0,0);
DWORD r1 = ::WaitForSingleObject(pi.hProcess,10000);
if (r1 == WAIT_TIMEOUT)
{
LogEvent("Can't stop %s normally.\n",Service.ExecutePath);
::TerminateProcess(pi.hProcess,-1);
}
}
if (r != WAIT_OBJECT_0 + 1)
{
::PostThreadMessage(MainThreadId, WM_QUIT, 0, 0);
}
DWORD ec=-1;
::GetExitCodeProcess(pi.hProcess,&ec);
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
return ec;
}
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
WRITELOG("in ServiceMain,argc=%d\n",dwArgc);
for(DWORD ii=0;ii<dwArgc;ii++)
{
WRITELOG("argv[%d] = %s\n",ii,lpszArgv[ii]);
}
WRITELOG("\n");

strcpy(ServiceName, lpszArgv[0]);
char param[2048];
param[0] = NULL;
for (DWORD i=1;i<dwArgc;i++)
{
if (i > 1)
strcat(param," ");
if (strchr(lpszArgv[i],' ') == NULL)
strcat(param,lpszArgv[i]);
else
{
strcat(param,"\"");
strcat(param,lpszArgv[i]);
strcat(param,"\"");
}
}
MainThreadId = ::GetCurrentThreadId();
ZeroMemory(&ServiceStatus,sizeof(ServiceStatus));
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
hServiceStatus = RegisterServiceCtrlHandler(ServiceName, ServiceHandler);
SetServiceStatus(SERVICE_START_PENDING);

if (!LoadServiceSetting(ServiceName,&Service))
LogEvent("Can't find Service Setting for '%s'\n",ServiceName);
else
{
hShutdownEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD ThreadId=0;
hThread = ::CreateThread(NULL,NULL,ThreadProc,param,NULL,&ThreadId);
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
SetEvent(hShutdownEvent);
WaitForSingleObject(hThread,INFINITE);
::CloseHandle(hThread);
::CloseHandle(hShutdownEvent);
}
SetServiceStatus(SERVICE_STOPPED);
}
//----------------------------------------------------------------


SrvAny.cpp
// SrvAny.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <crtdbg.h>
#include "Service.h"

int RegisterService(const char* ServiceName,const char* DisplayName,const char* ExecutePath);
int UnregisterService(const char* ServiceName);
int outputerr(DWORD nErr)
{
if (nErr==0)
nErr = ::GetLastError();
_ASSERT(nErr != 0);
char temp[1024];
DWORD dwLen = ::FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,
nErr,NULL,temp,sizeof(temp),NULL);
printf("Win32 Error(%d)",nErr);
if (dwLen > 0)
printf("\t%s",temp);
printf("\n");
return -1;
}

int usage()
{
printf("SrvAny usage\n");
printf("\t/s ServiceName [DisplayName] ExecutePath\tRegister Service\n");
printf("\t/u ServiceName \tUnregister Service\n");
printf("\n");
return -1;
}
int main(int argc, char* argv[])
{
WRITELOG("in main,argc=%d\n",argc);
for(int i=0;i<argc;i++)
{
WRITELOG("argv[%d] = %s\n",i,argv[i]);
}
WRITELOG("\n");
if (argc == 1)
{
SERVICE_TABLE_ENTRY st[] =
{
{ "", ServiceMain },
{ NULL, NULL }
};

if (!::StartServiceCtrlDispatcher(st))
return usage();
else
return 0;
}
if (strcmp(argv[1],"/?")==0)
return usage();
if (strcmp(argv[1],"/s")==0)
{
if (argc == 4)
return RegisterService(argv[2],argv[2],argv[3]);
if (argc == 5)
return RegisterService(argv[2],argv[3],argv[4]);
return usage();
}
if (strcmp(argv[1],"/u")==0)
{
if (argc != 3)
return usage();
else
return UnregisterService(argv[2]);
}
return usage();
}
int RegisterService(const char* ServiceName,const char* DisplayName,const char* ExecutePath)
{
T_SERVICE Service;
ZeroMemory(&Service,sizeof(T_SERVICE));
strcpy(Service.ServiceName,ServiceName);
strcpy(Service.DisplayName,DisplayName);
strcpy(Service.ExecutePath,ExecutePath);
if (!SaveServiceSetting(&Service))
return -1;

SC_HANDLE hSCM = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
return outputerr();
SC_HANDLE hService = ::OpenService(hSCM, ServiceName, SERVICE_QUERY_CONFIG);
if (hService != NULL)
{
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
printf("Service Already Registered\n");
return -1;
}
char szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, _MAX_PATH);
char temp[_MAX_PATH+2];
if (strchr(szFilePath,' ') != NULL)
{
strcpy(temp,"\"");
strcat(temp,szFilePath);
strcat(temp,"\"");
}
else
strcpy(temp,szFilePath);
hService = ::CreateService(
hSCM, ServiceName, DisplayName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,//|SERVICE_INTERACTIVE_PROCESS ,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
temp, NULL, NULL, "RPCSS\0", NULL, NULL);
int r = 0;
if (hService==NULL)
r=outputerr();
else
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
return r;
}

int UnregisterService(const char* ServiceName)
{
T_SERVICE Service;
if (!LoadServiceSetting(ServiceName,&Service))
{
printf("Service('%s') not exists or not a ServiceAny Service\n",ServiceName);
return -1;
}
SC_HANDLE hSCM = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
return outputerr();
SC_HANDLE hService = ::OpenService(hSCM, ServiceName, SERVICE_STOP | DELETE);
int r = 0;
if (hService != NULL)
{
SERVICE_STATUS status;
::ControlService(hService, SERVICE_CONTROL_STOP, &status);

BOOL bOK = ::DeleteService(hService);
if (!bOK)
r = outputerr();
else
DeleteServiceSetting(ServiceName);
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hSCM);
return r;
}
//----------------------------------------------------------------


SrvAny.dsp
# Microsoft Developer Studio Project File - Name="SrvAny" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **

# TARGTYPE "Win32 (x86) Console Application" 0x0103

CFG=SrvAny - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "SrvAny.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "SrvAny.mak" CFG="SrvAny - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "SrvAny - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "SrvAny - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE

# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe

!IF "$(CFG)" == "SrvAny - Win32 Release"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
# ADD BASE RSC /l 0x804 /d "NDEBUG"
# ADD RSC /l 0x804 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386

!ELSEIF "$(CFG)" == "SrvAny - Win32 Debug"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /Yu"stdafx.h" /FD /GZ /c
# ADD BASE RSC /l 0x804 /d "_DEBUG"
# ADD RSC /l 0x804 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept

!ENDIF

# Begin Target

# Name "SrvAny - Win32 Release"
# Name "SrvAny - Win32 Debug"
# Begin Group "Source Files"

# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File

SOURCE=.\Service.cpp
# End Source File
# Begin Source File

SOURCE=.\SrvAny.cpp
# End Source File
# Begin Source File

SOURCE=.\StdAfx.cpp
# ADD CPP /Yc"stdafx.h"
# End Source File
# End Group
# Begin Group "Header Files"

# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File

SOURCE=.\Service.h
# End Source File
# Begin Source File

SOURCE=.\StdAfx.h
# End Source File
# End Group
# Begin Group "Resource Files"

# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# Begin Source File

SOURCE=.\ReadMe.txt
# End Source File
# End Target
# End Project

//----------------------------------------------------------------

taolei 2000-12-26
  • 打赏
  • 举报
回复
我有一个Service Any的程序,可以把任意应用程序做成NT Service。源程序给你,你可以自己看看,也可以修改。
brightli 2000-12-25
  • 打赏
  • 举报
回复
UNIX上作为后台进程运行就可以了。
虎叔 2000-12-25
  • 打赏
  • 举报
回复
NT Service如何写?
taolei 2000-12-25
  • 打赏
  • 举报
回复
自己写个NT Service程序,通过JNI启动你的Java程序。
masterz 2000-12-25
  • 打赏
  • 举报
回复
How about run it and hide the window.
zhq2000 2000-12-24
  • 打赏
  • 举报
回复
在Windows中,无法直接用Java产生Service程序(也有可能是我孤陋寡闻);但是可能通过编写DCOM 或 MTS COM 或 COM+(Window2000) 组件 或 Corba 来模拟Service程序,可以实现透明远程过程调用;

在Unix上我只知道Corba,Unix我不熟,能不能直接用JAVA产生后台服务程序我就不知道了。
虎叔 2000-12-23
  • 打赏
  • 举报
回复
不知道老兄再说什么?
zhq2000 2000-12-23
  • 打赏
  • 举报
回复
DCOM / MTS COM / COM+ , Corba
Re:CCNA_CCNP 思科网络认证 《 广域网 帧中继和永久虚电路 》======================# 本章课程大纲 广域网与局域网的区别 广域网连接类型 典型的广域网封装协议 广域网①HDLC协议的配置和应用场景 ②PPP协议的应用场景和配置 ③PPPoE协议实现拨号上网 配置路由器广域网接口支持④帧中继(重点)永久虚电路 # 广域网与局域网的区别 局域网(Local Area Network),简称LAN,是指在某一区域内由多台计算机互联成的计算机组。一般企业或机构自己购买设备,将物理位置较近的办公区的计算机使用网络设备连接起来,一般覆盖范围是几千米以内(光纤组网)。 广域网(Wide Area Network),简称WAN,是一种跨越大的、地域性的计算机网络的集合。由专业的Internet服务器提供商(ISP)提供广域网连接,网通或电信。广域网的带宽由企业所付的费用决定,比如我们上网的ADSL就是租用网通或电信的服务。 # 广域网连接类型 1. 专线(Leased lines)                (当前费用降低) 电路交换  2. 电路交换(Circuit Switching) (早期过气技术...) 3. 包交换(Packet Switching)    (性价比较高且灵活性强)(本章重点) # 典型的广域网封装协议 R1(config-if)#encapsulation ?                     //重新封装(12种)  frame-relay     Frame Relay networks  hdlc                 Serial HDLC synchronous(default)  ppp                  Point-to-Point protocol ... ... # 配置路由器:广域网接口使用HDLC协议# 配置广域网链路使用PPP协议:搭建实验环境# 搭建PPPoE拨号实验环境:实现路由器类DHCP分配各项资源# 帧中继和永久虚电路(本章重点) 帧 数据链路层:帧[frame] [freɪm] 网络层:数据包[packet] 传输层:数据段[segment] [ˈseɡmənt] 中继 中继(Relay)是两个交换中心之间的一条传输通路。 中继线是承载多条逻辑思维链路,在一条物理链路实现。 中继设备(帧中继交换机),将强或归正数据长途传输 帧中继(frame relay) 通过帧标记的复用技术 (类比trunk干道链路:vlan标记的复用计算) # 帧(数据链路层)中继 帧中继已成为近几十年WAN(广域网)服务最流行的技术之一。 帧中继默认情况下归为非广播多路访问(NBMA)网络, 即默认情况下不在网络上发送像RIP更新这样的广播包。 帧中继是从X.25技术发展来的。 永久虚电路(Permanent Virtual Circuits,PVC)是目前最常用的类型。 Permanent [ˈpɜːmənənt] adj. 永久的 永久 即电信公司在内部创建映射,只要你付费,虚电路就一直有效。 交换虚电路(Switch Virtual Circuits,SVC)更像电话呼叫。 当数据需要传输时,建立虚电路; 数据传输完成后,拆除虚电路。 帧中继PVC使用 数据链路连接标识符 (Data Link Connection Identity,DLCI[帧标记])标识DTE设备 控制时钟频率的是DCE,被动端设备DTE-----------------------------              

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧