问答详情
源自:3-5 使用多线程实现多客户端的通信

客户端输出流是否shutdownOutput()会不会对程序造成异常?

我在练习的时候客户端请求信息时若未调用shutdownOutput()方法,服务器读取数据时会出现阻塞现象,导致后面代码无法执行...... 有没有大神给我指点下啊?

提问者:_小猪 2016-04-04 23:03

个回答

  • SoyaDokio
    2016-07-01 02:18:20
    已采纳

    如果代码整体还是这样只做测试之用,那我的建议有两个:

    1. 在writer.write("用户名:admin;密码:123456");中输出的字串结尾手动加上换行符,变成writer.write("用户名:admin;密码:123456\n");或writer.write("用户名:admin;密码:123456\r");

    2. 将writer.write("用户名:admin;密码:123456");这个方法改为java.io.PrintWriter.println()这个方法,即改为writer.println("用户名:admin;密码:123456");

    我认为以上两种方法均可不必加上client.shutdownOutput();这句代码。

  • _小猪
    2016-04-04 23:05:52

    // 创建客户端Socket
       Socket client = new Socket("localhost", 8888);

       // 创建输出流,写入请求信息
       OutputStream out = client.getOutputStream();
       PrintWriter writer = new PrintWriter(out);
       writer.write("用户名:admin;密码:123456");
       writer.flush();
       //这行代码如果没有,服务器读取数据就会一直阻塞
       client.shutdownOutput();
       // 创建输入流,接受服务器响应信息
       InputStream in = client.getInputStream();
       InputStreamReader inr = new InputStreamReader(in);
       BufferedReader reader = new BufferedReader(inr);
       String info = null;
       while ((info = reader.readLine()) != null) {
        System.out.println("我是客户端,服务器说:"+info);
       }
       //关闭输入流
       client.shutdownInput();
       // 关闭资源
       client.close();