джава сокет. Как сервер знает поток закрытия клиента

Я хочу написать сокет-программу для передачи файлов в java. Но у меня проблема, как отменить при передаче файла.

когда я закрываю входной поток в клиенте, как сервер узнает об этом, чтобы закрыть выходной поток.

вот мой код: Клиент

                   try {
            byte[] data = new byte[1024];
            InputStream is = socket.getInputStream();
            FileOutputStream fos = new FileOutputStream(
                    "/mnt/sdcard/UML.doc");
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            int total = 0;
            while ((count = is.read(data)) != -1 && !canceled) {
                total += count;
                publishProgress("" + (int) ((total * 100) / size));
                fos.write(data, 0, count);

            }

            if(canceled)
            {
                is.close();
                fos.close();
                //socket.close();
                pDialog.dismiss();
                File file = new File("mnt/sdcard/UML.doc");
                file.delete();

                canceled=false;

            }


        } catch (Exception e) {
            Log.e("Error: ", e.getMessage());
        }

......

Сервер

           BufferedInputStream bis = null;

                    bis = new BufferedInputStream(new FileInputStream(
                            myFile));

                    bis.read(mybytearray, 0, mybytearray.length);
                    os = s.getOutputStream();
                    int total = 0;

                    try {

                        os.write(mybytearray, 0, mybytearray.length);

                        // os.flush();
                    }
                    catch(SocketException e){
                        os.flush();
                        tv.setText("aaaaa");
                    }

......

Но ничего не отображается, когда я закрываю входной поток


person cuong    schedule 10.07.2012    source источник


Ответы (2)


Когда клиент закрывает InputStream в середине передачи, на стороне сервера будет выброшено SocketException.

person shinkou    schedule 10.07.2012
comment
Сделайте это очень в конце концов. Это может занять до нескольких минут в зависимости от конкретных обстоятельств, при которых клиентский сокет исчез. - person aroth; 10.07.2012
comment
Это вызовет IOException «сброс соединения». Не SocketException. - person user207421; 10.07.2012
comment
@EJP К вашему сведению, SocketException является подклассом класса IOException. И на самом деле, если вы попытаетесь зарегистрировать выбрасываемое исключение, оно всегда точно скажет вам, что это SocketException, а не его суперкласс. - person shinkou; 10.07.2012
comment
@shinkou, «Просто к сведению», выбрасывается исключение IOException,, а не SocketException. - person user207421; 11.07.2012
comment
@EJP: меняется ли исключение для RST, FIN, ICMP, недостижимого или тайм-аута? - person sarnold; 19.07.2012
comment
@sarnold Для FIN нет исключений: скорее, read() возвращает -1. Вы не можете получить ICMP UNREACH при чтении. - person user207421; 19.11.2015

Вы можете сделать это в блоке try-catch. псевдокод:

try{
    //your file transferring code here through socket output streams
} catch(SocketException e) {
    /* now as you are in this block you got a socket closed 
      Exception and your server now knows about it */
}
person Md. Arafat Al Mahmud    schedule 10.07.2012
comment
Вы можете увидеть мой код выше, я делаю этот блок try-catch, но ничего не отображается. - person cuong; 10.07.2012
comment
я пробовал, но все равно не работает. можете ли вы показать мне пример кода? пожалуйста. - person cuong; 10.07.2012
comment
SocketClosed возникает, когда вы закрываете сокет и продолжаете его использовать. Не тогда, когда одноранговый узел закрывает соединение. - person user207421; 19.11.2015