Java jako usługa Windows (DatagramSocket)

0

Witam,
mam pewien problem, ostatnio zajmowałem się trochę aplikacjami typu serwer-klient od podstaw i dla ćwiczeń zrobiłem sobie aplikacje która będzie czymś w rodzaju zdalnego sterowania. Wszystko jest ok, nie jest to mistrzostwo świata, ale działa. Tylko jest pewna rzecz, a mianowicie gdy uruchomię program klienta z konsoli to może stać i 2 miesiące czekając na jakiś sygnał od serwera, natomiast gdy umieszczę klienta aby uruchamiał się na starcie windows i oczekiwał na sygnał z serwera, to owszem uruchamia się, ale stoi tylko około 20 min po czym się wyłącza. Nie myślę żeby to był problem z moim kodem, bo z konsoli tak jak już wcześniej napisałem stoi i czeka, ale wydaje mi się że jest to wina windowsa, ponieważ moja aplikacja uruchamia się i czeka na połączenie w metodzie blokującej receive(); klasy DatagramSocket(); i wydaje mi się że właśnie tu jest pies pogrzebany, windows widząc że w procesie nic się nie dzieje po prostu go zabija, ale to są tylko moje domysły i chciałbym aby ktoś kto wie o tym cokolwiek się wypowiedział i pomógł mi rozwiązać ten problem. Nie zamieszczam kodu bo moim zdaniem nie tu jest problem, ale oczywiście jeśli zajdzie taka potrzeba to mogę go tu wrzucić.
pozdrawiam Piotrek;

0

Trochę podobnych rzeczy popisałem - aplikacje klient-serwer, które poprzez socket lub NamedPipe'y się łączyły i coś wymieniały. Ten sam mechanizm: umieszczałem w rejestrze wpis by przy starcie systemu uruchamiał niewidoczny programik i ten oczekiwał na połączenie od klientów. Tak przy okazji to nie nazywaj tego usługą w sensie programowym-usługa to zupełnie coś innego i jest oczywiście możliwe napisanie takiego czegoś w Javie pod Winde ale jest to dość kłopotliwe i wymaga zewn. softu do automagicznych rzeczy. No chyba, ze się mylę i napisałeś usługę?

Tak czy siak usługi też pisałem na socketach i nigdy mi się nie zdażyło by system uwalił mi progsa podczas oczekiwania na połączenie. Masz błąd w appsie albo coś. Winda mimo ze jej nie lubimy to nie uwali JVM ot tak bo socket oczekuje.

A nie używasz przypadkiem w tym swoim kodzie JNI/JNA lub innego proxy do wykorzystania natywnego kodu?

EDT: Tutaj art jak pisać usługi w Javie pod jedyny słuszny system: http://sdjournal.pl/article/1[...]y-jako-uslugi-systemu-windows

0

http://winrun4j.sourceforge.net/ - to bardzo ułatwia tworzenie usług

0

Ciekawy ten link co wkleiłeś.

Interesuje mnie to: "Custom executable name that appears in task manager." Próbowałeś tego? Tylko tam jest chyba błąd w "przepisie" bo każą mi mieć już na starcie [yourapp].exe a to chyba miał być jar?

0

1:
Przez JNI można załadować JVM z poziomu C++ .. nie mając żadnego jara, ponieważ klasy możesz jej przekazać bezpośrednio jako bajty. jvm.dll można znaleźć czytając z rejestru gdzie znajduje się JRE.
Ja tak zwykle robię, gdy jakiś prog na desktop wydaję :)

2:
winrun4j ma już przyszykowane skompilowane exeki, które to robią...(konsolowe/okienkowe 32/64bit i nie musisz ich sam kompilować.. wystarczy, że dodasz resource)
Ma też RCEDIT - specjalnie napisany program do edycji resources w exe - możesz dodać zawartość jara/ikonkę/manifest(do odpalania UAC w win7)/ini do exe - wbudowany classloader będzie je stamtąd ładował, no chyba że każesz mu ładować z jara...

btw: winrun4j definiuje własny classloader, który czyta z wewnątrz exeka po prostu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0