网络基础,InetAddress,Socket,TCP,UDP

news2024/9/22 2:42:55
  1. 概念:两台设备之间通过网络实现数据运输
  2. 网络通信:将数据通过网络从一台设备传输到另一台设备
  3. java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信
  4. 网络:两台或多台设备通过一定物理设备连接起来构成了网络
  5. 根据网络的覆盖范围不同,对网络进行分类:
    1. 局域网:覆盖范围最小,仅仅覆盖一个教室或一个机房
    2. 城域网:覆盖范围较大,可以覆盖一个城市
    3. 广域网:覆盖范围最大,可以覆盖全国,甚至全球,万维网是广域网的代表。
  6. ip地址
    1.  IPV4和IPV6的区别,IPV4的地址分类的范围,8位二进制表示范围(0-255
  7. 域名,端口号
  8. 网络通信协议
  9. TCP和UDP
  10. InetAddress类
    1. package com.jshedu.api;
      import java.net.InetAddress;
      import java.net.UnknownHostException;
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 演示InetAddress 类的使用
       */
      public class API_ {
          public static void main(String[] args) throws UnknownHostException {
      
              //1. 获取本机的InetAddress 对象
              InetAddress localHost = InetAddress.getLocalHost();
              System.out.println(localHost);//DESKTOP-S4MP84S/192.168.12.1
      
              //2. 根据指定主机名 获取 InetAddress对象
              InetAddress host1 = InetAddress.getByName("DESKTOP-DFGSCKR");
              System.out.println("host1=" + host1);//DESKTOP-S4MP84S/192.168.12.1
      
              //3. 根据域名返回 InetAddress对象, 比如 www.baidu.com 对应
              InetAddress host2 = InetAddress.getByName("www.baidu.com");
              System.out.println("host2=" + host2);//www.baidu.com / 110.242.68.4
      
              //4. 通过 InetAddress 对象,获取对应的地址
              String hostAddress = host2.getHostAddress();//IP 110.242.68.4
              System.out.println("host2 对应的ip = " + hostAddress);//110.242.68.4
      
              //5. 通过 InetAddress 对象,获取对应的主机名/或者的域名
              String hostName = host2.getHostName();
              System.out.println("host2对应的主机名/域名=" + hostName); // www.baidu.com
      
          }
      }
      

      InetAddress的方法

  11. Socket

  12. TCP字节流编程
    1. 服务端设置一个等待连接的端口,用accept()方法接收客户端连接,客户端用Socket构造器提供ip地址和端口号去连接服务端。然后客户端通过getOutputStream()生成对象,该对象调用write()方法写入数据到数据通道。服务端通过getInputStream()生成对象,调用read()方法读取客户端写入到数据通道的数据。
    2. package com.jshedu.socket;
      
      import java.io.IOException;
      import java.io.InputStream;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 服务端
       */
      public class SocketTCP01Server {
          public static void main(String[] args) throws IOException {
              //思路
              //1. 在本机 的9999端口监听, 等待连接
              //   细节: 要求在本机没有其它服务在监听9999
              //   细节:这个 ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器的并发]
              ServerSocket serverSocket = new ServerSocket(9999);
              System.out.println("服务端,在9999端口监听,等待连接..");
              //2. 当没有客户端连接9999端口时,程序会 阻塞, 等待连接
              //   如果有客户端连接,则会返回Socket对象,程序继续
      
              Socket socket = serverSocket.accept();
      
              System.out.println("服务端 socket =" + socket.getClass());
              //
              //3. 通过socket.getInputStream() 读取客户端写入到数据通道的数据, 显示
              InputStream inputStream = socket.getInputStream();
              //4. IO读取
              byte[] buf = new byte[1024];
              int readLen = 0;
              while ((readLen = inputStream.read(buf)) != -1) {
                  System.out.println(new String(buf, 0, readLen));//根据读取到的实际长度,显示内容.
              }
              //5.关闭流和socket
              inputStream.close();
              socket.close();
              serverSocket.close();//关闭
      
          }
      }
      
    3. package com.jshedu.socket;
      
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.InetAddress;
      import java.net.Socket;
      import java.net.UnknownHostException;
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 客户端,发送 "hello, server" 给服务端
       */
      public class SocketTCP01Client {
          public static void main(String[] args) throws IOException {
              //思路
              //1. 连接服务端 (ip , 端口)
              //解读: 连接本机的 9999端口, 如果连接成功,返回Socket对象
              Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
              System.out.println("客户端 socket返回=" + socket.getClass());
              //2. 连接上后,生成Socket, 通过socket.getOutputStream()
              //   得到 和 socket对象关联的输出流对象
              OutputStream outputStream = socket.getOutputStream();
              //3. 通过输出流,写入数据到 数据通道
              outputStream.write("hello, server".getBytes());
              //4. 关闭流对象和socket, 必须关闭
              outputStream.close();
              socket.close();
              System.out.println("客户端退出.....");
          }
      }
      

      注意要关闭流对象和socket

    4.  双向传输信息

      1. package com.jshedu.api;
        
        import java.io.*;
        import java.net.ServerSocket;
        import java.net.Socket;
        
        /**
         * @author Mr.jia
         * @version 1.0
         */
        @SuppressWarnings({"all"})
        public class SocketServe {
            public static void main(String[] args) throws IOException {
                //设置端口号返回ServerSocket对象
                ServerSocket serverSocket = new ServerSocket(9999);
                //使用accept()方法接收
                System.out.println("服务端,在9999端口监听,等待连接...");
                Socket accept = serverSocket.accept();
                //读取数据通道的数据然后输出在显示台
                InputStream inputStream = accept.getInputStream();
                //使用IO流输出
                byte[] bytes = new byte[1024];
                int readLine = 0;
                while((readLine=inputStream.read(bytes))!=-1){
                    System.out.println(new String(bytes,0,readLine));
                }
                //写入数据到数据通道
                OutputStream outputStream = accept.getOutputStream();
                outputStream.write("hello,client".getBytes());
                //结束标记
                accept.shutdownInput();
        
        
                //关闭流
                inputStream.close();
                outputStream.close();
                accept.close();
                serverSocket.close();
        
        
        
            }
        }
        
        package com.jshedu.api;
        
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.OutputStream;
        import java.net.InetAddress;
        import java.net.Socket;
        import java.net.UnknownHostException;
        
        /**
         * @author Mr.jia
         * @version 1.0
         */
        @SuppressWarnings({"all"})
        public class SocketClient {
            public static void main(String[] args) throws IOException {
                //要连接的端口号
                Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
                //得到输入流对象
                OutputStream outputStream = socket.getOutputStream();
                //写入数据
                outputStream.write("hello server".getBytes());
                socket.shutdownOutput();
                //读取数据
        
                InputStream inputStream = socket.getInputStream();
                //使用IO流输出
                byte[] bytes = new byte[1024];
                int readLine = 0;
                while((readLine=inputStream.read(bytes))!=-1){
                    System.out.println(new String(bytes,0,readLine));
                }
        
                //关闭流
                outputStream.close();
                socket.close();
                inputStream.close();
                System.out.println("客户端退出");
        
            }
        }
        
    5. 使用字符流

       

      package com.jshedu.api;
      
      import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      /**
       * @author Mr.jia
       * @version 1.0
       */
      @SuppressWarnings({"all"})
      public class SocketServe {
          public static void main(String[] args) throws IOException {
              //设置端口号返回ServerSocket对象
              ServerSocket serverSocket = new ServerSocket(9999);
              //使用accept()方法接收
              System.out.println("服务端,在9999端口监听,等待连接...");
              Socket accept = serverSocket.accept();
              //读取数据通道的数据然后输出在显示台
              InputStream inputStream = accept.getInputStream();
              //使用IO流输出,使用字符流
              BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
              String s = bufferedReader.readLine();
              System.out.println(s);
      
      
              //写入数据到数据通道
              OutputStream outputStream = accept.getOutputStream();
              //使用字符输出流的方式回复信息
              BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
              bufferedWriter.write("hello client 字符流");
              //结束标记
              bufferedWriter.newLine();//插入一个换行符,表示回复内容的结束
              bufferedWriter.flush();//注意需要手动的flush
      
      
      
      
              //关闭流
              bufferedReader.close();
              bufferedWriter.close();
              accept.close();
              serverSocket.close();
      
      
      
          }
      }
      
      package com.jshedu.api;
      
      import java.io.*;
      import java.net.InetAddress;
      import java.net.Socket;
      import java.net.UnknownHostException;
      
      /**
       * @author Mr.jia
       * @version 1.0
       */
      @SuppressWarnings({"all"})
      public class SocketClient {
          public static void main(String[] args) throws IOException {
              //要连接的端口号
              Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
              //得到输入流对象
              OutputStream outputStream = socket.getOutputStream();
      
              //写入数据,使用字符流
              BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
              bufferedWriter.write("hello server 字符流");
              bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束
              //注意要求对方使用readLine()!!!
              bufferedWriter.flush();//如果使用的字符流,需要手动刷新,否则数据不会写入数据通道
              socket.shutdownOutput();
      
      
              //读取数据
              InputStream inputStream = socket.getInputStream();
              //使用IO流输出
              BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
              String s = bufferedReader.readLine();
              System.out.println(s);
      
      
              //关闭流
              bufferedReader.close();
              socket.close();
              bufferedWriter.close();
              System.out.println("客户端退出");
      
          }
      }
      

      注意字节流转换成字符流,结束标记,flush

  13. 传输图片/音乐

    1. package com.hspedu.upload;
      
      import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 文件上传的服务端
       */
      public class TCPFileUploadServer {
          public static void main(String[] args) throws Exception {
      
              //1. 服务端在本机监听8888端口
              ServerSocket serverSocket = new ServerSocket(8888);
              System.out.println("服务端在8888端口监听....");
              //2. 等待连接
              Socket socket = serverSocket.accept();
      
      
              //3. 读取客户端发送的数据
              //   通过Socket得到输入流
              BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
              byte[] bytes = StreamUtils.streamToByteArray(bis);
              //4. 将得到 bytes 数组,写入到指定的路径,就得到一个文件了
              String destFilePath = "src\\abc.mp4";
              BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
              bos.write(bytes);
              bos.close();
      
              // 向客户端回复 "收到图片"
              // 通过socket 获取到输出流(字符)
              BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
              writer.write("收到图片");
              writer.flush();//把内容刷新到数据通道
              socket.shutdownOutput();//设置写入结束标记
      
              //关闭其他资源
              writer.close();
              bis.close();
              socket.close();
              serverSocket.close();
          }
      }
      
    2. package com.hspedu.upload;
      
      import java.io.*;
      import java.net.InetAddress;
      import java.net.Socket;
      
      
      /**
       * @author 韩顺平
       * @version 1.0
       * 文件上传的客户端
       */
      public class TCPFileUploadClient {
          public static void main(String[] args) throws Exception {
      
              //客户端连接服务端 8888,得到Socket对象
              Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
              //创建读取磁盘文件的输入流
              //String filePath = "e:\\qie.png";
              String filePath = "e:\\abc.mp4";
              BufferedInputStream bis  = new BufferedInputStream(new FileInputStream(filePath));
      
              //bytes 就是filePath对应的字节数组
              byte[] bytes = StreamUtils.streamToByteArray(bis);
      
              //通过socket获取到输出流, 将bytes数据发送给服务端
              BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
              bos.write(bytes);//将文件对应的字节数组的内容,写入到数据通道
              bis.close();
              socket.shutdownOutput();//设置写入数据的结束标记
      
              //=====接收从服务端回复的消息=====
      
              InputStream inputStream = socket.getInputStream();
              //使用StreamUtils 的方法,直接将 inputStream 读取到的内容 转成字符串
              String s = StreamUtils.streamToString(inputStream);
              System.out.println(s);
      
      
              //关闭相关的流
              inputStream.close();
              bos.close();
              socket.close();
      
          }
      
      
      }
      
    3. package com.hspedu.upload;
      
      import java.io.BufferedReader;
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      
      /**
       * 此类用于演示关于流的读写方法
       *
       */
      public class StreamUtils {
      	/**
      	 * 功能:将输入流转换成byte[]
      	 * @param is
      	 * @return
      	 * @throws Exception
      	 */
      	public static byte[] streamToByteArray(InputStream is) throws Exception{
      		ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
      		byte[] b = new byte[1024];
      		int len;
      		while((len=is.read(b))!=-1){
      			bos.write(b, 0, len);	
      		}
      		byte[] array = bos.toByteArray();
      		bos.close();
      		return array;
      	}
      	/**
      	 * 功能:将InputStream转换成String
      	 * @param is
      	 * @return
      	 * @throws Exception
      	 */
      	
      	public static String streamToString(InputStream is) throws Exception{
      		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      		StringBuilder builder= new StringBuilder();
      		String line;
      		while((line=reader.readLine())!=null){ //当读取到 null时,就表示结束
      			builder.append(line+"\r\n");
      		}
      		return builder.toString();
      		
      	}
      
      }
      
  14. 当客户端连接服务端后,实际上客户端也是通过一个端口和服务端进行通讯的,这个端口号TCP/IP来分配,是不确定的,随机的

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go1.20环境安装以及beego框架配置

打开网址下载安装包选择对应安装包来下载安装(个人是windows,下载的1.20.3版本) 默认情况下会安装在C盘,但是我安装在了D盘目录 根据安装提示一步步next,直至完成 go get 在1.18版本之后就弃掉了,换成了install 配置自己的work…

Spring Cloud Alibaba全家桶——微服务链路追踪SkyWalking

前言 本文小新为大家带来 微服务链路追踪SkyWalking 相关知识,具体内容包括SkyWalking简介,SkyWalking环境搭建部署,SkyWalking接入微服务,SkyWalking持久化跟踪数据,自定义SkyWalking链路追踪,SkyWalking集…

ARM相关重点

一、概念: 指令:就是一条汇编指令 指令集:很多条汇编指令的集合 架构:随着ARM产品的迭代升级,对ARM指令集的命名 armv1~armv6已经淘汰 armv7~armv8市面正在使用的 armv9:2021年刚上市 内核:根据不同的a…

SpringCloud分布式请求链路跟踪——Sleuth

Sleuth 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 随着微服务越来越多,可能会出现A调B,B调C、D等多重调用的情况,出现问题不易排查。 Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案&#xff0c…

软件测试高频面试题【附答案解析】

面试指导 软件测试理论刷题篇mysql数据库刷题库linux操作系统刷题篇软件测试工程师面试篇 一. 软件测试理论刷题篇 1.软件测试的意义是什么? 思路:什么是软件测试→软件测试的含义 什么是软件测试:在规定的条件下对程序进行操作&#xf…

【错误:A component required a bean of type ‘xxx‘ that could not be found.解决办法】

在学谷粒商城项目的时候出现了以下问题: *************************** APPLICATION FAILED TO START *************************** Description: A component required a bean of type org.redisson.Redisson that could not be found. Action: Consider defining a…

优思学院|西门子精益六西格玛的历程

最新阅读了一份案例报告,报告中仔细研究了西门子公司实施精益六西格玛的历程,也谈到它们利用了线上课程后,取得了更大的成功。 2014年,西门子工业自动化部门(IA)的高管们认识到他们必须采取措施来加强内部效…

English Learning - L2 第 16 次小组纠音 弱读和语调 2023.4.22 周六

English Learning - L2 第 16 次小组纠音 弱读和语调 2023.4.22 周六 共性问题help /help/ 中的 e 和 lsorry /ˈsɒri/ 中的 ɒ 和 ilook out /lʊk aʊt/ 中的 ɒ 和 aʊdont /dəʊnt/ 中的 əʊemergency /ɪˈmɜːʤənsɪ/ 中的 ɜːname /neɪm/ 中的 eɪright /raɪt/…

甘肃vr全景数字化展厅提高企业品牌认知度和销售效果

相比传统式展厅给观众们呈现的是静态的视觉体会,缺乏实时交互水平。而720VR全景虚拟展厅能够提供高度真实的展览体验,融合视、听、触等各种感官享受,带来颠覆的沉浸式体验。 即便社恐的你也能在虚拟现实的世界游刃有余,想看哪里点…

flutter protobuf插件的安装和使用

1.安装插件 2.在pubspec.yaml添加插件 protobuf: ^2.1.0protoc_plugin: ^20.0.13.安装protoc brew install protobuf检查是否安装成功 protoc --version4.安装dart brew tap dart-lang/dart brew install dartdart 安装好后,就有pub命令了。输入dart 命令行 和d…

【Linux】Linux背景常见的基本指令

文章目录 一、Linux背景二、Linux下基本指令ls 指令pwd 命令cd 指令tree 指令touch 指令mkdir 指令rmdir 指令rm 指令man 指令cp 指令mv 指令cat 指令more 指令less 指令head 指令tail 指令date 指令cal 指令find 指令grep 指令zip 指令unzip 指令tar 指令bc 指令uname 指令重要…

uniapp初始环境搭建,出于猎奇,也出于热爱编程

1 安卓环境 官方文档有些看不懂,这里还是自己写一下,毕竟我已经不想在回来带angular了,还是使用vue3吧,年纪打了,没用的知识学多了也是浪费时间。出于猎奇,也出于热爱编程。 1.1 生成签名证书 Android平台签…

linux系统启动过程与0号和1号进程

讲到linux 0号进程和1号进程就涉及到linux 系统的启动,我们就从linux启动过程开始。 1、linux 启动整体过程 当系统第一次启动或重启的时候,处理器将执行一个已知地方的代码。对应个人电脑,这个地方是存在主板上内存内的BIOS 当一个启动设备…

元宇宙的应用领域

应用领域一:游戏 1.游戏是最先成长起来的元宇宙场景。虚拟社交身份、开放性、经济系统、沉浸感、世界可持续性是元宇宙游戏需关注的五大特征。 2.元宇宙游戏依然是游戏,现阶段参与元宇宙游戏的主要是游戏爱好者。新的概念依旧需要好的游戏产品支撑。团…

一步搞定IP地址查询:这个在线工具帮你快速掌握设备的位置信息!

前言 今天分享一个免费的在线工具来查询IP地址所在的地理位置。可以通过IP地址所属的网络运营商和其他相关信息来确定设备的位置,包括国家、地区、城市和经纬度等信息。 Ip-API 官网地址: https://ip-api.com/ 使用示例 该工具除了提供界面查询,还贴心…

实验4 RHEL安装和管理软件

老师给的步骤: 从光盘安装软件:1.在虚拟机指定光盘镜像文件2.右下角图标,连接光驱3.挂在光驱 4.检查yum配置文件有没有? baseurl是否一致。 配置在/etc/yum.repos.d目录中5.yum install httpd -y6.启动httpd, systemct…

Nodejs快速搭建简单的HTTP服务器,并发布公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 转载自内网穿透工具的文章:使用Nodejs搭建HTTP服务,并实现公网远程访问「内网穿透」 前言 Node.js…

链表篇总结

移除链表元素: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 思路: 这里以链表 1 4 2 4 来举例,移除元素4。 那么因为单链表的特殊性,只…

远程桌面连接不上是什么原因?怎么解决

如何解决远程桌面连接不上的问题? 远程桌面是一种非常方便的远程访问工具,允许用户在不同的地方通过网络访问其他计算机的桌面界面。但有时你可能会遇到远程桌面无法连接的问题。此时,您需要采取一些措施来解决这个问题。在本文中&#xff0…

走进小程序【十一】微信小程序【使用Echarts 和 腾讯地图】

文章目录 🌟前言🌟效果展示🌟使用Echarts🌟Echarts官网🌟体验示例小程序🌟下载🌟引入组件🌟创建图表🌟暂不支持的功能 🌟使用地图🌟map组件&#…