通信网络-Socket、Java中的网络支持、多线程服务器

2023-05-16

前言

通信网络-Socket、Java中的网络支持、多线程服务器
场景:使用java网络创建一个聊天室
博客地址:芒果橙的个人博客

文章目录

    • 前言
    • 通信网络-Socket
      • TCP/IP
      • TCP/IP 模型
      • 端口
    • Java中的网络支持
      • 概念
      • 1. InetAddress
      • 2. URL
      • 3. Socket
      • 4. Datagram
    • 多线程服务器
      • 应用多线程来实现服务器与多客户端之间的通信

通信网络-Socket

两台计算机进行通信的条件: 有唯一的标识,表示所处的身份和所处的位置:IP地址 有共同的语言:协议 每台主机都有端口号,用来区分哪个应用在通信

TCP/IP

  • TCP/IP是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合
  • 也称:TCP/IP协议族、TCP/IP协议栈
  • TCP:Transmission Control Protocol ——传输控制协议
  • IP:Internet Protocol ——互联网协议

TCP/IP 模型

在这里插入图片描述

端口

  • 用于区分不同应用程序
  • 端口号范围为0~65535,其中0~1023为系统所保留
  • IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础

Java中的网络支持

概念

针对网络通信的不同层次,Java中提供的网络功能有四大类

  1. InetAddress:用于标识网络上的硬件资源
  2. URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
  3. Sockets:使用TCP协议实现网络通信的Socket相关的类
  4. Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信

1. InetAddress

  • 获取本地的InetAddress实例:InetAddress.getLocalHost()

  • 根据机器名获取InetAddress实例:InetAddress.getByName()

    InetAddress inetAddress = InetAddress.getLocalHost();
            System.out.println("IP地址:" + inetAddress.getHostAddress());
            System.out.println("计算机名:" + inetAddress.getHostName());
    
    InetAddress ia = InetAddress.getByName("NOD4AAITZWEN3FD");
            System.out.println("IP地址:" + ia.getHostAddress());
            System.out.println("计算机名:" + ia.getHostName());
    

2. URL

  1. Uniform Resource Locator——统一资源定位符,表示Internet上某一资源的地址
  2. 由两部分组成:协议名称和资源名称,冒号隔开
  • 创建URL实例:new URL()

    URL baidu = new URL("http://www.baidu.com");
            URL url = new URL(baidu,"/s?wd=什么是url");
            System.out.println("协议:" + url.getProtocol());  // http
            System.out.println("主机:" + url.getHost());      // www.baidu.com
            System.out.println("端口:" + url.getPort());      // -1 (未指定端口,则使用默认端口号,返回-1)
            System.out.println("查询字符串:" + url.getQuery());  // wd=什么是url
    

3. Socket

TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据

基于TCP协议实现网络通信的类

  • 客户端的Socket类
  • 服务端的ServerSocket类

基于tcp的socket模型

在这里插入图片描述

Socket和ServerSocket连接的实现步骤

  1. 创建ServerSocket和Socket
  2. 打开连接到Socket的输入/输出流
  3. 按照协议对Socket进行读/写操作
  4. 关闭输入输出流、关闭Socket
  • 创建服务端

    // 1.创建服务端
            ServerSocket server = new ServerSocket(8888);
            // 2.监听
            System.out.println("服务器启动中...");
            Socket socket = server.accept();
            // 3.获取输入流,读取客户端信息
            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String info;
            while ((info = bufferedReader.readLine()) != null) {
                System.out.println("接收到客户端信息:" + info);
            }
            // 4.关闭输入流和资源
            System.out.println("关闭服务端");
            socket.close();
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            socket.close();
            server.close();
    
  • 创建客户端

    // 1.创建客户端
            System.out.println("客户端启动中...");
            Socket client = new Socket("localhost",8888);
            // 2.获取输出流,向服务端发送信息
            OutputStream outputStream = client.getOutputStream();
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.write("我是客户端");
            printWriter.flush();
            // 3.关闭输出流和资源
            client.shutdownOutput();
            printWriter.close();
            outputStream.close();
            client.close();
    

4. Datagram

UDP协议——用户数据报协议,是无连接、不可靠、无序的,特点是速度比较快

进行数据传输时,首先将要传输的数据定义成数据报,在数据报中指明数据所要达到的Socket,然后再将数据报发送出去

TCP和UDP区别

TCPUDP
是否连接面向连接面向非连接
传输可靠性可靠不可靠
应用场合传输大量数据少量数据
速度
  • 创建服务端

    // 1.创建服务端
            System.out.println("服务端启动中...");
            DatagramSocket server = new DatagramSocket(8888);
            // 2.定义数据报
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
            // 3.接收数据
            //while (true) {
                server.receive(datagramPacket);
                // 4.读取数据
                String info = new String(datagramPacket.getData(),datagramPacket.getOffset(),datagramPacket.getLength(), StandardCharsets.UTF_8);
                System.out.println("接收到客户端信息:" + info);
                // 5.关闭资源
                server.close();
                System.out.println("服务端关闭...");
            //}
    
  • 创建客户端

    // 1. 定义发送数据
            String message = "我是客户端";
            byte[] bytes = message.getBytes(StandardCharsets.UTF_8);
            // 2. 创建数据报,包含发送的信息
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
            // 3. 创建Socket
            System.out.println("客户端启动...");
            DatagramSocket client = new DatagramSocket();
            // 4. 连接并发送
            client.connect(new InetSocketAddress("localhost",8888));
            client.send(datagramPacket);
            // 5. 关闭资源
            client.close();
    

多线程服务器

应用多线程来实现服务器与多客户端之间的通信

基本步骤

  1. 服务端创建ServerSocket,循环调用accept()等待客户端连接(死循环)
  2. 客户端创建一个Socket并请求和服务端连接
  3. 服务端接收客户端请求,创建Socket与该客户端建立连接
  4. 建立连接的两个socket在一个单独的线程中对话
  5. 服务端持续等待新的连接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通信网络-Socket、Java中的网络支持、多线程服务器 的相关文章

  • Spring三种配置方式

    Spring有以下几种常用的配置方式 1 基于xml的配置2 基于注解的配置3 基于Java的配置 1 基于xml的配置 在Spring1 x时代 xff0c 都是基于xml来进行配置 xff0c 用xml文件来管理bean之间的关系 现在
  • Synchronized同步静态方法和非静态方法总结

    1 Synchronized修饰非静态方法 xff0c 实际上是对调用该方法的对象加锁 xff0c 俗称 对象锁 Java中每个对象都有一个锁 xff0c 并且是唯一的 假设分配的一个对象空间 xff0c 里面有多个方法 xff0c 相当于
  • MySQL主从恢复(全量恢复数据)

    前言 当mysql主从 xff08 一主一从模式 xff09 数据不同步 xff0c 常规方式解决不掉 xff0c 故全量恢复数据并同步数据 发现问题 首先可以由mstaer status观察到主从已经未同步 xff0c 其次slave s
  • onNewIntent()的使用

    我对 onNewIntent 的理解 当我们由于某些原因 xff0c 可能会反复启动一个 Activity 时 xff0c 你可能会想不就是通过 startActivity intent xff0c 来启动嘛 xff0c 反复走 onCre
  • Vim使用教程(按键教程,映射都可以改的,持续更新)

    修改映射 tnvim vimrc 1 space 43 f 43 t 调出目录 2 control 43 h 跳到目录 3 control 43 l 跳到内容页 4 space 43 k 43 n 运行最近一个测试 5 space 43 k
  • SecureCRT自动保存日志设置

    嵌入式开发经常由于无法debug而只能使用串口打印日志的方式调试代码 xff0c SecureCRT支持 SSH2 Serial 等多种连接方式 xff0c 是嵌入式工程师开发必备工具之一 串口日志打印由于打印数量大 xff0c 经常会超过
  • 吐血安装pycocotools,VC++14.0 required

    前因 因为某些原因想试试看目标检测 xff0c 于是下载了RCNN xff0c 但是卡在了安装TensorFlow Object Detection API 这一步 网上在这一步翻车的人 不计其数 到了安装pycocotools总会报错 x
  • windows 任务栏点击无反应,电脑没有任务栏怎么办

    这次的问题是 xff1a windows 任务栏点击无反应 xff0c 电脑没有任务栏怎么办 xff1f 想必有很多人会出现鼠标点击任务栏没有任何反应 xff0c 但是点击界面中的其他窗口 xff0c 或者打开关闭软件都可以正常使用 第二种
  • hexo基础命令、组件及遇到的坑

    前言 日期 xff1a 2020 04 21 初始内容 xff1a 从0开始部署完成后需要关注的点 xff0c 遇到的坑是真坑 原文链接 xff1a http mangocheng com posts 9264c278 html博客地址 x
  • Vue基础—实践:模板语法、路由

    前言 Vue基础模板语法 xff1a 数据渲染 路由 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 一 模板语法 1 数据渲染 获取对象数据 span class token comment html sp
  • javaScript&ES6&jQuery

    前言 工作中学习和使用过程中遇到的开发问题和发现 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 一 原生js 1 新发现 删除对象属性 xff1a delete this object propertyNa
  • 算法_初级算法(字符串&排序)-Java实现

    前言 初始内容 xff1a 常见算法题 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 一 字符串 1 KMP算法 概念 xff1a 对字符串进行切割分组 xff08 前缀 后缀 xff09 xff0c 按顺
  • Git在IDEA中的基本操作

    前言 git的基本操作 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 一 简介 概念 xff1a 免费 开源的分布式版本控制系统特点 xff1a Git是一个开源的分布式版本控制系统 xff0c 可以有效
  • Vue基础—理论

    前言 Vue的一些理论点 xff0c 学习Vue的一些前置知识 更多可查看官方文档 xff1a Vue 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 一 介绍 1 概念 Vue是一套用于构建用户界面的渐进式
  • Android屏幕旋转180°的实现

    这次分享一个实现屏幕只能在竖直方向上旋转的功能 xff0c 开发相机的童鞋应该都会遇到屏幕旋转的问题 xff0c 一般都是横竖屏的切换 xff0c 布局变换 xff0c 生命周期问题啥的 xff0c 这些网上一搜一大堆的解决方案 xff0c
  • Sql语法-Oracle基础:增删改查

    前言 Oracle数据库通用的sql语法 xff1a 增删改查 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 一 Create 建表 用户 xff1b 授权 1 建表 create table 表名 列名称
  • 接口设计文档模板

    前言 后端接口设计文档 xff0c 个人认为需要告知接口调用者的内容 有助于分析开发功能 评估工作量 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 接口设计说明 xx系统 修改记录 本次修改记录 xff0c
  • 数据结构基础之数组&栈&队列&链表&二叉树&散列表&图

    前言 数据结构基础 xff1a 数组 栈 队列 链表 二叉树 散列表 图 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 1 概述 存储数据的空间排列查询数据的操作方式核心 xff1a 有效占用空间 查询数据
  • Java深入浅出之反射&集合&可见性&NIO

    前言 java的一些特性 集合框架概要 线程安全的可用性说明 NIO网络编程 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 一 特性 1 抽象类和接口的区别 定义 抽象类 xff1a 用abstract修饰
  • docker及docker-compose基础:安装、启动、dockerfile制作、常用命令

    前言 docker基础包含安装 启动 dockerfile 私有仓库建立 xff0c docker compose基础 xff0c 常用命令等 博客地址 xff1a 芒果橙的个人博客 http mangocheng com 一 基础 参考资

随机推荐