JAVA基础--关于Socket编程中的I/O阻塞

来源:互联网 发布:软件无线电 军用 编辑:程序博客网 时间:2024/05/22 02:09

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()这个地方,数据永远也不会写入磁盘中!

阅读全文
0 0
原创粉丝点击