直接干代码,用BIO写一个Server端,然后使用telnet模拟客户端发送数据

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class BioServer {
public static void main(String[] args) throws IOException {
// 1.创建一个线程池
ExecutorService executorServices = Executors.newCachedThreadPool();
// 2. 创建一个ServerSocket服务端
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端启动成功!"); while (true) {
System.out.println("线程:" + Thread.currentThread().getId() + "-等待客服端连接。。。");
final Socket socket = serverSocket.accept(); // 如果没有客户端与server端建立连接,这里会一直阻塞
System.out.println("连接到一个客户端");
executorServices.submit(() -> bzHandler(socket));
}
} /**
* 业务方法,与客户端通信
*
* @param socket
*/
public static void bzHandler(Socket socket) {
try {
byte[] bytes = new byte[1024];
// 通过socket获取输入流
InputStream inputStream = socket.getInputStream(); // 循环读取输入流中的数据
while (true) {
System.out.println("线程:" + Thread.currentThread().getId() + "-等着读取客户端输入流中的内容。。。。");
int read = inputStream.read(bytes); //如果已经建立连接的客户端没有发送数据,这里会一直阻塞
if (read != -1) {
System.out.println(new String(bytes, 0, read));
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

(1)程序启动,控制台打印如下:

服务端启动成功!
线程:1-等待客服端连接。。。

说明主线程阻塞在accept()这句代码这儿了。。。

(2)使用telnet建立连接后(注意还没有send数据到服务端),控制台打印如下:

服务端启动成功!
线程:1-等待客服端连接。。。
连接到一个客户端
线程:1-等待客服端连接。。。
线程:11-等着读取客户端输入流中的内容。。。。
连接到一个客户端 : 很容易理解
线程:11-等着读取客户端输入流中的内容。。。。: 说明创建了一个线程去处理与客户端的连接,同时程序也卡在了 inputStream.read(bytes)这儿,阻塞了!
线程:1-等待客服端连接。。。: 说明主线程accept一个socket连接之后,在交给子线程处理后,主线程又阻塞在了accept()方法这儿。。。

(3)客户端发送数据到server端,控制台打印如下:
 
服务端启动成功!
线程:1-等待客服端连接。。。
连接到一个客户端
线程:1-等待客服端连接。。。
线程:11-等着读取客户端输入流中的内容。。。。
zhengqinfeng
线程:11-等着读取客户端输入流中的内容。。。。

前面的打印就不说了,

zhengqinfeng :说明server端接收到了client端发送过来的数据

线程:11-等着读取客户端输入流中的内容。。。。  : 说明子线程又阻塞到了read()方法处。。

   

(4) 再启一个client端 , 控制台打印如下:

服务端启动成功!
线程:1-等待客服端连接。。。
连接到一个客户端
线程:1-等待客服端连接。。。
线程:11-等着读取客户端输入流中的内容。。。。
zhengqinfeng
线程:11-等着读取客户端输入流中的内容。。。。
连接到一个客户端
3线程:1-等待客服端连接。。。
线程:12-等着读取客户端输入流中的内容。。。。

又是一个线程去处理新的连接  。。。

总结:

(1)BIO, 同步阻塞,主线程会阻塞,子线程同样也会阻塞。

(2)每一个客户端连接过来时,server端都会创建一个子线程去与之交互

补充: telnet发送请求

(1)telnet 127.0.0.1 8888

(2) ctrl+]

(3) send data

 
 

 

bio编程示例的更多相关文章

  1. Muduo 网络编程示例之零:前言

    陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/ ...

  2. Qt 5入门指南之Qt Quick编程示例

    编程示例 使用Qt创建应用程序是十分简单的.考虑到你的使用习惯,我们编写了两套教程来实现两个相似的应用程序,但是使用了 不同的方法.在开始之前,请确保你已经下载了QtSDK的商业版本或者开源版本,并且 ...

  3. 多线程异步编程示例和实践-Thread和ThreadPool

    说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...

  4. 多线程异步编程示例和实践-Task

    上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...

  5. EOS智能合约开发(四):智能合约部署及调试(附编程示例)

    EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...

  6. Java IO编程全解(二)——传统的BIO编程

    前面讲到:Java IO编程全解(一)——Java的I/O演进之路 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口 ...

  7. 多线程Java Socket编程示例

    package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...

  8. Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  9. [Python]Excel编程示例教程(openpyxl)

    1 前言(Preface) 博文背景:论文实验中有一大堆数据集需要观测其数据特征,通过人体肉眼,难以直观感受,故而准备通过生成Excel,可视化其评测数据. We know: Excel便于可视化分析 ...

随机推荐

  1. EDM设计案例分享:6款引人入胜的夏日邮件营销模板分享

    夏日酷暑,清凉如风.在这个假期,旅游行业.酒店.服饰等都推出不少的假期活动,吸引游者的到来.假日期间,让我们看看一些旅游业.品牌服装店和酒店是怎么做好电子邮件广告的.在此,Focussend精心为大家 ...

  2. UI自动化之特殊处理三(日期控件\表格\富文本)

    日期控件\表格\富文本也是一些常遇到的需要特殊处理的定位 目录 1.日期控件 2.表格 3.富文本 1.日期控件 第一种:输入框属性为:readonly="readonly" # ...

  3. 前端 CSS的选择器 高级选择器

    高级选择器分为: 后代选择器 儿子选择器 并集选择器 交集选择器 后代选择器 使用空格表示后代选择器.父元素的后代(包括儿子,孙子,重孙子) 后代选择器 在CSS中使用非常频繁 因为HTML元素可以嵌 ...

  4. python控制流-循环

    一.while循环语句 1.只要 while 语句的条 件为 True,while 子句中的代码就会执行. 2.while 语句总是包含下面几 部分: (1)关键字(2)条件(求值为 True 或 F ...

  5. vue项目 引入js文件

    例如我想将laydate.js引到vue项目中 将用到的js文件放到static文件夹内,在项目的根目录下的index.html内引入 <script src="static/js/l ...

  6. C# 数据类型之间的转换

    C数据类型转换 https://www.cnblogs.com/bluestorm/p/3168719.html 1 字符串解析为整数: a = int.Parse (Console.ReadLine ...

  7. <每日一题> Day5:简单递推两题

    原题链接 参考代码: #include <iostream> using namespace std; typedef long long ll; + ; ll dp[maxn]; int ...

  8. HDU-1181 变形课(多种方式,好题)

      首先想到的是并查集,然后WA...原因在这,我第一次敲的是Find(1) == Find(12)来作为可以成功的条件,实际上这样是不行的,比方说 bell 和 mail实际上是不满足条件的,可以理 ...

  9. hihocoder1954 : 压缩树

    传送门 首先求出缩一个点 $x$ 的贡献,就是缩 $x$ 的父亲的贡献加上 $x$ 的子树多减少的深度 假设此时缩父亲的贡献已经考虑过了,那么 $x$ 的子树多减少的深度就是子树的节点数 注意此时要满 ...

  10. c++知识点总结3

    http://akaedu.github.io/book/ week1 引用:相当于变量的别名.下面r和n就相当于同一回事 ; int &r=n; 引用做函数参数: void swap(int ...