Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2013, 22:24   #1
Wild_klas
Форумчанин
 
Аватар для Wild_klas
 
Регистрация: 13.10.2010
Сообщений: 109
По умолчанию Как правильно закрывать сокет?

Здравствуйте. У меня возник вопрос: как правильно закрывать сокеты?
У меня при попытке закрыть его, получается 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(Soc ketInputStream.java:189)
at java.net.SocketInputStream.read(Soc ketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes( StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(S treamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(Strea mDecoder.java:177)
at java.io.InputStreamReader.read(Inpu tStreamReader.java:184)
at java.io.BufferedReader.fill(Buffere dReader.java:154)
at java.io.BufferedReader.readLine(Buf feredReader.java:317)
at java.io.BufferedReader.readLine(Buf feredReader.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.socketRe ad0(Native Method)
at java.net.SocketInputStream.read(Soc ketInputStream.java:150)
at java.net.SocketInputStream.read(Soc ketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes( StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(S treamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(Strea mDecoder.java:177)
at java.io.InputStreamReader.read(Inpu tStreamReader.java:184)
at java.io.BufferedReader.fill(Buffere dReader.java:154)
at java.io.BufferedReader.readLine(Buf feredReader.java:317)
at java.io.BufferedReader.readLine(Buf feredReader.java:382)
at Chat.ClientFrame$IncomingReader.run (ClientFrame.java:273)
at java.lang.Thread.run(Thread.java:72 2)

Вот и возникает вопрос как их черт подери закрывать чтобы все было гладко? Я не могу понять. Подскажите пожалуйста.
Учусь учиться.
Wild_klas вне форума Ответить с цитированием
Старый 14.03.2013, 03:03   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Ну я закрываю стримы и затем сам сокет, хотя вроде бы одного сокета достаточно.
Далее, сокет закрывается в finally блоке, чтобы если что, он не висел в памяти открытым.
Код:
public void closeSocket() {
        try {
            ChatServer.getUsers().userList.remove(this);
            sendOnlineUsers();
          
        } catch (Exception ex) {
            ChatServer.getLog().log(Level.SEVERE, "Exception: in " + ClientThread.class.getName() + " :", ex);
        }
        finally
        {
            try
            {
                bufferedReader.close();
            }
            catch (final IOException ex)
            {}
            try
            {
                printStream.close();
            }
            catch (final IOException ex)
            {}
            try
            {
                socket.close();
            }
            catch (final IOException ex)
            {}
        }
    }
Если вдруг сейчас упадет, укажи строчку, на которой грохнулось, а то стек трейс тут ни о чем не говорит.
Carbon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сокет останавливает другой сокет. batand C/C++ Сетевое программирование 2 09.10.2012 11:58
Как сделать простейшую передать файл через Сокет SevenXP C/C++ Сетевое программирование 1 25.05.2011 13:55
Как закрывать диаграммы без запроса о подтверждении удаления? Xamil Microsoft Office Excel 1 23.04.2011 20:13
Как закрывать форму с активным idTCPServer'ом TwiX Работа с сетью в Delphi 1 21.03.2010 20:45
Как заставить клиентский сокет заново подключится к серверу Vadik(R) Работа с сетью в Delphi 6 01.11.2008 14:30