java сокет. Как сървърът да знае, че клиентът затваря потока

Искам да напиша сокет-програма за прехвърляне на файл в java. Но имам проблем, как да отменя при прехвърляне на файл.

когато затворя inputstream в клиента, как сървърът да го знае, за да затвори outputstream.

ето моят код: Клиент

                   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");
                    }

......

Но нищо не се показва, когато затворя inputstream


person cuong    schedule 10.07.2012    source източник
comment
Ако има смисъл за вашия проект, мисля, че трябва да разгледате ZeroMQ: zeromq.org/bindings:java   -  person K. Brafford    schedule 10.07.2012
comment
Мисля, че имате нужда от цикъл за четене и изпращане, докато целият файл бъде обработен.   -  person shinkou    schedule 10.07.2012


Отговори (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