serwer tcp swing java

0

witam, robię serwer tcp w swingu w javie, mam gui stworzone, ale gdy chce żeby nasłuchiwał to gui zamarza, czytałem że muszę osobne wątki stworzyć, chciałem prosić o jakieś rady związane z wątkami tzn, jakie funkcje muszą się znaleźć w wątkach aby gui nie zamarzało.

0
Wibowit napisał(a)

Kurs wielowątkowości w Swingu: http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html

dziękuje ale chce coś wiedzieć jakie wątki powinny się znaleźć w serwerze aby gui nie "zamarzało" i żeby nasłuchiwał

0

Nie dziękuj tylko klepnij SwingWorkera. Wszystko jest opisane pod linkiem. Jeśli chcesz mieć skalowalny serwer to zainteresuj się NIO i non blocking io, np: http://www.java2s.com/Code/Java/Network-Protocol/Nonblockserver.htm

0

raczej nie o to mi chodzi, najpierw wywołuje serwer_socket=new ServerSocket(port); później Socket socket=serwer_socket.accept(); i całe gui mi zamarza, gniazdo do nasłuchiwania niby się tworzy bo komendę netstat wywołuje i pokazuje że port o podanym jest otwarty.

0
javadoc napisał(a)

accept

public Socket accept()
throws IOException
Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.
A new Socket s is created and, if there is a security manager, the security manager's checkAccept method is called with s.getInetAddress().getHostAddress() and s.getPort() as its arguments to ensure the operation is allowed. This could result in a SecurityException.

Returns:
the new Socket
Throws:
IOException - if an I/O error occurs when waiting for a connection.
SecurityException - if a security manager exists and its checkListen method doesn't allow the operation.
SocketTimeoutException - if a timeout was previously set with setSoTimeout and the timeout has been reached.
IllegalBlockingModeException - if this socket has an associated channel, and the channel is in non-blocking mode.
See Also:
SecurityManager.checkAccept(java.lang.String, int)

Jeśli wykonasz ServerSocket.accept() w EDT to GUI będzie zamrożone co najmniej, aż do momentu kiedy ktoś się podłączy. Jeżeli będziesz dalej coś robił w EDT bez zwalniania go Swingowi to GUI będzie zamrożone jeszcze dłużej. Dlatego powinieneś wrzucić ServerSocket.accept() do SwingWorkera, który siedzi sobie w innym wątku, a Swing go w miarę wolnego czasu odpytuje o wyniki.

Cały Swing jest jednowątkowy (podobnie zresztą jak chyba wszystkie windowing toolkity), a więc jak mu zapchasz ten wątek to będziesz miał zamrożone GUI. Proste i logiczne. Wszystko jest wytłumaczone pod pierwszym moim linkiem.

SwingWorkera odpala się np metodą EventQueue.invokeLater.

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