java学习----网络编程

news2024/10/2 3:32:11

网络编程入门

在这里插入图片描述

网络编程概述

计算机网络

​ 计算机网络是指地理位置不同的具有独立功能的计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理协调下,实现资源共享和信息传递的计算机系统。

​ (客户端和服务器通过互联网连接起来实现资源共享和信息传递)

网络编程

网络编程

​ 在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换。

网络编程的三要素

IP地址

​ 要想让网络中的计算机能够相互通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机和识别发送的计算机,IP地址就是标识号,也就是设备的标识。

端口:端口号是可以唯一表示设备中的应用程序

协议:通过计算机网可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,他对数据的传输格式,传输速率,传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换,常见的协议有UDP协议和TCP协议。

IP地址

网络中设备的唯一标识

IP地址分两大类

  1. IPv4

    是给每个连接在网络上的主机分配一个32bit的地址,按照TCP/IP规定,ip地址用二进制来表示是,每个地址 长32bit,也就是四个字节.为了使用方便,IP地址常被写成十进制的形式,中间有都好分割不同的字节,这种表示方法叫做点分十进制表示法。

  2. IPv6

    由于互联网发展,IP地址需求量增大,网络地址数量有限,为了扩大地址空间,通过IPv6重新定义地址空间,采用128位的地址长度,每16个字节一组,分成8组十六进制数,这样就解决了网络地址资源数量不够的问题

常用命令

ipconfig:查看本机IP地址

ping ip地址:检查网络是否连通

特殊的IP地址

127.0.0.1:是霍总地址,可以代表本机地址,一般用来测试

InetAddress的使用

​ InetAddress表示Internet协议(IP)地址

​ 使用方式代码如下

   public static void main(String[] args) throws UnknownHostException {
        InetAddress address = InetAddress.getByName("192.168.137.1");

        //获取IP地址的主机名
        String name = address.getHostName();
        //返回文本显示的IP地址字符串
        String hostAddress = address.getHostAddress();
        System.out.println("主机名:"+name);
        System.out.println("ip地址:"+hostAddress);

    }

端口

端口:设备上应用程序的唯一标识

端口号:用两个字节表示的整数,他的取值范围是065535.其中,01023之间的端口号用于一些知名

网络服务和应用,普通应用程序需要使用1024以上的端口号。如果端口号被另一个服务或应用占用。会导致当前程序启动失败。

协议

协议:计算机网络中,连接和通信的规则被称为网络通信协议

UDP协议
  • 用户数据报协议(User Datagram Protocol)

  • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另一台计算机发送数据时,发送端不会去确认接收端是否存在,就会发送出数据,同样接受端在接受到数据是,也不会向发送端反馈是否收到数据

    由于使用UDP协议消耗较小,通信效率高,所以通常会用于音频,视频和普通数据的传输。

  • 例如视频会议一般采用UDP协议,因为这种情况即使偶尔丢失一两个数据包。也不会对数据结果产生影响。但是在使用UDP协议传输数据时,由于UDP协议的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。

TCP协议
  • 传输控制协议(Transmission Control Protocol)
  • TCP协议是面向连接的协议,即传输数据之前,在发送端和接收端建立逻辑联系,然后再传输数据。它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器,由客户端向服务端发出连接请求,每次连接的创建都需要经过三次握手
  • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠性。
    • 第一次握手:客户端向服务器端发出连接请求,等待服务器确认。
    • 第二次握手:服务器端向客户端会送一个响应 ,通知客户端收到了连接请求
    • 第三次握手,客户端再次向服务器端发送确认信息,确认连接
  • 完成 三次握手,建立连接后,客户端和服务器端可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全性,所以应用十分广泛,例如上传文件,下载文件,浏览网页等。

UDP通信程序

UDP通信原理

UDP协议是一种不可靠的网络协议,它在网络的两端个简历一个Socket对象.但是这两个Socket只是发送,接受数据的对象.因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念.

Java 提供了DatagramSocket类作为基于UDP协议的Socket.

UDP发送数据

发送数据的步骤

  1. 创建发送端的Socket对象(DatagramSocket)
  2. 创建数据并把数据打包
  3. 调用DatagramSocket对象发送数据
  4. 关闭发送端
 public static void main(String[] args) throws IOException {
        //创建Socket对象
        DatagramSocket ds=new DatagramSocket();

        //创建数据,并把数据打包
        //DatagramPacket​(byte[] buf, int length, InetAddress address,
        // int port) 构造一个数据包,
        // 发送长度为 length的数据包到指定主机上的指定端口号。
        byte[] bys="超级喜欢菲菲".getBytes();
        int length=bys.length;
        InetAddress inetAddress = InetAddress.getByName("192.168.37.1");
        int port=10087;
        DatagramPacket dp=new DatagramPacket(bys,length,inetAddress,port);
        //调用DatagramSocket对象的方法发送数据
        //void send(DatagramPacket p) 从此套接字发送数据报包。
        ds.send(dp);
        //关闭发送端
        //void close() 关闭此数据报套接字。
        ds.close();
    }
UDP接收数据

UDP接收数据的步骤

  1. 创建接收数据端DatagramSocket对象
  2. 创建一个数据包,用于接收数据
  3. 调用DatagramSocket对象的方法接收数据
  4. 解析数据包,并把数据在控制台上显示
  5. 关闭接收端

TCP通信程序

TCP通信协议是一种可靠的网络协议,他在通信的两端个简历一个Socket对象,从而在通信的两端形成虚拟链路。

一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟的链路进行通信。

Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表连段的通信端口,并通过Socket产生的IO流来进行网络通信

Java为客户端童工了Socket类,为服务提供了ServerSocket类

TCP发送数据

发送数据步骤

  1. 创建客户端的Socket对象
  2. 获取输出流,写数据
  3. 释放资源
 public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象
        //Socket()InetAddress address.int port)创建流套接字并将其链接到指定的IP地址的指定端口号
        //Socket s=new Socket(InetAddress.getByName("192.168.43.240"),10001);
        Socket s=new Socket("192.168.43.1",10086);

        //获取数据流,写数据
        OutputStream os = s.getOutputStream();
        os.write("Mulujet".getBytes());

        //释放资源
        s.close();
    }
TCP接收数据

接受数据的步骤

  1. 创建服务器端的Socket对象

  2. 监听客户端连接,并返回一个Socket对象

  3. 获取输入流,读数据,并把数据显示在控制台

  4. 释放资源

    public static void main(String[] args) throws IOException {
            //创建服务区端Socket对象
            ServerSocket ss=new ServerSocket(10086);
    
            //监听发送端
            Socket s = ss.accept();
            //读数据,并显示在控制台
            InputStream is = s.getInputStream();
            byte [] bys=new byte[1024];
            int len=is.read(bys);
            String data=new String(bys,0,len);
            System.out.println("数据是:"+data);
    
            //释放资源
            s.close();
            ss.close();
    
        }
    

TCP通信程序的练习

package practise1.Demo5;

import java.io.*;
import java.net.Socket;

public class ServerThread implements Runnable {
    private Socket s;

    int count=0;

    public ServerThread(Socket s) {
        this.s=s;
    }

    @Override
    public void run() {

        //接收数据写道文本文件
        try {
            BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
            //BufferedWriter bw=new BufferedWriter(new FileWriter(file));
            File file=new File("E:\\Java\\IP\\src\\practise1\\Demo5\\123["+count+"].java");
            while(file.exists()){
                count++;
                 file=new File("E:\\Java\\IP\\src\\practise1\\Demo5\\123["+count+"].java");
            }
            BufferedWriter bw=new BufferedWriter(new FileWriter(file));

            String line;
            while((line=br.readLine())!=null){
                bw.write(line);
                bw.newLine();
                bw.flush();
            }

            //给出反馈
            BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bwServer.write("文件上传成功");
            bwServer.newLine();
            bwServer.flush();
            s.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }


    }
}


package practise1.Demo5;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(10098);
        while(true){
            //监听客户端连接
            Socket s = ss.accept();
            //为每一个客户端开启一个线程
            new Thread(new ServerThread(s)).start();
        }




    }
}


package practise1.Demo5;

import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket("192.168.137.1",10098);
        String file="E:\\Java\\IP\\src\\practise1\\UDPReceiveDemo.java";
        //封装文本文件数据
        BufferedReader br=new BufferedReader(new FileReader(file));
        //封装输出流写数据
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        s.shutdownOutput();

        //接收反馈
        BufferedReader brClient=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String data=brClient.readLine();
        System.out.println("服务器的反馈:"+data);

        //释放资源
        br.close();
        s.close();
    }
}

连接:三次握手

取消连接:四次挥手

服务器端的优化

  1. 用循环优化
  2. UUID 不可变的通用唯一标识符的类
  3. 线程
  4. 线程池
package practise2.ThreadPool;

import java.io.*;
import java.net.Socket;

//将本地文件上传到服务器,接收服务器的反馈
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("172.18.45.241",10098);
        //是本地的流,用来读取本地文件的
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\Users\\QQ363\\Desktop\\1.jpg"));

        //写到服务器中要用网络的流
        OutputStream os = socket.getOutputStream();
        //包装提高效率
        BufferedOutputStream bos=new BufferedOutputStream(os);

        int b;
        while ((b=bis.read())!=-1){
            bos.write(b);//通过网络写到服务器中
        }
        //给服务器一个结束标识,文件已经传输
        socket.shutdownOutput();

        //接受反馈
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
        socket.close();
        bis.close();
        socket.close();



    }
}




package practise2.ThreadPool;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

//接收客户端上传的问价你,上传完毕之后给出反馈
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(10098);
        //创建线程池
        ThreadPoolExecutor pool=new ThreadPoolExecutor(
                3, //核心线程数量
                10,//线程池的总数量
                60,//临时线程空闲时间
                TimeUnit.SECONDS,//单位
                new ArrayBlockingQueue<>(5),//阻塞队列
                Executors.defaultThreadFactory(),//创建线程的方式
                new ThreadPoolExecutor.AbortPolicy()//任务拒绝策略
        );
       while(true) {
           Socket accept = ss.accept();
           SocketThread st=new SocketThread(accept);
           pool.submit(st);
       }


    }
}



package practise2.ThreadPool;

import java.io.*;
import java.net.Socket;
import java.util.UUID;


public class SocketThread implements Runnable{
    private Socket accept;
    public SocketThread(Socket accept) {
        this.accept=accept;
    }

    @Override
    public void run() {
        BufferedOutputStream bos=null;
        try {

            //网络中的流,从客户端读取数据
            BufferedInputStream bis=new BufferedInputStream(accept.getInputStream());
            //本地的IO流,把数据写到本地中,实现永久化储存
            bos=new BufferedOutputStream(new FileOutputStream("E:\\Java\\IP\\src\\practise2\\demo2\\"+ UUID.randomUUID().toString()+".jpg"));

            int b;
            while((b=bis.read())!=-1){
                bos.write(b);
            }

            //给出反馈
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
            bw.write("上传成功!");
            bw.newLine();
            bw.flush();


        } catch (IOException e) {
            throw new RuntimeException(e);

        }finally {
            if (bos!=null){
                try {
                    bos.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (accept!=null){
                try {
                    accept.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

        }
    }
}


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

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

相关文章

如何在CSDN中使用ChatGPT

简介ChatGPT是OpenAI公司开发的一种大型语言模型。它是一种基于Transformer架构的深度学习模型&#xff0c;可以对语言进行建模和生成。它可以处理问答、对话生成、文本生成等多种任务。它诞生于2018年&#xff0c;并在随后的几年里不断改进和提高。OpenAI是一家人工智能研究实…

微服务项目【分布式锁】

创建Redisson模块 第1步&#xff1a;基于Spring Initialzr方式创建zmall-redisson模块 第2步&#xff1a;在zmall-redisson模块中添加相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</a…

java程序设计-ssm博客管理系统

博客管理系统是一个用于创建、管理和发布博客文章的应用程序。它通常包括一个后台管理界面&#xff0c;用于管理用户、文章、评论、标签等数据。同时&#xff0c;它还包括一个前端界面&#xff0c;用于展示博客文章并提供交互功能&#xff0c;例如评论和分享。 博客管理系统可…

Linux/Ubuntu安装部署Odoo15仓管系统,只需不到十步---史上最成功

sudo apt-get update sudo apt install postgresql -y sudo apt-get -f install sudo dpkg -i /home/ubuntu/odoo_15.0.latest_all.deb —报错再次执行上一条命令再执行 —安装包地址&#xff1a;http://nightly.odoo.com/15.0/nightly/deb/–翻到最下面 sudo apt-get ins…

NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016

然后我们开始来搭建nifi集群,可以看到之前我们上传上来的安装包 然后我们因为当前目录有了,我先去解压到其他目录 这里解压到/export/soft下面去 然后进去soft去看看,可以看到已经有了 然后我们说我们要搭建3个nifi的集群,那么这个时候,需要复制3份,但是 我们为了方便这里先…

SpringBoot 日志文件

(一)日志文件有什么用&#xff1f;除了发现和定位问题之外&#xff0c;我们还可以通过日志实现以下功能&#xff1a;记录用户登录日志&#xff0c;以便分析用户是正常登录还是恶意破解用户。记录系统的操作日志&#xff0c;以便数据恢复和定位操作 。记录程序的执行时间&#x…

字节码指令

目录 2.1 入门 2.2 javap 工具 2.3 图解方法执行流程 1&#xff09;原始 java 代码 2&#xff09;编译后的字节码文件 3&#xff09;常量池载入运行时常量池 4&#xff09;方法字节码载入方法区 5&#xff09;main 线程开始运行&#xff0c;分配栈帧内存 6&#xff09;…

百度地图API添加自定义标记解决单html文件跨域

百度地图API添加自定义标记解决单html文件跨域 因为要往百度地图上添加一些标注点&#xff0c;而且这些标注点要用自定义的图片&#xff0c;而且只能使用单html文件&#xff0c;不能使用服务器&#xff08;也别问为什么&#xff0c;就是这么个需求&#xff09;&#xff0c;做起…

互联网大厂测开面试记,二面被按地上血虐,所幸Offer已到手

在互联网做了几年之后&#xff0c;去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好&#xff0c;更重要的是&#xff0c;它是对你专业能力的背书&#xff0c;大厂工作背景多少会给你的简历增加几分竞争力。 如何备战面试的&#xff1f; 第一步&#xff1a;准备简历…

第三方软件测试机构▏软件性能测试的测试流程和指标简析

软件性能是衡量软件产品质量的重要指标之一&#xff0c;性能测试也是软件测试中不可或缺的重要流程&#xff0c;主要测试软件性能方面的质量&#xff0c;它是一种非功能性的测试。进行性能测试是为了保障软件能够在期望的负载下运行良好&#xff0c;并且通过发现性能问题来消除…

【IP课堂】Ip地址如何进行精准定位?

通过Ip地址定位&#xff0c;是目前网络上最常见的定位方式。当然&#xff0c;也是最简单的定位方式。其实方法大多都是雷同的&#xff0c;通过Ip定位&#xff0c;就目前网上公开的技术。如通过搜索关键词“定位&#xff0c;定位查询&#xff0c;Ip定位”等&#xff0c;只能查询…

《狂飙》壁纸太帅,Python自动切换太酷(8)

小朋友们好&#xff0c;大朋友们好&#xff01;我是猫妹&#xff01;要说最近什么电视剧最火&#xff1f;非《狂飙》莫属。《狂飙》剧名来自毛主席诗词“国际悲歌歌一曲&#xff0c;狂飙为我从天落”。导演借用“狂飙”二字来比喻剧中的扫黑除恶大风暴。据了解&#xff0c;《狂…

店铺微信公众号怎么创建?

有些小伙伴问店铺微信公众号怎么创建&#xff0c;在解答这个问题之前&#xff0c;先简单说说店铺和微信公众号关系&#xff1a; 店铺一般是指小程序店铺&#xff0c;商家通过小程序店铺来卖货&#xff1b;微信公众号则是一个发布信息的平台。但是两者之间可以打通&#xff0c;…

如何去选择合适的自动化测试工具?

自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中&#xff0c;几乎任一软件开发过程都需要在开发阶段的某个时候进行自动化测试&#xff0c;以加速回归测试的工作。自动化测试工具可以帮助测试人员以及整个团队专注于自动化工具无法处理的各自任务&a…

搭建Hexo博客-第5章-一些我用到的小技巧

搭建Hexo博客-第5章-一些我用到的小技巧 搭建Hexo博客-第5章-一些我用到的小技巧 搭建Hexo博客-第5章-一些我用到的小技巧 这大概是这组博客地最后一篇文章了&#xff0c;在这篇文章里&#xff0c;我想和大家分享一些我写博客时用到的小技巧。 Vs Code 我用的编辑器是 Vs C…

SpringBoot-自动配置-@Import注解与@EnableAutoConfiguration注解

Import注解 Enable* 底层依赖于 Import 注解导入一些类&#xff0c;使用 Import 导入的类会被 Spring 加载到 IOC 容器中Import 提供了4种用法&#xff1a; 1.导入Bean2.导入配置类3.导入ImportSelector实现类&#xff1b;一般用于加载配置文件中的类4.导入ImportBeanDefinitio…

阿里一面:谈一下你对DDD的理解?2W字,帮你实现DDD自由

说在前面 在微服务的应用开发中&#xff0c;DDD 用得越来越普及。 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;DDD是一个非常、非常高频的交流话题。 最近&#xff0c;有小伙伴面试阿里时&#xff0c;遇到一个面试题&#xff1a; 谈谈你对DDD的理解&#xff1f; 小伙…

我应该在我的博客上写什么? 介绍如何撰写初学者容易担心的文章

我想有很多人开了博客&#xff0c;但想不起来写作&#xff0c;无法取得进展。 博客的主题和文章的内容不会仅仅通过写你想做的事情来工作。 重要的是要了解用户想要阅读的内容以及人们可能收集的内容&#xff0c;并将其与您想要编写的内容很好地匹配。 这一次&#xff0c;我…

怎么拥有一个帅气的 CMD 命令窗口 ❓ - Windows

自从拥有这样一个炫酷的命令窗口&#xff0c;我都舍不得关掉它了 关于我为什么我要闲的去 “打扮” 一个命令窗口&#xff0c;这要从星期五下午的一场 摸鱼 &#x1f420; 开始&#xff0c;当时我要创建一个 vue ts vite 的项目练练手&#xff0c;为新项目开始做准备&#x…

spring-web InvocableHandlerMethod 源码分析

说明 本文基于 jdk 8, spring-framework 5.2.x 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 类层次 HandlerMethod&#xff0c;处理器的方法的封装对象。HandlerMethod 只提供了处理器的方法的基本信息&#xff0c;不提供调用逻辑。 Invoca…