Java-Java基础学习(2)-网络编程-TCP-UDP

2.网络编程

2.1. 通信协议

  1. TCP、UDP对比

    • TCP 打电话

      • 连接,稳定

      • 三次握手,四次挥手

        三次握手
        A: 你瞅啥?
        B: 瞅你咋地?
        A:干一场!
        
        四次挥手
        A:我要走了
        B: 你真的要走了吗?
        B:你真的真的要走了吗?
        A:我真的要走了
        
        
      • 客户端、服务端

      • 传输完成,释放连接,效率低

    • UDP 发短信

      • 不连接,不稳定
      • 客户端,服务端,没有明确的界限
      • 不管有没有准备好,都可以发给你
      • 导弹
      • DDOS:洪水供给!(饱和攻击)

2.2. Tcp上传测试

1TcpUploadClient.java
    package com.hzs.basic.inet;

import java.io.*;
import java.net.Inet4Address;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;

/**
 * @author Cherist Huan
 * @version 1.0
 * @date 2021/6/8 11:39
 * @note 文件上传客户端
 */
public class TcpUploadClient {
    public static void main(String[] args) throws IOException {
        // 1、创建一个Socket连接
        Socket socket = new Socket(Inet4Address.getByName("127.0.0.1"),9999);

        // 2、创建一个输出流
        OutputStream os = socket.getOutputStream();

        // 3、读取文件
       // FileInputStream fis = new FileInputStream(new File(String.valueOf(TcpUploadClient.class.getResource("6.jpg"))));
    //    URL resource = TcpUploadClient.class.getResource("/images/6.jpg");
    //    FileInputStream fis = new FileInputStream(resource.getPath());

        File file = new File("java-test-questions-06/src/main/resources/images/6.jpg");
       // File file = new File("images/6.jpg");
        System.out.println(file.getAbsolutePath());
        FileInputStream fis = new FileInputStream(file);

        // 4、写出文件
        byte[] buffer = new byte[1024];
        int len;
        while((len = fis.read(buffer))!= -1)
        {
            os.write(buffer,0,len);
        }


        // 通知服务器,我已经传输完毕了
        socket.shutdownOutput(); // 我已经传输完毕

        // 接受服务器的响应,确定服务器接受完毕,才能关闭连接
        InputStream is2 = socket.getInputStream();
        byte[] buffer2 = new byte[1024];
        int len2;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();


        while((len2 = is2.read(buffer2))!= -1)
        {
         baos.write(buffer2,0,len2);
        }

        System.out.println(baos.toString());

        // 5、关闭资源
        baos.close();

        fis.close();
        os.close();
        socket.close();
    }
}

    
2TcpUploadServer.java
    package com.hzs.basic.inet;

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

/**
 * @author Cherist Huan
 * @version 1.0
 * @date 2021/6/8 11:39
 *  @note 文件上传服务端
 */
public class TcpUploadServer {
    public static void main(String[] args) throws IOException {

        // 1、创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(9999);

        // 2、创建Socket监听
        Socket socket = serverSocket.accept();

        // 3、获取输入流
        InputStream is = socket.getInputStream();

        // 4、文件输出

//        URL resource = TcpUploadClient.class.getResource("/images/6_receive.jpg");
//        //FileOutputStream fos = new FileOutputStream(new File(resource.getPath()));
//        FileOutputStream fos = new FileOutputStream(resource.getPath());

        File file = new File("java-test-questions-06/src/main/resources/images/6receive.jpg");
        //File file = new File("images/6_receive.jpg");
        FileOutputStream fos = new FileOutputStream(file);

        byte[] buffer;
        buffer = new byte[1024];
        int len;

        while((len = is.read(buffer))!= -1)
        {
            fos.write(buffer,0,len);
        }


        // 通知客户端,我已经接受完毕
        OutputStream os = socket.getOutputStream();
        os.write("服务端返回,服务端已经接受完毕了".getBytes());

        // 5、关闭资源
        os.close();

        fos.close();
        is.close();
        socket.close();
        serverSocket.close();

    }
}

    

总结:

  • 客户端

    1. 建立socket连接
    2. 创建一个输出管道流
    3. 读取需要上传的文件
    4. 将文件写出到管道流
    5. 通知服务器,我已经传输完毕
    6. 接受服务器的响应,确定服务器接受完毕,才能关闭连接
    7. 关闭资源
  • 服务端

    1. 建立ServerSocker端口服务
    2. 创建Socket监听,返回Socket
    3. 获取输入流
    4. 获取输入流中文件输出
    5. 通知客户端,我已经接受完毕
    6. 关闭资源

2.3. Udp 传输

1UdpClient.java
    
package com.hzs.basic.inet;

import java.io.IOException;
import java.net.*;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 10:41
 * @Version 1.0
 */
public class UdpClient {
    public static void main(String[] args) throws IOException {

        // System.out.println(("AB".getBytes()).length);//2

        // 1、建立一个Socket
        DatagramSocket socket = new DatagramSocket();

        // 2、建包
        String msg = "Hello Cherist Huan!";
        InetAddress byName = Inet4Address.getByName("127.0.0.1");
        int port = 9090;
        DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,byName,port);

        // 3、发送包
        socket.send(datagramPacket);
        // 4、关闭流
       socket.close();
    }
}

2UdpServer.java
    package com.hzs.basic.inet;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 10:57
 * @Version 1.0
 */
public class UdpServer {
    public static void main(String[] args) throws IOException {
        // 1、开放端口
        DatagramSocket datagramSocket = new DatagramSocket(9090);

        // 2、接受数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);

        datagramSocket.receive(packet);// 阻塞式接受
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        // 关闭流
        datagramSocket.close();
    }
}

    

2.4. Udp聊天室(多线程)

1TalkSend.java
package com.hzs.basic.inet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 15:24
 * @Version 1.0
 */
public class TalkSend implements  Runnable {

    DatagramSocket socket = null;
    BufferedReader reader = null;

    private  int fromPort;
    private  int toPort;
    private  String toIp;

    public TalkSend(int fromPort, int toPort, String toIp) {
        this.fromPort = fromPort;
        this.toPort = toPort;
        this.toIp = toIp;

        try {
            socket = new DatagramSocket(fromPort);
            reader = new BufferedReader(new InputStreamReader(System.in));

        } catch (SocketException e) {
            e.printStackTrace();
        }

    }

    public void run() {
          while(true)
          {
              try {
                  String data = reader.readLine();
                  byte[] dataBytes = data.getBytes();

                  DatagramPacket packet = new DatagramPacket(dataBytes,0,dataBytes.length,new InetSocketAddress(this.toIp,this.toPort));

                  socket.send(packet);

                  if(data.equals("bye")){
                      break;
                  }

              } catch (IOException e) {
                  e.printStackTrace();
              }
          }

          socket.close();
    }
}

2TalkReceive.java
package com.hzs.basic.inet;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 15:44
 * @Version 1.0
 */
public class TalkReceive  implements  Runnable{

    DatagramSocket socket = null;
    private int port;
    private  String msg;
    public  TalkReceive(int port,String msg){
        this.port = port;
        this.msg = msg;
        try {
            socket = new DatagramSocket(port);

        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    public void run() {
       while(true){

           try {
               byte[] container = new byte[1024];
               DatagramPacket packet = new DatagramPacket(container, 0, container.length);

               socket.receive(packet);//阻塞式接受包裹

               // 断开连接 bye
               byte[] data = packet.getData();
               String receiveData = new String(data,0,data.length);
               System.out.println(msg+":"+receiveData);

               if(receiveData.equals("bye"))
               {
                   break;
               }

           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       socket.close();
    }
}


3TalkStudent.java
package com.hzs.basic.inet;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 15:56
 * @Version 1.0
 */
public class TalkStudent {
    public static void main(String[] args) {
        // 开启两个线程
        new Thread(
                new TalkSend(7777,9999,"localhost")
        ).start();

        //学生端接受线程端口(服务端口 8888)
        new Thread(
                new TalkReceive(8888,"老师说")
        ).start();
    }
}

4TalkTeacher.java
package com.hzs.basic.inet;

/**
 * @Author Cherist Huan
 * @Date 2021/6/10 16:04
 * @Version 1.0
 */
public class TalkTeacher {
    public static void main(String[] args) {
        // 开启两个线程
        new Thread(
                new TalkSend(6666,8888,"localhost")
        ).start();

        //老师端接受线程端口(服务端口 9999)
        new Thread(
                new TalkReceive(9999,"学生说")
        ).start();
    }
}    

2.5 对比总结

Java网络编程中,TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。它们各有特点和适用场景。

TCP传输

特点

  1. 面向连接:TCP在传输数据之前需要先建立连接,传输完成后需要断开连接。
  2. 可靠传输:TCP通过序列号、确认应答、超时重传等机制确保数据的可靠传输。
  3. 流量控制:TCP通过滑动窗口机制进行流量控制,避免发送方发送速率过快导致接收方处理不过来。
  4. 拥塞控制:TCP通过慢开始、拥塞避免、快重传、快恢复等算法进行拥塞控制,避免网络拥塞。

应用场景

  • 需要可靠传输的应用,如文件传输、电子邮件等。
  • 对数据传输顺序有要求的应用,如网页浏览、在线视频等。

UDP传输

特点

  1. 无连接:UDP在传输数据之前不需要建立连接,每个数据报都是一个独立的信息。
  2. 不可靠传输:UDP不保证数据的可靠传输,不进行流量控制和拥塞控制。
  3. 开销小:由于UDP协议简单,传输开销小,适合实时性要求高的应用。

应用场景

  • 实时性要求高的应用,如音频、视频流等。
  • 允许一定程度上数据丢失的应用,如实时游戏、实时股市行情等。

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

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

相关文章

Spring Boot 自动化单元测试类的编写过程

前言 Web环境模拟测试 企业开发不仅要保障业务层与数据层的功能安全有效,也要保障表现层的功能正常。但是我们一般对表现层的测试都是通过postman手工测试的,并没有在打包过程中代码体现表现层功能被测试通过。那么能否在测试用例中对表现层进行功能测…

C#,图论与图算法,有向图(Graph)之环(Cycle)判断的颜色算法与源代码

1 检查该图是否包含循环 给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,则函数应返回true,否则返回false。 方法:深度优先遍历可用于检测图中的循环。连接图的DFS生成树。只有当图中存在后缘时,图中才存在循环。后边是从节点到自身(自循环)或…

WiFi是可以连接网络,但是在Pixel 手机上就连接提示受阻,无法上网-解决方法

1,通过USB连接手机,然后通过adb命令执行 adb shell settings delete global captive_portal_mode adb shell settings put global captive_portal_mode 0 adb shell settings get global captive_portal_mode adb shell settings delete global capti…

大数据面试题 —— HBase

目录 什么是HBase简述HBase 的数据模型HBase 的读写流程HBase 在写的过程中的region的split的时机HBase 和 HDFS 各自的使用场景HBase 的存储结构HBase 中的热现象(数据倾斜)是怎么产生的,以及解决办法有哪些HBase rowkey的设计原则HBase 的列…

[LLM] 大模型基础|预训练|有监督微调SFT | 推理

现在的大模型在进行预训练时大部分都采用了GPT的预训练任务,即 Next token prediction。 要理解大语言模型(LLM),首先要理解它的本质,无论预训练、微调还是在推理阶段,核心都是next token prediction&#…

SLAM 求解IPC算法

基础知识:方差,协方差,协方差矩阵 方差:描述了一组随机变量的离散程度 方差 每个样本值 与 全部样本的平均值 相差的平方和 再求平均数,记作: 例如:计算数字1-5的方差,如下 去中心化…

.NET 异步编程(异步方法、异步委托、CancellationToken、WhenAll、yield)

文章目录 异步方法异步委托async方法缺点CancellationTokenWhenAllyield 异步方法 “异步方法”&#xff1a;用async关键字修饰的方法 异步方法的返回值一般是Task<T>&#xff0c;T是真正的返回值类型&#xff0c;Task<int>。惯例&#xff1a;异步方法名字以 Asy…

键盘映射工具KeyTweak的使用,把F9和F10改为 Home、End

如果你的笔记本没有Home、End键 对于写文字和写代码影响还是比较大的 下面使用键盘映射工具KeyTweak 把F9和F10分别改为 Home、End 然后点击ok 电脑重启后 就生效了 很好用 完美解决 小尺寸笔记本 的按键少的烦恼 可以自己再琢磨琢磨 去映射 符合自己需求的按键 软件下载链接&…

[PwnThyBytes 2019]Baby_SQL

[PwnThyBytes 2019]Baby_SQL 查看源码发现 下载源码&#xff0c;首先观察index.php 首先进入index.php&#xff0c;会执行session_start();启动session这里通过foreach将所有的环境变量的值都遍历了一遍&#xff0c;并且都使用了addslashes()进行转义&#xff0c;然后就定义了…

【智能家居】东胜物联提供软硬一体化智能家居解决方案,助企业提高市场占有率

背景 随着智能家居市场的不断壮大&#xff0c;越来越多的消费者开始享受到它带来的便捷和效益。现在&#xff0c;他们可以通过远程或语音控制设备进行个性化设置&#xff0c;比如调节照明和温度&#xff0c;让生活变得更加舒适和智能化。 根据SPER市场研究&#xff0c;预计秘…

【计算机网络_网络层】IP协议

文章目录 1. IP的基本概念1.1 什么是IP协议1.2 为什么要有IP协议 2. IP的协议格式3. 网段划分&#xff08;重要&#xff09;3.1 为什么要进行网段划分3.2 网段划分的规则3.2.1 古老的划分方案3.2.2 现代的划分方案 4. 特殊的IP地址5. 解决IP地址的数量限制问题6. 私有IP和公网I…

BUUCTF-Misc10

秘密文件1 1.打开附件 是一个流量包 2.Wireshark 用Wireshark打开 右键追踪tcp追踪流&#xff0c;发现一个以.rar结尾的压缩包 3.foremost 用foremost分离文件 发现有一个rar的文件夹 文件夹内有个加密的压缩包 4.ARCHPR 用ARCHPR工具对压缩包进行解密 5.得到flag [BJDCTF2…

搭建基于 Snowflake 的 CI/CD 最佳实践!

Snowflake 提供了可扩展的计算和存储资源&#xff0c;和基于 SQL 的界面 Snowsight&#xff0c;方便用户进行数据操作和分析。然而&#xff0c;如果用户想将自己的 CI/CD 流程与 Snowflake 集成时&#xff0c;会发现一些不便之处&#xff08;尤其相比其 SnowSight 优秀的查询能…

【Linux】进程排队的理解进程状态的表述僵尸进程和孤儿进程的理解

一、进程排队的理解 进程不是一直运行的&#xff0c;进程可能会在等待某种软硬件资源。即使把进程加载到CPU中&#xff0c;也不是一直会运行的。而进程排队&#xff0c;一定是在等待某种软硬件资源&#xff08;可以是CPU&#xff0c;键盘&#xff0c;磁盘&#xff0c;网卡等等设…

六种GPU虚拟化:除了直通、全虚拟化 (vGPU)还有谁?

在大类上计算虚拟化技术有这3种&#xff1a; 软件模拟、直通独占(如网卡独占、显卡独占)、直通共享&#xff08;如vCPU 、vGPU&#xff09;。但对于显卡GPU而言我总结细化出至少这6种分类&#xff1a; 第一种、软件模拟&#xff08;eg sGPU&#xff09;, 又叫半虚拟化。第二种…

Spark 3.5.0 特性速览

介绍 Spark 3系列已经发布了第六版3.5.0&#xff0c;目前最新3.5.1。 使用最广泛的大数据可扩展计算引擎。数以千计的公司&#xff0c;包括 80% 的财富 500 强企业&#xff0c;都在使用 Apache Spark。来自业界和学术界的 2000 多名开源项目贡献者。 Apache Spark 3.5.0 是…

英伟达GTC2024大会开幕,发布机器人003计划,引领具身智能新时代

一、背景 在全球科技创新的前沿阵地&#xff0c;2024年3月的英伟达GPU技术大会&#xff08;GTC&#xff09;再次成为全球瞩目的焦点。在此次盛会上&#xff0c;英伟达公司创始人兼首席执行官黄仁勋先生不仅展示了其公司在加速计算和生成式AI领域的最新突破&#xff0c;更震撼发…

耳机壳UV树脂制作私模定制耳塞需要什么样的设备和技术?

制作私模定制耳塞需要使用到一些特定的设备和技术&#xff0c;包括但不限于以下内容&#xff1a; 耳模制作工具&#xff1a;用于获取用户耳型的耳模制作工具&#xff0c;如硅胶、橡皮泥等。需要使用熟练的手法和技术&#xff0c;确保耳模的准确性和稳定性。UV树脂&#xff1a;…

HCIA——30奈奎斯特定理、香农定理

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

Laravel框架项目首页内容修改

#Laravel# 安装Laravel框架成功后运行项目&#xff0c;看到下面这个图就说明安装框架成功了 需要根据自己的需求修改页面时&#xff0c;先找到首页的文件 首页对应的页面文件为项目根目录下的resources/views/welcome.blade.php文件 <!DOCTYPE html> <html lang&quo…
最新文章