能不能把程序寫在伺服器搭建後台
㈠ 簡單描述搭建你的後台伺服器過程
簡單地分為以下幾個步驟:
1.選擇伺服器和操作系統:首先需要選擇一台物理或虛擬伺服器來託管後台應用程序,然後選擇適合應用程序的操作系統,如linux或Windows Server。
2.安裝伺服器軟體:安裝必要的伺服器軟體,例如Web伺服器(如Apache、Nginx等)、資料庫伺服器(如MySQL、PostgreSQL等)和應用程序伺服器(如Tomcat、Node.js等),並根據需要配置它們。
3.設置防火牆和安全:設置伺服器的防火牆和其他安全措施,例如安裝廳掘SSL證書來啟用HTTPS協議,使用合適的加密演算法來保護敏感數據,限制伺服器訪問等。
4.部署應用程序:將編寫好的應用程序部署到服務芹伏蠢器上,配置所需的運行環境(例如java、Python、Node.js等),啟動應用程序,並確保它們能夠正常運行。
5.備份和監控:設置備份和監控措施,例如自動備份應用程序和資料庫,定期監控服嫌陪務器性能和錯誤日誌等。
㈡ java編寫的程序怎樣放在伺服器上,並通過互聯網打開操作該程序
放在伺服器上指的是?
看你寫的什麼程序了,如果是web程序,伺服器是linux系統的話。
首先要安裝jdk之類的環境並且設置環境變數。一邊在bashrc 等地方設置。
然後安裝tomcat之類的web容器 用來發布程序。然後把程序拷貝到web容器的對應目錄下就好了。
如果是純java程序,那要些server端和client端,通過socket或者第三方庫來實現訪問。
如果只是單機的java的話,直接拷貝到伺服器上,通過ssh遠程登錄到伺服器上,執行就可以了。當然前提是環境變數。
㈢ 用java寫網站全部後台可以嗎請專業人士回答好嗎,謝謝!
您好,首先答案是肯定的,Java在性能上,完全可以勝任後台開發。
網站後台,本質就是讓伺服器處理前端傳來的數據,所以前端和伺服器一般是配套的,比如你用JS+PHP模式或者JSP+SSH模式。
最初的時候,為了讓Java寫的前端程序跟伺服器交互,SUN公司制定出servlet規范,根據這個規范,有人用Java編寫出了Tomcat這樣的servlet容器。那麼我們只要編寫符合語法的Java程序(也稱servlet程序),就可以通過Tomcat與伺服器交互了。
後來人們發現,Java與伺服器交互完,向前台輸出反饋時,使用servlet太麻煩了,於是,又制定出了JSP規范(JSP與HTML、JS可以混雜,因為它倆是在前端就被解釋完的)。JSP底層還是servlet,但是它使用標簽式的語法,極大減輕了開發人員的負擔。
再後來,發現有些服務端的代碼是經常被重用的,於是又制定了JavaBean標准,再擴大點就是EJB。
再然後,程序越寫越大,復用也越來越頻繁,然後人們將整個程序粗略地分為三部分:模型、視圖、控制器,分別負責界面顯示、業務邏輯和底層數據交互,這就是MVC模型,基於這個模型誕生了Struts+Hibernate+Spring這樣輔助開發的SSH框架,使得Java在編寫大型伺服器程序時更便捷。
現在,大型的網站後台其實很多是用Java開發的,它更龐大,但也更安全、高效,當然開發成本也更高,所以我前面也只說Java在性能上完全可以勝任。如果你有計劃做這方面的業務,那就根據業務需求,從性價比上制定規劃吧,看PHP和Java哪個更合算。
-----您的採納是我們的動力-----
㈣ 如何將應用程序exe注冊成服務,直接從後台運行
方法一:使用windows自帶的命令sc\x0d\x0a使用sccreate方法創建。\x0d\x0a如:sccreateCaptureScreenbinpath=F:\zwmei-project\decklink-learning\OutputBitmap\Debug\OutputBitmap.exetype=ownstart=autodisplayname=Screen_Capture\x0d\x0a其中CaptureScreen為服務名,可以在系統服務中找到,(通過在命令行運行services.msc打開系統服務)。binpath為你的應用程序所在的路徑。displayname為服務顯示的名稱,這個在注冊表中可以找到,(通過在命令行中輸入regedit打開注冊表,在HKEY_LOCAL_MACHINE--SYSTEM--CurrentControlSet下找到你的服務顯示名)\x0d\x0a注意:在sc命令中,=號前面不能有空格,而=號後面必須有一個空格,切記。另外要以管理員的身份打開命令行。\x0d\x0a這種方法不一定能成功,如果你的exe不符合服務的規范,可能會啟動失敗。下面我們討論第二種方法\x0d\x0a方法二:在第一種方法失敗的情況下,我們可以使用instsrv.exe和srvany.exe兩個小工具為我們分憂解難\x0d\x0a我們可以在官網下載instsrv.exe和srvany.exe然後放到自己的文件夾中,可以將文件夾放入C盤。下面我們開始注冊服務。\x0d\x0a已管理員的身份運行命令行,首先進入工具所在的文件夾,如:c:\tools。\x0d\x0a執行c:\toolsinstsrv.exeServerNamesrvany.exe\x0d\x0a這樣我們就創建了一個名為ServerName的srvany的服務,那麼我們自己的exe該放在哪呢。下面我們打開注冊表\x0d\x0a找到ServiceName這個服務,然後右鍵新建項,名稱為Parameters。單擊該項,然後在右邊新建兩個字元串值。第一個名為Application,值為:應用程序路徑,如:c:\myApp.exe。第二個名為AppDirectory,值為:應用程序所在目錄,如:c:\。\x0d\x0a接下來我們進入系統服務,找到ServiceName這個服務,雙擊進入它的屬性。設置允許與桌面交互。然後啟動服務。\x0d\x0a至此我們完成了將exe注冊為服務的過程。\x0d\x0a下面我們分析一下:\x0d\x0ainstsrv.exe可以創建和刪除服務,然而如果沒有srvany.exe的參與,創建的服務可能無法啟動。那麼srvany.exe做了些什麼呢,啟動服務後我們可以在任務管理器中找到我們的服務,然後右擊服務,選擇轉到進程,(如果進程中沒有任何項被選中,則點擊下面的顯示所有用戶進程,然後重新選擇轉至進程),我們看到的是srvany.exe,而不是我們自己的exe。原來我們的exe成為了它的一個子項,由srvany.exe幫助啟動。
㈤ 如何部署java項目程序到伺服器上
其實跟本地環境是一樣的,搭建好這些環境,伺服器也可以看成是你的筆記本,你本地運行需要什麼,伺服器上就需要什麼。把項目拷貝到webapps裡面就行。
㈥ 用什麼方法是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;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