「java后台服务程序」java程序注册为服务

博主:adminadmin 2023-01-28 09:06:07 251

今天给各位分享java后台服务程序的知识,其中也会对java程序注册为服务进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何用java编写android后台程序

使用J2EE技术或者叫Java Web技术开发一个Web服务器,服务器返回Json数据,android客户端解析json数据,使用http协议和服务器通信,android有相应模块和API。

首先楼主得懂Java后台也就是Java EE,用Servlet搭建Web服务,Serlvet映射一个URL,Android请求这个URL,Servlet处理请求,然后就是Java编程,Web分层、JDBC等技术。服务器返回标准的JSON轻量数据(就是纯文本),Android来解析。

具体技术:

(1)Java Servlet作为Web服务的处理入口;

(2)Java编程编写业务处理程序;

(3)JDBC访问数据库;

(4)Android端的HTTP模块,API;

(5)Android端解析JSON数据;

(6)Servlet或者Java端生成JSON数据;

等楼主技术强了,就可以接触各种框架、EJB技术了。Spring、Spring MVC、Struts、Hibernate,甚至NOSQL、分布式、负载、node.js、模板技术等等。

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

在Windows中,无法直接用Java产生Service程序;但是可能通过编写DCOM 或 MTS COM 或 COM+(Window2000) 组件 或 Corba 来模拟Service程序,可以实现透明远程过程调用;

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;iidwArgc;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;idwArgc;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;iargc;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

用Wrapper做java后台服务器程序,java文件有要求么?

分类: 电脑/网络 程序设计 其他编程语言

问题描述:

我想用Wrapper做java后台服务器程序,Wrapper配置完毕,但是运行App.bat时,提示如下错误:

wrapper | --WrapperStarted as Console

wrapper | Launching a JVM...

jvm 1 | Wrapper(Version 3.2.1)wrapper.tanukisofarejvm 1 |

jvm 1 |

jvm 1 | WrapperSimpleApp:Encountered an error running main:javang.illegalAccessException:Class .tanukisofare.wrapper.WrapperSimpleApp can not access a member of class A with modifiers "public static"

jvm 1 | javang.illegalAccessException:Class .tanukisofare.wrapper.WrapperSimpleApp can not access a member of class A with modiffiers "public static"

jvm 1 | at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)

jvm 1 | at javang.reflect.Method.invoke(Unkown Source)

jvm 1 | at .tanukisofare.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:292)

jvm 1 | at javang.Thread.run(Unknown Source)

wrapper | 《--Wrapper Stopped

请按任意键继续...

请问这是怎么回事,如何解决?是否对类的写法又要求,是否有Main方法?

我的程序目录为:

|-bin-+

| |-wrapper.exe

| |-UninstallApp-NT.bat

| |-App.bat

| |-InstallApp_NT.bat

| |-A.class

|

|-conf-+

| |-wrapper.conf

|

|-logs-+

| |-wrapper.log

|

|-lib-+

|-wrapper.dll

|-wrapper.jar

以下是A.class的内容:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.sql.*;

/*引用短信类*/

class A extends JFrame{

private String url = "jdbc:mysql127.0.0.1:3306/test";

private String user = "root";

private String pass = "";

private String content,phones;

private String[] tels;

private int sdid;

private Connection conn,delConn;

private Statement sql;

private ResultSet rs;

A(){

super("短信发送系统");

/*短信注册代码 实例化短信类*/

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

/*短信注销代码*/

System.exit(0);

}

});

}

public void runA(){

try{

Class.forName(".mysql.jdbc.Driver");

}catch(ClassNotFoundException e){

System.out.println(e);

}

try{

conn = DriverManager.getConnection(url,user,pass);

sql = conn.createStatement();

rs = sql.executeQuery("SELECT * FROM ok");

while(rs.next()){

sdid = rs.getInt(1);

content = rs.getString(3);

phones = rs.getString(6);/*发送短信代码*/

}

}

rs.close();

sql.close();

conn.close();

}catch(SQLException sqle){

System.out.println(sqle);

}

}

public static void main(String[] args){

A a = new A();

a.runA();

}

}

请高手帮忙指点谢谢!

解析:

新建一个类,把A类主方法写到这个类中.

JAVA中后台的Servlet程序怎么将结果返回给前台的页面?

前台用AJAX将json数据传入后台,同样,后台将数据封装在json串中可传入前台,

前台用ajax的回调函数响应:

示例:

前台脚本:

script

$(function(){

$("a").click(function(){

var url = this.href;

var args = {"time":new Date()};

$.getJSON(url,args,function(data){    //回调函数的参数data就是后台封装的json串

$("#bookName").text(data.bookName);      //data.属性名   读json串中的内容

$("#totalMoney").text(data.totalMoney);

$("#totalBook").text(data.totalBook);

});

return false;

});

})

/script

后台封装:在servlet类中代码:

//准备响应JSON对象:

StringBuilder result = new StringBuilder();

result.append("{").append("\"bookName\":\""+bookName+"\"").append(",").append("\"totalMoney\":"+sc.getTotalMonry()).append(",").append("\"totalBook\":"+sc.getTotalNumber()).append("}"); //构建json串

response.setContentType("text/javascript");  //声明类型防止乱码

response.getWriter().print(result.toString()); //响应JSON

当服务器端通过HTTP协议接收到客户请求后,会将其转化为HttpServletRequest对象传递给Servlet。

Servlet通过这些类理解客户的请求,并将其处理后的内容通过HttpServletResponse回复到服务器端。

Web容器进行整理后用HTTP协议向客户端传送响应。

生命周期

Servlet实例的装载

Servlet 实例装载有以下三种方式:

当第一次调用Servlet 时,就会创建一个 Servelt 实例,这个实例会长期驻留内存中。

在Web.xml文件中的Servlet/Servlet之间添加如下代码:loadon-startup1/loadon-startup,Servelt 容器启动时会自动装载这个Servlet,数字越小表示优先级别越高。

Servlet 类文件被更新后,会重新装载Servlet。

关于java后台服务程序和java程序注册为服务的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。