当前位置: 代码迷 >> J2SE >> 请问关于Socket的close()会阻塞的有关问题
  详细解决方案

请问关于Socket的close()会阻塞的有关问题

热度:245   发布时间:2016-04-24 01:39:19.0
请教关于Socket的close()会阻塞的问题。
最近在看Java Socket相关的东西,看到其中一段示例程序,我居然运行结果跟书中的不一样,仔细检查代码并无写错,所以贴出来让大伙瞧瞧这个问题到底是什么情况。

服务器代码
Java code
package chapter01.example11;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class SimpleServer {    public static void main(String[] args) throws IOException, InterruptedException {        ServerSocket ss=new ServerSocket(8000);        Socket s=ss.accept();        Thread.sleep(5000);        InputStream in=s.getInputStream();        ByteArrayOutputStream buffer=new ByteArrayOutputStream();        byte[] buff=new byte[1024];                int len=-1;        do {            len=in.read(buff);            if(len!=-1)                buffer.write(buff,0,len);        } while (len!=-1);        System.out.println(new String(buffer.toByteArray()));    }    }


客户端代码
Java code
package chapter01.example10;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class SimpleClient {    public static void main(String[] args) throws UnknownHostException, IOException {        Socket s=new Socket("localhost",8000);        s.setSoLinger(true, 3600);        OutputStream out=s.getOutputStream();        StringBuffer sb=new StringBuffer();        for (int i = 0; i < 10000; i++) {            sb.append(i);        }        out.write(sb.toString().getBytes());        System.out.println("开始关闭");        long begin=System.currentTimeMillis();        s.close();        long end=System.currentTimeMillis();        System.out.println("关闭Socket所用的时间未:"+(end-begin)+"ms");    }    }


书中解释如下:
socket.setSoLinger(true,3600);
  执行Socket的close()方法,该方法不会立即返回,而进入阻塞状态。同时,底层的Socket会尝试发送剩余的数据。只有满足以下两个条件之一,close()方法才返回:
  1、底层的Socket已经发送完所有的剩余数据
  2、尽管底层的Socket还没有发送完所有的剩余数据,但已经阻塞了3600秒,close()方法的阻塞时间超过3600秒,也会返回,剩余未发送的数据被丢弃。

书中上面的程序打印结果如下:
开始关闭
关闭Socket所用的时间未:5648ms

而我自己运行的打印结果如下:
开始关闭
关闭Socket所用的时间未:0ms

大伙自己拷贝这段代码运行看看是不是跟我一样的,难道书中讲解有误?知道的高手请指教一下。

------解决方案--------------------
这很好的说明了,写这本书的哥们用的电脑是286的
------解决方案--------------------
你的电脑有问题吧 运行结果如下:
开始关闭
关闭Socket所用的时间未:5651ms
------解决方案--------------------
我的运行结果也是:
开始关闭
关闭Socket所用的时间未:5651ms

------解决方案--------------------
我的运行结果是:

开始关闭
关闭Socket所用的时间未:5703ms

------解决方案--------------------
这可能是由于 操作系统 或者 JVM版本不同引起的。

楼主可以查看一下书籍,看看上面使用的是不是sun公司的JRE运行的程序,
以及,具体的是哪个版本。

不同版本的JVM对程序的实现,在细节上是有出入的。

还有,操作系统对Socket的设置,也会有所不同,楼主可以看看是不是操作系统的原因。
不过,这个概率比较小,呵呵。
  相关解决方案