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

  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来分配,是不确定的,随机的

     

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件和用户管理

Linux基础 提示:个人学习总结,仅供参考。 一、Linux系统部署 二、服务器初始化 三、文件和用户管理 四、用户的权限 提示:文档陆续更新整理 文件和用户管理 Linux基础一、Linux目录结构二、文件管理1.文件类型2.文件管理命令 三、用户管理…

为什么医疗保健需要MFT来帮助保护EHR文件传输

毫无疑问,医疗保健行业需要EHR技术来处理患者,设施,提供者等之间的敏感患者信息。但是,如果没有安全的MFT解决方案,您将无法安全地传输患者文件,从而使您的运营面临遭受数据泄露,尴尬&#xff0…

如何平衡倾斜摄影的三维模型轻量化数据文件大小和质量效果?

如何平衡倾斜摄影的三维模型轻量化数据文件大小和质量效果? 倾斜摄影超大场景的三维模型数据文件大小的具体范围取决于多种因素,如原始数据的复杂度、轻量化处理的方式和压缩算法等。一般而言,经过轻量化处理后,数据文件大小可以减…

c/c++:栈帧,传值,传址,实参传值给形参,传地址指针给形参

c/c:栈帧,传值,传址,实参传值给形参,传地址指针给形参 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学&…

WuxioLin 反锯齿算法(反走样算法,Xiaolin Wu Anti-aliasing algorithm) C# 代码实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、锯齿和反锯齿二、Xiaolin Wu 算法代码1.C#完整代码如下2.举例和测试 总结 前言 笔者前几日自己写了个佳明手表表盘的的一个入门级App,模拟指针…

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

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

AD9208子卡设计资料: 2 路 2.6GSPS/3GSPS AD 采集、2 路 12.6G DA 回放、高性能时钟发生器HMC7044 -FMC 子卡模块

板卡概述 FMC123 是一款基于 FMC 标准规范,实现 2 路 14-bit、3GSPSADC 采集功能、2 路 16-bit 12.6GSPS 回放子卡模块。该模块遵循 VITA57.1 标准,可直接与 FPGA 载卡配合使用,板卡 ADC 器件采用 ADI 公司的 AD9208 芯片,&…

《中学科技》期刊简介及投稿邮箱

《中学科技》期刊简介及投稿邮箱 《中学科技》以传播科技知识、启迪智慧、培养才能为宗旨,提供电子技术、计算机、陆海空模型、数学、物理、化学、生物、天文等方面的科技活动资料,特别注意通过科学观察,实验和制作实践的途径,培…

CCGNet用于发现共晶材料中的coformer

共晶工程(cocrystal engineering)在制药,化学和材料领域有广泛应用。然而,如何有效选择coformer一直是一个挑战性课题。因此,作者开发了一个基于GNN的深度学习框架用于快速预测共晶的形成。为了从现有报告的6819个正样…

Java项目上线之云服务器环境篇(二)——Tomcat的安装与配置

Java项目上线之云服务器环境篇(二)——Tomcat的安装与配置 Tomcat的选择: 云服务器tomcat的选择最好与本机项目运行的tomcat版本号一致,避免一些不必要的问题。 配置步骤: 1、首先进入云服务器创建好放置tomcat的文件…

重大剧透:你不用ChatGPT,它砸你饭碗

早晨看到路透社报道,盖茨说,与其争论技术的未来,不如专注于如何更好地利用人工智能。 这可能是他对马斯克他们呼吁暂停AI研发6个月的一种回应吧。 有种古语说:天下大势,浩浩汤汤,顺之者昌,逆之者…

2023年Q1天猫空调品牌销量排行榜

如今,空调的普及水平较高,空调行业进入存量换新为主的发展阶段。 根据鲸参谋数据分析平台的相关数据显示,2023年Q1在天猫平台上,空调的销量将近100万件,销售额将近30亿,同时,空调产品的产品均价…

免费gpt-4-国内使用gpt-4

如何用上gpt-4 GPT-4尚未正式发布和公开,因此我们无法提供对GPT-4的具体使用方法。但是,可以从GPT-4的前一代——GPT-3的使用经验和GPT-4的预期功能来看,建议如下: 了解GPT-4的语言处理能力和适用场景:GPT-4预计将进一…

vue---组件逻辑复用方法:Mixin/HOC/Renderless组件

目录 1、Mixin 2、HOC 3、Renderless组件 下文通过表单校验来分别讲解Mixin/HOC/Renderless组件这三种方式。 1、Mixin 通过mixin将一个公用的validate函数同步到每一个组件中去 mixin使用详细介绍见:vue---mixin混入_maidu_xbd的博客-CSDN博客一个混入对象可…

SpringBoot实战(十六) 集成Hystrix

目录 一、简介1.Hystrix 的定义?2.Hystrix 的用处?3.Hystrix 的三种状态?4.Hystrix 解决什么问题?5.Hystrix 的设计原理?6.Hystrix 的实现原理? 二、集成 Hystrix1.Maven 依赖2.application.yml简易版&…

AutoGPT 安装指南,使用避坑要点

最近, AIGC 中最火的可能就当属于 AutoGPT 了吧,首先简单介绍一下AutoGPT 背景 AutoGPT 是基于 ChatGPT API 接口开发,项目首推 GPT-4 模型,但 OpenAI 账号 API 只有 gpt-3.5-turo 权限同样也可以使用。 项目在 github 上获取的…

【服务器数据恢复】重装系统导致分区无法访问的数据恢复案例

服务器数据恢复环境: 磁盘柜raid卡15块磁盘组建一组raid5磁盘阵列,划分2个lun; 上层操作系统划分若干分区,通过LVM扩容方式将其中一个分区加入到了root_lv中,其他分区格式化为XFS文件系统。 服务器故障: 为…

DFMEA 在车用燃料电池空压机设计中的应用

摘要: DFMEA在空压机研发中的应用 氢气具有资源丰富、热值高和无污染等特点,因而是燃料电池汽车最理想的二次能源。空压机作为燃料电池汽车的关键总成,掌握其核心部件的设计和制造技术非常必要。应用传统的设计方法进行相关零部件如空气轴承…

Reid之损失函数理论学习讲解

基于深度学习的Reid主要流程为输入图像-->CNN(提取特征)-->Global average pooling-->特征向量,将用这些特征来衡量图像的相似情况。并用这些特征进行检索,返回分类情况。 在训练网络的时候需要涉及损失函数,因此就引出了表征学习和…

2023年淮阴工学院五年一贯制专转本应用文写作考试大纲

2023年淮阴工学院五年一贯制专转本应用文写作考试大纲 一、考核对象 本课程的考核对象是五年一贯制高职专转本秘书学专业普通在校生考生。 二、考核目的 通过课堂教学,学生应当能够识记、理解和应用有关应用文写作的基本理论和基本技能。其中,识记指…