Server.java
public class Server {
public static void main(String[] args) {
new Server().start();
}
private void start() {
ServerSocket ss = null;
try {
ss = new ServerSocket(9999);
Socket s = ss.accept(); //阻塞-1
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println(br.readLine()); //br.readLine()也会阻塞-2
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ss != null) {
try {
ss.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
Client.java
public class Client {
public static void main(String[] args) {
Socket s = null;
try {
s = new Socket("127.0.0.1" , 9999); //对应阻塞-1
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//对应阻塞-2,如果不向套接字写入数据,server的br.readLine()会一直阻塞直到客户端数据的到来,这就是I/O阻塞
br.write("hello , server");
br.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (s != null) {
try {
s.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
如果服务器接收数据代码是这样的:
while((s = br.readLine()) != null) {
......
}
注:这时如果客户端不闭关连接,并且服务器端是一次性将数据写入磁盘话,那么服务器会一直停在br.readLine()这个地方,数据永远也不会写入磁盘中!