因为毕业时间不长,技术比较菜,最近在复习基础知识,在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的时候出现了问题。
或许服务端还没来得及回复客户端就已经强制下线了,不如把循环写成死循环试试
兄弟们,我整明白了,问题出在socket获取流后用readline()读取的阻塞机制,正常来说,readline读到文件末尾会返回null,但对于socket来说不是,他读完一行会阻塞,等待client再次发信息。但是这时候调用端已经写完数据在等待服务端返回数据,这样造成了死锁,两边都在等待。解决这个问题需要调用socket的shutdownOutput()方法,来告诉服务端,流已经传输完毕,但是不能关闭socket,这个时候服务端才不会继续等待,会接着往下走,组装返回信息。这样客户端也能拿到服务器短的返回信息了。
不能使用readLine方法,要一次性读取。