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.javapackage 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.javapackage 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、创建ServerSocketServerSocket 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.javapackage 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、建立一个SocketDatagramSocket 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.javapackage 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);//阻塞式接受包裹// 断开连接 byebyte[] 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.mzph.cn/news/765570.shtml

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

相关文章

防火墙在解决方案及典型项目中的应用

防火墙在解决方案及典型项目中的应用 防火墙作为基础安全防护产品,在各种解决方案、业务场景中配套应用,本节给出各类方案资料链接方便查阅。 防火墙在华为网络解决方案中的应用 解决方案 文档 主要应用 CloudFabric云数据中心网解决方案 资料专区…

《剑指 Offer》专项突破版 - 面试题 88 : 动态规划的基础知识(C++ 实现)

目录 前言 面试题 88 : 爬楼梯的最少成本 一、分析确定状态转移方程 二、递归代码 三、使用缓存的递归代码 四、空间复杂度为 O(n) 的迭代代码 五、空间复杂度为 O(1) 的迭代代码 前言 动态规划是目前算法面试中的热门话题,应聘者经常在各大公司的面试中遇到…

Linux初学(七)内存与进程管理、计划任务

一、内存与进程 1.1 查看内存 命令:free -m 选项:-m 以mb的显示 [rootlocalhost ~]# free -mtotal used free shared buff/cache available Mem: 1819 200 1184 9 435 1426 Swap: 2047 0 2047 Me…

kornia库ssim使用,Invalid image shape

一、图像张量转四维 将图像张量转换为四维张量的原因-训练神经网络 - 知乎 img1 cv2.imread(OCT3.png) #读入一张图像 img1 cv2.resize(img1,(256,256)) #修改尺寸为256*256 img1 np.array(img1) tensor transforms.ToTensor() img_tensor tensor(img1) #转化成张量形式…

Linux docker3--数据卷-nginx配置示例

一、因为docker部署服务都是以最小的代价部署,所以通常在容器内部很多依赖和命令无法执行。进入容器修改配置的操作也比较麻烦。本例介绍的数据卷作用就是将容器内的配置和宿主机文件打通,之后修改宿主机的配置文件就相当于修改了docker进程的配置文件&a…

webgl浏览器渲染设置

在浏览器中程序图形化webgl渲染时,有时候发现代码没有问题,但是就是无法渲染或者渲染报错,此时可以尝试如下的设置: 通过在chrome浏览器输入chrome://flags打开扩展 设置一(webgl开发者扩展) 设…

复习Day2

AcWing 1214. 波动数列 - AcWing j(n-1)*b与前i-1项的和模n余数相同: 记前i项的和为x,则有 x%nj ,第i项为 -(n-1)b , 前i项的和为 x-(-(n-1)b)即 x(n-1)b , 而 x(n-1)b % n j (n-1)b % n 就是 x(n-1)b 在模n的情况下同余于 x%n (n-1)*b 对于加法,减法,乘法 什么…

2024华为OD统一考试(C卷)最新题库(Java Python C++)

关于华为OD ​ 华为的员工补充途径有三种,分别是校招、OD转正和社招。校招是华为唯一的正式员工入职途径,但是从近几届开始竞争非常激烈,尤其是在CV、AI、NLP等赛道上,所以对于C9等专业的学生来说,可以考虑转向一些冷…

Linux镜像文件下载地址--SCAS 开源镜像站,速度快

SCAS 开源镜像站 https://mirror.iscas.ac.cn/举例: 下载centos7 Index of /centos/7/isos/x86_64/ (iscas.ac.cn)

ARM实验 LED流水灯

.text .global _start _start: 使能GPIOE GPIOF的外设时钟 RCC_MP_AHB4ENSETR的第[4][5]设置为1即可使能GPIOE GPIOF时钟 LDR R0,0X50000A28 指定寄存器地址 LDR R1,[R0] 将寄存器原来的数值读取出来&#xff0c;保存到R1中 ORR R1,R1,#(0x3<<4) 将第4位设置为1 S…

Linux网络协议栈从应用层到内核层②

文章目录 1、bind 源码剖析2、listen 源码剖析3、accept 源码剖析4、connect 源码剖析客户端调用connect成功&#xff0c;但三次握手并未完成&#xff0c;进程是如何阻塞自己客户端在connect时&#xff0c;如何选择源端口客户发送syn封包以及重传服务端收到syn封包&#xff0c;…

AIGC摩尔定律

关于AIGC(Artificial Intelligence Generated Content,人工智能生成内容)领域的“摩尔定律”,这是一个比喻性的概念,用来描述AI模型尤其是深度学习模型在算力、效率以及能力方面的指数级增长趋势。传统的摩尔定律是指集成电路上可容纳的晶体管数量大约每两年翻一番,从而带…

算法公式汇总

文章目录 三角函数定义式诱导公式平方关系两角和与差的三角函数积化和差公式和差化积公式倍角公式半角公式万能公式其他公式反三角函数恒等式 三角函数定义式 三角函数 定义式 余切&#xff1a; c o t A 1 t a n A \text { 余切&#xff1a;} \ cotA \frac{1}{tanA} 余切&a…

Java面向对象编程面试题

序号问题详细答案1什么是类与对象&#xff1f;类和对象实例之间的关系&#xff1f; 类具有继承、数据隐藏和多态三种主要特性。类是同一类对象实例的共性的抽象&#xff0c;对象是类的实例化&#xff1b;类是静态的&#xff0c;对象是动态的&#xff0c;对象可以看作是运行中…

微店获得店铺的所有商品 API 返回值说明

一、应用场景 店铺的所有商品API接口具有广泛的应用场景&#xff0c;主要涉及到电商平台的运营、数据分析、用户体验提升以及第三方应用集成等方面。 首先&#xff0c;对于电商平台而言&#xff0c;店铺的所有商品API接口是获取商品信息的核心途径。通过调用这个接口&#xf…

x-zse-96安卓端纯算,魔改AES还原

两天前发了一个x-zse-96的文章,当时遇到了点问题,只分析到了最后一个白盒AES函数里面,并且当时用dfa攻击还原出了秘钥,IV也确定了,但是加密结果不对,本来打算把下文鸽掉的,因为当时unidbg没跑起来,用frida去hook白盒AES中的每一行汇编有点麻烦,没有unidbg方便.后来小白大佬说un…

内网渗透(一)必须了解Windows工作组

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、内网渗透测试简介 内网也叫局域网&#xff0c;是指在…

代码随想录学习Day 14

104.二叉树的最大深度 题目链接 讲解链接 本题很容易想到采用层次遍历的思路来解决&#xff0c;因为要求的是二叉树的最大深度&#xff0c;那么在进行层次遍历的时候设置一个变量count用来记录当前遍历的层数&#xff0c;count初始为0&#xff0c;每遍历完一层将其值1&#…

《自动机理论、语言和计算导论》阅读笔记:p1-p4

《自动机理论、语言和计算导论》学习第1天&#xff0c;p1-p4&#xff0c;总计4页。这只是个人的学习记录&#xff0c;因为很多东西不懂&#xff0c;难免存在理解错误的地方。 一、技术总结 1.有限自动机(finite automata)示例 1.software for checking digital circuits。 …

工作需求,Vue实现登录

加油&#xff0c;新时代打工人&#xff01; vue 2.x Element UI <template><div class"body" :style"{background-image: url(${require(/assets/images/login.png)})}"><el-form :rules"rules" ref"loginForm" :mode…