Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Проблема с закрытием сокетов


Автор: Wildklas 12.3.2013, 21:29
Здравствуйте. У меня возник вопрос: как правильно закрывать сокеты?   
У меня при попытке закрыть его, получается 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)



Вот и возникает вопрос как их черт подери закрывать чтобы все было гладко? Я не могу понять. Подскажите пожалуйста.

Автор: LSD 13.3.2013, 16:04
Цитата(Wildklas @  12.3.2013,  22:29 Найти цитируемый пост)
пытаюсь закрыть все соединения с ним

Цитата(Wildklas @  12.3.2013,  22:29 Найти цитируемый пост)
В итоге получаю:

Цитата(Wildklas @  12.3.2013,  22:29 Найти цитируемый пост)
в этом случае я получаю 

По стектрейсу видно, что ошибка возникает не при попытке закрыть сокет, а при попытке чтения из него.

Что же касается того как правильно закрывать, используй http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)