Java网络编程BIO/NIO

2023-11-10

Java网络编程

网络编程的基础知识

在这里插入图片描述

Socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。

我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。

短连接与长连接

短连接:

连接->传输数据->关闭连接

传统HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

长连接:

连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。

长连接指建立SOCKET连接后不管是否使用都保持连接。

什么时候用长连接,短连接?

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源。

网络通讯流程

在通信编程里提供服务的叫服务端,连接服务端使用服务的叫客户端。

在开发过程中,如果类的名字有Server或者ServerSocket的,表示这个类是给服务端容纳网络服务用的,如果类的名字只有Socket的,那么表示这是负责具体的网络读写的。那么对于服务端来说ServerSocket就只是个场所(娱乐场所),具体和客户端沟通的还是一个一个的socket(娱乐事件),所以在通信编程里,ServerSocket并不负责具体的网络读写,ServerSocket就只是负责接收客户端连接后,新启一个socket来和客户端进行沟通。这一点对所有模式的通信编程都是适用的。

在通信编程里,我们关注的其实也就是三个事情

1、连接(客户端连接服务器,服务器等待和接收连接)

2、读网络数据

3、写网络数据

所有模式的通信编程都是围绕着这三件事情进行的。服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。

JDK网络编程(BIO)

传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。代码如下:

public class BIOClient {
   
    public static void main(String[] args) {
   
        Socket client = new Socket();
        try {
   
            client.connect(new InetSocketAddress("127.0.0.1", 12345));
            System.out.println("客户端发送数据:");
            BufferedReader sys=new BufferedReader(new InputStreamReader(System.in));
            String msg = sys.readLine();
            BufferedWriter bo = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
            BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
            bo.write(msg);
            bo.newLine();
            bo.flush();
            msg = br.readLine();
            System.out.println("接受服务器消息:" + msg);
            bo.close();
            br.close();
        } catch (Exception e) {
   
            e.printStackTrace();
        }finally {
   
            try {
   
                client.close();
            } catch (IOException e) {
   
                e.printStackTrace();
            }
        }
    }
}
public class BIOServer {
   

    public static void main(String[] args) {
   
        try {
   
            ServerSocket ss = new ServerSocket(12345);

            System.out.println("服务端启动");

            while (true) {
   
                new Thread(new ServerTask(ss.accept())).start();
            }
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
}

class ServerTask implements Runnable {
   
    Socket socket;

    public ServerTask(Socket s) {
   
        this.socket = s;
    }

    @Override
    public void run() {
   
        try {
   
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(<
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java网络编程BIO/NIO 的相关文章

随机推荐

  • NexT主题进阶

    NexT 是 Hexo 框架中最为流行的主题之一 精于心 简于形 NexT 支持多种常见第三方服务 使用 第三方服务 来扩展站点的功能 除了 Markdown 支持的语法之外 NexT 借助 Hexo 提供的 tag 插件 为您提供在书写文
  • EDK2安装教程

    1 1基础搭建 相关文件请自行百度下载 1 安装VS2015到C盘 请勿修改默认目录 否则需要修改C edk2 Conf tools def txt 2 如安装包所示 安装python2 7到C盘并设置环境变量如下 3 将nasm解压到C
  • JavaScript-二分法详解

    文章目录 二分法 二分查找 非递归实现 二分查找 递归实现 二分排序 复杂度分析 推荐文章 经典例题 力扣习题 二分法 二分法又可以被称为二分查找 它描述了在有序集合中搜索特定值的过程 广义的二分查找是将问题的规模尽可能的缩小到原有的一半
  • win10,创建新环境并安装pytorch-gpu=1.7.0版本

    之前装过gpu版本tensorflow 包含cudatoolkit 10 1 创建新环境装gpu版本pytorch时考虑是否再装cudatoolkit 以下是没有再装cudatoolkit情况下 目前正常 文章目录 Anaconda 创建新
  • 图注意力网络(Graph Attention Network, GAT) 模型解读与代码实现(tensorflow2.0)

    前面的文章 我们讲解了图神经网络三剑客GCN GraphSAGE GAT中的两个 图卷积神经网络 GCN 理解与tensorflow2 0代码实现 GraphSAGE 模型解读与tensorflow2 0代码实现 本要讲的是GAT Grap
  • 解决Intellij IDEA maven 自动设置JDK为JDK1.5

    在idea中创建maven项目 每次更新或重新载入maven项目后 都会重新变成JDK1 5 就算手动设置maven项目或者模块JDK1 8 刷新后还是会变为JDK1 5 这是由于创建项目时没有指定jdk版本 而maven的默认jdk版本为
  • Oracle instr函数和sign函数详解

    1 instr 函数 俗称 字符查找函数 格式一 instr string1 string2 instr 源字符串 目标字符串 格式二 instr string1 string2 start position nth appearance
  • 目标检测YOLO实战应用案例100讲-基于改进YOLOv5的口罩人脸检测

    目录 前言 国内外研究现状 目标检测研究发展 国内外口罩人脸检测研究现状
  • Spring Swagger在nginx 二级url 无法正常使用问题解决

    问题描述 测试环境用了nginx做二级url做映射 但swagger的 http www xxx com 二级url v2 JSON里面的host地址还是一级目录 不自动对应nginx做了映射的二级url 因此使用swagger ui ht
  • CENTOS 下service network restart失败最全解决方案

    经常会有人在centOS 7下更改完静态ip后发现network服务重启不了 翻遍了网络 尝试了各种方法 终于解决了 现把各种解决方法归纳整理 希望能让大家少走点歪路 首先看问题 执行service network restart命令后出现
  • 五个温度带的分界线_寒带与温带的分界线是什么啊

    寒带与温带的分界线是什么啊2020 06 01 09 19 44文 钟诗贺 温带与寒带的分界线是 极圈 纬度 66 5 度 地球五带中 热带与温带的分界线是回归线 南北回归线 纬度是23 5度 南北纬23 5度 温带与寒带的分界线是极圈 南
  • 【ISP】光圈、焦距与景深的关系

    最直接的图 1 弥散圆 在焦点前后 光线开始聚集和扩散 点的影象变成模糊的 形成一个扩大的圆 这个圆就叫做弥散圆 现实当中 观赏拍摄的影象是以某种方式 比如投影 放大成照片等等 来观察的 人的肉眼所感受到的影象与放大倍率 投影距离及观看距离
  • ChatGPT4使用体验

    GPT火了很久 被各种媒体吹上了天 但是因为工作原因 一直没有机会去真正的尝试 最近终于有了一天的空闲时间 就想着好好看看GPT当前到底能干啥 如下是我针对不同类别 分别提出不同问题 GPT给的回答 如果有兴趣可以看看 1 定性问题 对于一
  • pandas.read_csv参数详解

    pandas read csv参数整理 读取CSV 逗号分割 文件到DataFrame 也支持文件的部分导入和选择迭代 更多帮助参见 http pandas pydata org pandas docs stable io html 参数
  • 带你学习STM32f1之蓝牙控制LED(简单入手,含主代码)

    目录 前言 一 蓝牙模块简介 二 代码部分详解 三 总结 题外话 前言 这次博文还是主要以STM32f103zet6小系统板来操作 依旧使用库函数入手 寄存器版本可能要到后续再做更新 因为我才刚开始入手寄存器不久 不是很熟练 还在熟悉哈哈
  • anaconda的python环境变量_装了anaconda之后如何设置anaconda、python环境变量

    装了anaconda之后如何设置anaconda python环境变量 1 装了anaconda之后如何设置anaconda环境变量 参考 https www cnblogs com avivi p 10282366 html 后面部分 2
  • python search group_python笔记52-re正则匹配search(group groups groupdict)

    前言 re search扫描整个字符串并返回第一个成功的匹配 re findall返回字符串中所有不重叠匹配项的列表 如果没有匹配到返回空list不会报错 search匹配对象有3个方法 group groups groupdict 这3个
  • BFS模板

    st u 1 标记 bfs u queue
  • leetcode-位运算

    通过位运算取出一个数字的二进制表示的每一位 从末位开始取 比如说 11 1011 所以依次取出末位1 然后是1 0 1 public class bit cal public static void main String args int
  • Java网络编程BIO/NIO

    Java网络编程 网络编程的基础知识 Socket Socket是应用层与TCP IP协议族通信的中间软件抽象层 它是一组接口 在设计模式中 Socket其实就是一个门面模式 它把复杂的TCP IP协议族隐藏在Socket接口后面 对用户来