Здравствуйте. У меня возник вопрос: как правильно закрывать сокеты? У меня при попытке закрыть его, получается exception.
То есть, вот соке в обработчике клиента:
| Код | private Socket socket = null; private BufferedReader bufferedReader = null; private PrintStream printStream = null;
public ClientThread(UsersOnline users, Socket socket) throws IOException { super("ClientThread"); this.users = users; this.socket = socket; bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); printStream = new PrintStream(socket.getOutputStream()); } |
Когда клиент покидает сервер, пытаюсь закрыть все соединения с ним:
| Код | public void closeSocket() { try { ChatServer.getUsers().userList.remove(this); sendOnlineUsers(); bufferedReader.close(); printStream.close(); socket.close(); } catch (Exception ex) { ChatServer.getLog().log(Level.SEVERE, "Exception: in " + ClientThread.class.getName() + " :", ex); } }
|
В итоге получаю:
| Цитата | java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:189) at java.net.SocketInputStream.read(SocketInputStream.java:121) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:154) at java.io.BufferedReader.readLine(BufferedReader.java:317) at java.io.BufferedReader.readLine(BufferedReader.java:382) at Chat.ClientThread.run(ClientThread.java:98)
|
и еще стоит ли закрывать сокеты именно у клиента? Класс клиента:
| Код | public class ClientFrame extends javax.swing.JFrame { Socket socket; BufferedReader reader; PrintWriter writer;
....
private void setUpnetworking(){ try{ socket = new Socket(ip, port); InputStreamReader streamReader = new InputStreamReader(socket.getInputStream(), "UTF-8"); reader = new BufferedReader(streamReader); writer = new PrintWriter(socket.getOutputStream()); ..... } catch(IOException ex){ ChatServer.getLog().log(Level.SEVERE, "Connection error in: " + ClientFrame.class.getName() + " :", ex); } } |
На пример по кнопке хочу выйти:
| Код | private void jButton2MouseClicked(java.awt.event.MouseEvent evt) { try { socket.close(); writer.close(); reader.close(); System.exit(0); } catch (IOException ex) { ChatServer.getLog().log(Level.SEVERE, " in " + ClientFrame.class.getName() + " :", ex); } } |
в этом случае я получаю j| Цитата | ava.net.SocketException: socket closed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:150) at java.net.SocketInputStream.read(SocketInputStream.java:121) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:154) at java.io.BufferedReader.readLine(BufferedReader.java:317) at java.io.BufferedReader.readLine(BufferedReader.java:382) at Chat.ClientFrame$IncomingReader.run(ClientFrame.java:273) at java.lang.Thread.run(Thread.java:722) |
Вот и возникает вопрос как их черт подери закрывать чтобы все было гладко? Я не могу понять. Подскажите пожалуйста. |