【问题标题】:java socket. How to server know client close streamjava 套接字。服务器如何知道客户端关闭流
【发布时间】:2012-07-10 05:08:32
【问题描述】:

我想用 java 写一个传输文件 socket-program 。 但是我有问题,传输文件时如何取消。

当我在客户端关闭输入流时,服务器如何知道它关闭输出流。

这是我的代码: 客户

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

......

但是当我关闭输入流时什么都没有显示

【问题讨论】:

  • 如果它对您的项目有意义,我认为您应该查看 ZeroMQ:zeromq.org/bindings:java
  • 我认为你需要一个循环来读取和发送,直到整个文件被处理完。

标签: java file sockets stream


【解决方案1】:

当客户端在传输过程中关闭InputStream,服务端会抛出一个SocketException。

【讨论】:

  • 最终做到非常。这可能需要几分钟,具体取决于客户端套接字消失的具体情况。
  • 它会抛出一个IOException'连接重置'。不是SocketException。
  • @EJP 仅供参考,SocketException 是IOException 的子类。实际上,如果您尝试记录抛出的异常,它总是会准确地告诉您它是 SocketException 而不是它的超类。
  • @shinkou, '仅供参考',抛出的异常是 IOException, 而不是 SocketException.
  • @sarnold FIN 也不例外:相反,read() 返回 -1。您无法在读取时获得 ICMP UNREACH。
【解决方案2】:

您可以在 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 */
}

【讨论】:

  • 你能看到我上面的代码吗,我做了这个 try-catch 块但没有显示。
  • 我试过了,但还是不行。你能告诉我示例代码吗?请。
  • SocketClosed 当你关闭套接字并继续使用时抛出异常。当 peer 关闭 连接时不会。
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2015-04-07
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2017-02-11
相关资源
最近更新 更多