同步阻塞式IO(BIO)--学习笔记
来源:互联网 发布:淘宝打假2016多久结束 编辑:程序博客网 时间:2024/05/22 00:12
线程模型如下:
采用BIO模式的socket服务端,通常由独立的Acceptor线程负责监听客户端连接,如果没有客户端发送连接,Accpetor 会一直处于阻塞状态。在接收到客户端请求后,创建一个线程来处理该请求,处理完成后可以通过输出流回应客户端,然后线程销毁。线程和客户端并发数相等。完全是一次请求一次应答模式。
如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的BIO服务器实现可能非常契合。对于高并发访问,每次访问创建一个新的线程处理显然不可行。
以下是javaSocket 实现代码:
服务器端全部测试代码:
package bioFrame.server;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import bioFrame.server.handler.StringServerHandler;/** * 同步阻塞式IO,为每个链接创建一个线程 * * @author Mercy * */public class ServerMain {public static int port = 9001;//默认监听端口public static void main(String[] args){System.out.println("Server start……");ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(port);while(true){Socket socket = serverSocket.accept();new Thread(new StringServerHandler(socket)).start();}} catch (IOException e) {e.printStackTrace();} finally {if(serverSocket != null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}}
StringServerHandler 用来解析收到的文本内容
package bioFrame.server.handler;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * 用于接收客户端发来的文本消息,输出到控制台,并返回给客户端一个时间戳 * @author Mercy * */public class StringServerHandler implements Runnable{private Socket socket;public StringServerHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {BufferedReader br = null;try {br = new BufferedReader(new InputStreamReader(socket.getInputStream()));StringBuffer sb = new StringBuffer();while(br.ready()){//判断是否已准备好被读取sb.append(br.readLine());}//String content = br.readLine();//while(content != null){//sb.append(content);//content = br.readLine();//这里会阻塞?//}System.out.println("Server recive :" + sb.toString());PrintWriter pw = new PrintWriter(socket.getOutputStream());pw.print(String.valueOf(System.currentTimeMillis()));pw.flush();} catch (IOException e) {e.printStackTrace();} finally {if(br != null){try {br.close();} catch (IOException e) {e.printStackTrace();}br = null;}if(socket != null){if(!socket.isClosed()){try {socket.close();} catch (IOException e) {e.printStackTrace();}socket = null;}}}}}
socket客户端测试代码如下:
package bioFrame.client;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * 同步阻塞式IO,发送文本内容给服务器,读取服务器响应,并打印结果 * @author Mercy * */public class ClientMain {/** * 要连接的服务器端口 */private static int port = 9001;private static String ip = "127.0.0.1";public static void main(String[] args){Socket socket = null;try {socket = new Socket(ip,port);PrintWriter pw = new PrintWriter(socket.getOutputStream());pw.println("这里是第一行内容");pw.println("这里是第二行内容");pw.flush();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));System.out.println("client recive :" + bufferedReader.readLine());pw.close();bufferedReader.close();} catch (Exception e) {e.printStackTrace();} finally {if(socket != null){if(!socket.isClosed()){try {socket.close();} catch (IOException e) {e.printStackTrace();}socket = null;}}}}}
1 0
- 同步阻塞式IO(BIO)--学习笔记
- Java IO:面向流、同步、阻塞式IO(BIO)
- Netty学习之BIO(阻塞IO)
- IO的学习笔记 - 同步,异步,阻塞,非阻塞
- IO学习笔记:阻塞 非阻塞 同步 异步
- Java I/O学习笔记(1),同步阻塞式IO
- Socket通信之BIO(同步阻塞IO)、PAIO(伪异步阻塞IO)、NIO(异步非阻塞IO)、AIO(异步非阻塞IO)、netty5之IO
- 同步阻塞通信-BIO编程
- Netty之BIO(同步阻塞IO)、PIO(伪异步阻塞IO)、NIO(异步非阻塞IO)、AIO(异步非阻塞IO)、Netty
- Netty之BIO(同步阻塞IO)、PIO(伪异步阻塞IO)、NIO(异步非阻塞IO)、AIO(异步非阻塞IO)
- Netty之BIO(同步阻塞IO)、PIO(伪异步阻塞IO)、NIO(异步非阻塞IO)、AIO(异步非阻塞IO)、Netty
- Java IO:阻塞/非阻塞式IO、同步/异步IO
- Java IO:阻塞/非阻塞式IO、同步/异步IO
- java之阻塞IO(BIO)
- java网络编程(二)----同步阻塞bio
- java同步阻塞IO
- 阻塞IO、非阻塞IO、同步IO、非同步IO
- 同步,异步,阻塞,非阻塞,BIO,AIO,NIO 理解
- 欢迎使用CSDN-markdown编辑器
- Nginx/ZooKeeper 负载均衡的差异
- Yii2如何使用存取控制过滤器(ACF)
- DNS原理及其解析过程剖析
- poj3213
- 同步阻塞式IO(BIO)--学习笔记
- 关于从浏览器到数据库之间的网络连接
- Qt网络编程--主机信息
- Android studio中调出快捷键,快速try catch包括代码块
- Android 仿通讯录A-Z侧边索引查询 LetterListView androidstudio
- 一维数组的逆序输出(情况一:仅输出时发生改变,数组元素位置不发生改变、情况二:将顺序数组改为逆序数组)
- 查看web服务器的方式
- 《博士五年总结》及我其它过去的博客文章
- 微电影大赛二等奖