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;
- Rejestracja:prawie 14 lat
- Ostatnio:ponad 13 lat
- Postów:2

- Rejestracja:ponad 17 lat
- Ostatnio:ponad 2 lata
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/12798-aplikacje-javy-jako-uslugi-systemu-windows

- Rejestracja:ponad 16 lat
- Ostatnio:ponad 2 lata
- Lokalizacja:London
http://winrun4j.sourceforge.net/ - to bardzo ułatwia tworzenie usług

- Rejestracja:ponad 16 lat
- Ostatnio:ponad 2 lata
- Lokalizacja:London
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.