Mam problem z używaniem ServerSocket
w mojej aplikacji.Tworzenie ServerSocket w osobnym wątku?
Tworzę ServerSocket
w konstruktorze mojej aplikacji. Konstruktor gniazda wywołuje metodę accept()
, aby oczekiwać na połączenie klienta.
Problem polega na tym, że metoda accept()
blokuje całą moją aplikację, dopóki klient się nie połączy. Chciałbym zapytać, czy istnieje alternatywa dla utworzenia całego ServerSocket
w osobnym wątku, że konstruktor metody ServerSocket
i accept()
jest wywoływany obok mojej głównej aplikacji?
Edit:
Dzięki Olivier za radę, strzelaj .accept do runnable i tworząc puli wątków do obsługi clientconnections.
Ów mój kod teraz:
public void start(){
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
serverSocket = new ServerSocket(port);
while (true) {
Socket clientSocket = serverSocket.accept();
objectout = new ObjectOutputStream(clientSocket.getOutputStream());
clientProcessingPool.submit(new ClientTask(clientSocket,objectout));
}
} catch (IOException e) {
System.err.println("Accept failed.");
}
}
};
Everythings działa prawidłowo! Dzięki!
próbował przeniesienie kodu związanego z gniazdem w osobnym wątku? każdy konkretny problem napotykany? – Ankit
Spójrz na java.nio.channels.AsynchronousServerSocketChannel i sprawdź, czy spełnia on twoje wymagania. – Crollster
Albo jeszcze lepiej, spójrz na to pytanie: http://stackoverflow.com/questions/8940747/how-should-i-use-asynchronousserversocketchannel-for-accepting-connections – Crollster