网络编程的基本模型是C/S模型,即两个进程间的通信。服务端提供IP和监听端口,客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手连接,如果连接建立成功,双方就可以通过套接字进行通信。

传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;
Socket负责发起连接操作。

BIO模型

特点

BIO的服务端通信模型:采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求后为每个客户端创建一个新的线程进行链路处理,处理完成后,通过输出流返回应答给客户端,线程销毁。

请求——应答通宵模型。

缺点

缺乏弹性伸缩能力;
当客户并发访问量增加后,服务端的线程个数和客户端并发访问数呈一比一关系,java中线程是比较宝贵的系统资源,线程数量快速膨胀后,系统的性能将急剧下降,最终系统死掉。

代码实现

客户端

public class BIOClient {private final String IP="127.0.0.1";//代词private final int port=5803;private Socket socket;//实现TCP编码的工具包private Scanner scanner;private BufferedReader reader;private BufferedWriter writer;public BIOClient(){scanner=new Scanner(System.in);try {socket=new Socket(IP,port);//客户端主动请求链接的方法 TCP的三次握手的发起reader=new BufferedReader(new InputStreamReader( socket.getInputStream()));//输入流  接受数据时使用writer=new BufferedWriter(new OutputStreamWriter( socket.getOutputStream()));//输出流  发送数} catch (IOException e) {e.printStackTrace();}}public  void startClient(){try {while (true) {System.out.println("请输入你的请求:");String send = scanner.nextLine();writer.write(send + "\n");writer.flush();if(send.equals("exit")){break;}String back = reader.readLine();System.out.println("接受到服务器发回的消息" + back);}} catch (IOException e) {e.printStackTrace();}finally {try {if(socket!=null) {socket.close();socket=null;}if(reader!=null){reader.close();reader=null;}if(writer!=null){writer.close();writer=null;}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {new BIOClient().startClient();}}

服务端

class ServerRunnable implements Runnable {private Socket clientSocket;private BufferedReader reader;private BufferedWriter writer;private Scanner scanner;public ServerRunnable(Socket clientSocket, BufferedWriter writer,BufferedReader reader, Scanner scanner) {this.clientSocket = clientSocket;this.reader = reader;this.writer = writer;this.scanner = scanner;}@Overridepublic void run() {try {while (true) {String s = null;s = reader.readLine();System.out.println("接受到客户端发送的数据" + s);if (s.equals("exit")) {break;}//根据收到的信息做相应的逻辑处理System.out.println("请输入你向客户端回复的信息:");String send = scanner.nextLine();writer.write(send + "\n");//注意加“/n”刷新发送缓冲区writer.flush();//针对writer刷新}} catch (IOException e) {e.printStackTrace();} finally {try {if (reader != null) {reader.close();reader = null;}if (writer != null) {writer.close();writer = null;}if (clientSocket != null) {clientSocket.close();clientSocket = null;}} catch (IOException e) {e.printStackTrace();}}}
}public class BIOServer {private final int port = 5803;//如果不写就会随机分配一个(5000,65535)private ServerSocket socket;//实现TCP编码的工具包private BufferedReader reader;private BufferedWriter writer;private Scanner scanner;public BIOServer() {try {socket = new ServerSocket(port);scanner = new Scanner(System.in);} catch (IOException e) {e.printStackTrace();}}public void startSrever() {Socket clientSocket = null;try {while (true) {clientSocket = socket.accept();//不能写到循环里  会阻塞//阻塞方法:获取客户端socket的方法 这个socket是客户端与服务器完成连接建立之后得到的返回值//TCP三次握手  clientSocket是与建立好连接的客户端是一一对应的//所有的通信过程都是使用clientSocket//字节和字符的转换  转换流解决reader =new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));//输入流  接收数据writer = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));//输出流  发送数据的时候使用ServerRunnable runnable = new ServerRunnable(clientSocket, writer, reader, scanner);Thread mythread = new Thread(runnable);mythread.start();}} catch (IOException e) {e.printStackTrace();} finally {try {if (socket != null) {socket.close();socket = null;}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {new BIOServer().startSrever();}

NIO模型

NIO太多了下篇介绍~

【java网络】常用网络模型BIO相关推荐

  1. NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)

    1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...

  2. Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...

  3. 结合代码详细聊聊 Java 网络编程中的 BIO、NIO 和 AIO

    本文从操作系统的角度来解释BIO,NIO,AIO的概念,含义和背后的那些事.本文主要分为3篇. 第一篇 讲解BIO和NIO以及IO多路复用 第二篇 讲解磁盘IO和AIO 第三篇 讲解在这些机制上的一些 ...

  4. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  5. 【java网络编程】TCP三次握手、四次挥手,常见Socket通信BIO

    网络编程,网络通信 内容管理 TCP三次握手,四次挥手 TCP 建立连接 --- 三次握手 TCP断开 ---- 四次挥手 java网络IO BIO 同步阻塞 Socket通信模型 BIO网络通信De ...

  6. (转载)Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    转载请注明出处:http://blog.csdn.net/anxpp/article/details/51512200,谢谢! 本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解 ...

  7. Java开发数据库默认端口及网络常用端口号

    更多免费教学文章请关注这里 一 :Oracle 驱动:oracle.jdbc.driver.OracleDriver URL:jdbc:oracle:thin:@<machine_name> ...

  8. java网络编程之Socket编程

    概念 网络编程分为BIO(传统IO).NIO.AIO.Socket编程属于BIO这种传统IO. InetAddress java.net.InetAddress是JAVA中管理IP地址的类,常用 pu ...

  9. JavaSE学习笔记_20:Java网络编程

    Java网络编程     温馨提示1: (1)网络编程这一块会涉及到很多不同异常,得抛. (2)涉及到iO,还是按照iO的思想来解决问题. (3)接收端和发送端或者是服务端和客户端程序开启之后,两者的 ...

  10. 【Java基础】从Java语言层面理解BIO,NIO,AIO(二)

    文章目录 零.从网络层面理解BIO,NIO,AIO 一.相关概念 1.什么是socket? 2.IP地址(IP Address) 3.端口(Port) 4.协议(Protocol) 4.1.协议简介 ...

最新文章

  1. python3 time模块_python3 time模块
  2. 转:Jquery AJAX POST与GET之间的区别
  3. 1102: 火车票退票费计算(函数专题)
  4. 1109: 胥哥的DOTA-水题(直接做,时间也不超限)
  5. 信用卡的3种分期模式全面比较
  6. ZOJ 1450 Minimal Circle 点集的最小圆覆盖
  7. 【人脸识别】VGGFace2数据集介绍
  8. IBM x3650 光盘安装linux,IBM X3650 M3服务器安装SUSE LINUX 10实战
  9. 程序员编程知识经验总结
  10. for循环的嵌套,for循环的穷举迭代
  11. Oracle 11g RAC 安装数据库软件找不到节点的解决
  12. JavaScript设计模式之享元模式
  13. iphone双重认证关闭不了怎么办_怎么关闭iPhone双重认证?苹果手机关闭双重认证的两种操作方法 ... ......
  14. 如何制作显示歌手和歌名的CD、DTS-CD无损音乐碟片?
  15. 常见端口号一览(详细)
  16. Python+Appium实现京东双十一自动领金币
  17. 疯狂的麦克斯java游戏_疯狂的麦克斯
  18. 微分电路与积分电路分析
  19. ffmpeg使用filter生成H264测试视频(带时间戳OSD)
  20. 视频压缩编码基本原理

热门文章

  1. qt触摸屏隐藏鼠标指针
  2. java使用HttpURLConnection检索网站时403错误处理方式
  3. linux 内核死机 堆栈,高通平台Linux kernel死机解题心得
  4. Duplicate entry ‘‘ for key ‘Primary‘
  5. 获取开源医学文献图片(PubMed)制成数据集
  6. 【C语言】求球的表面积和体积
  7. Stealing Harry Potter‘s Precious BFS+DFS
  8. 如何让你得声音洪亮结实有磁性
  9. LeetCode 229 求众数 II
  10. 基于R的飞机航线数据可视化(卫星地图)