有个tcp数据传输的问题想请教一下

因为毕业时间不长,技术比较菜,最近在复习基础知识,在tcp数据传输这一块写了两个小例子,来验证客户端与服务端的交互但是遇到点小问题,实在一头雾水,希望各位能帮助解惑一下,感谢感谢。
client :

public class client {
 public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",10086);
        BufferedWriter bw  = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        bw.write("客户端发送的第一行");
        bw.newLine();
        bw.write("客户端发送的第二行");
        bw.flush();
        BufferedReader bs = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String result ;
        while ((result=bs.readLine())!=null){
            System.out.println(result);
        }
        socket.close();
    }
}

server :

public class server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10086);
        Socket accept = ss.accept();
        BufferedReader bs = new BufferedReader(new InputStreamReader(accept.getInputStream()));
        String s;
        while ((s=bs.readLine())!=null){
            System.out.println(s);
        }
        BufferedWriter bw  = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
        bw.write("这是服务端返回给调用端的成功信息!");
        bw.flush();
        bs.close();
        bw.close();
        accept.close();
        ss.close();

    }
}

一开始知识在client发数据,在server接收数据,都正常,但是当我想从server返回信息给client的时候出现了问题。

img

img

img

看下我的博客

或许服务端还没来得及回复客户端就已经强制下线了,不如把循环写成死循环试试

兄弟们,我整明白了,问题出在socket获取流后用readline()读取的阻塞机制,正常来说,readline读到文件末尾会返回null,但对于socket来说不是,他读完一行会阻塞,等待client再次发信息。但是这时候调用端已经写完数据在等待服务端返回数据,这样造成了死锁,两边都在等待。解决这个问题需要调用socket的shutdownOutput()方法,来告诉服务端,流已经传输完毕,但是不能关闭socket,这个时候服务端才不会继续等待,会接着往下走,组装返回信息。这样客户端也能拿到服务器短的返回信息了。

img

img

img

不能使用readLine方法,要一次性读取。