TCP与UDP网络编程

网络通信协议

在这里插入图片描述

java.net 包中提供了两种常见的网络协议的支持:

  • UDP:用户数据报协议(User Datagram Protocol)
  • TCP:传输控制协议(Transmission Control Protocol)

TCP协议与UDP协议

TCP协议

  • TCP协议进行通信的两个应用进程:客户端、服务端
  • 使用TCP协议前,须先建立TCP连接,形成基于字节流的传输数据通道
  • 传输前,采用“三次握手”方式,点对点通信,是可靠
    • TCP协议使用重发机制,当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体确认信息,如果没有收到另一个通信实体确认信息,则会再次重复刚才发送的消息
  • 在连接中可进行大数据量的传输
    传输完毕,需释放已建立的连接,效率低

UDP协议

  • UDP协议进行通信的两个应用进程:发送端、接收端
  • 将数据、源、目的封装成数据包(传输的基本单位),不需要建立连接
  • 发送不管对方是否准备好,接收方收到也不确认,不能保证数据的完整性,故是不可靠
  • 每个数据报的大小限制在64K
  • 发送数据结束时无需释放资源,开销小,通信效率高
  • 适用场景:音频、视频和普通数据的传输。例如视频会议

生活案例

TCP生活案例:打电话

UDP生活案例:发送短信、发电报

TCP协议

三次握手

在这里插入图片描述

四次挥手

在这里插入图片描述

网络编程API

Socket类

基本介绍

在这里插入图片描述

在这里插入图片描述

示意图:

在这里插入图片描述

理解客户端、服务端

  • 客户端:

    • 自定义
    • 浏览器(browser — server)
  • 服务端:

    • 自定义
    • Tomcat服务器

TCP网络编程

通信模型

在这里插入图片描述

例题1

客户端发送内容给服务端,服务端将内容打印到控制台上。

public class TCPTest1 {//客户端@Testpublic void client() {Socket socket = null;OutputStream os = null;try {// 1.创建一个SocketInetAddress inetAddress = InetAddress.getByName("127.0.0.1"); //声明ip地址int port = 8989; //声明端口号socket = new Socket(inetAddress,port);// 2.发送数据os = socket.getOutputStream();os.write("你好,我是客户端,请多多关照".getBytes());} catch (IOException e) {e.printStackTrace();} finally {// 3.关闭socket、流try {if (socket != null)socket.close();} catch (IOException e) {e.printStackTrace();}try {if (os != null)os.close();} catch (IOException e) {e.printStackTrace();}}}//服务端@Testpublic void server() {ServerSocket serverSocket = null;Socket socket = null; //阻塞式方法InputStream is = null;try {// 1.创建一个ServerSocketint port = 8989;serverSocket = new ServerSocket(port);// 2.调用accept(),接收客户端的Socketsocket = serverSocket.accept();System.out.println("服务器端已开启");System.out.println("收到了来自于" + socket.getInetAddress().getHostAddress() + "的连接");// 3.接收数据is = socket.getInputStream();byte[] buffer = new byte[1024];ByteArrayOutputStream baos = new ByteArrayOutputStream(); //内部维护了一个byte[]int len;while ((len = is.read(buffer)) != -1) {// 错误的,可能会出现乱码
//                String str = new String(buffer,0,len);
//                System.out.println(str);//正确的baos.write(buffer,0,len);}System.out.println(baos.toString());System.out.println("\n数据接收完毕");} catch (IOException e) {e.printStackTrace();} finally {// 4.关朗Socket、ServerSocket、流try {if (socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}try {if (serverSocket != null) {serverSocket.close();}} catch (IOException e) {e.printStackTrace();}try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}}}
}

例题2

客户端发送文件给服务端,服务端将文件保存在本地。

public class TCPTest2 {//客户端@Testpublic void client() {// 1.创建Socket// 指明对方(即为服务器)的ip地址和端口号Socket socket = null;FileInputStream fis = null;OutputStream os = null;try {InetAddress inetAddress = InetAddress.getByName("127.0.0.1");int port = 9090;socket = new Socket(inetAddress,port);// 2.创建File的实例、FileInputstream的实例File file = new File("huan.jpg");fis = new FileInputStream(file);// 3.通过Socket,获取输出流os = socket.getOutputStream();// 读写数据byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) != -1) {os.write(buffer,0,len);}System.out.println("数据发送完毕");} catch (IOException e) {e.printStackTrace();} finally {// 4.关闭Socket和相关的流try {if (os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}try {if (fis != null) {fis.close();}} catch (IOException e) {e.printStackTrace();}try {if (socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}}}//服务端@Testpublic void server() {ServerSocket serverSocket = null;Socket socket = null;InputStream is = null;FileOutputStream fos = null;try {// 1.创建ServerSocketint port = 9090;serverSocket = new ServerSocket(port);// 2.接收来自于客户端的socket:accept()socket = serverSocket.accept();// 3.通过Socket获取一个输入流is = socket.getInputStream();// 4.创建File类的实例、File0utputstream的实例File file = new File("huan_copy.jpg");fos = new FileOutputStream(file);// 5.读写过程byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer,0,len);}System.out.println("数据接收完毕");} catch (IOException e) {e.printStackTrace();} finally {// 6.关闭相关的Socket和流try {if (fos != null) {fos.close();}} catch (IOException e) {e.printStackTrace();}try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}try {if (socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}try {if (serverSocket != null) {serverSocket.close();}} catch (IOException e) {e.printStackTrace();}try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}}}
}

例题3

从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功"给客户端。并关闭相应的连接。

public class TCPTest3 {//客户端@Testpublic void client() {// 1.创建Socket// 指明对方(即为服务器)的ip地址和端口号Socket socket = null;FileInputStream fis = null;OutputStream os = null;ByteArrayOutputStream baos = null;InputStream is = null;try {InetAddress inetAddress = InetAddress.getByName("127.0.0.1");int port = 9090;socket = new Socket(inetAddress, port);// 2.创建File的实例、FileInputstream的实例File file = new File("huan.jpg");fis = new FileInputStream(file);// 3.通过Socket,获取输出流os = socket.getOutputStream();// 4.读写数据byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) != -1) {os.write(buffer, 0, len);}System.out.println("数据发送完毕");// 5.客户端表明不再继续发送数据socket.shutdownOutput();// 6.接收来自于服务器端的数据is = socket.getInputStream();baos = new ByteArrayOutputStream();byte[] buffer1 = new byte[5];int len1;while ((len1 = is.read(buffer1)) != -1) {baos.write(buffer1, 0, len1);}System.out.println(baos.toString());} catch (IOException e) {e.printStackTrace();} finally {// 7.关闭Socket和相关的流try {baos.close();} catch (Exception e) {e.printStackTrace();}try {is.close();} catch (IOException e) {e.printStackTrace();}try {if (os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}try {if (fis != null) {fis.close();}} catch (IOException e) {e.printStackTrace();}try {if (socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}}}//服务端@Testpublic void server() {ServerSocket serverSocket = null;Socket socket = null;InputStream is = null;FileOutputStream fos = null;OutputStream os = null;try {// 1.创建ServerSocketint port = 9090;serverSocket = new ServerSocket(port);// 2.接收来自于客户端的socket:accept()socket = serverSocket.accept();// 3.通过Socket获取一个输入流is = socket.getInputStream();// 4.创建File类的实例、File0utputstream的实例File file = new File("huan_copy2.jpg");fos = new FileOutputStream(file);// 5.读写过程byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}// 6.服务端发送数据给客户端os = socket.getOutputStream();os.write("你的图片很漂亮,我接收到了".getBytes());System.out.println("数据接收完毕");} catch (IOException e) {e.printStackTrace();} finally {// 7.关闭相关的Socket和流try {os.close();} catch (IOException e) {e.printStackTrace();}try {if (fos != null) {fos.close();}} catch (IOException e) {e.printStackTrace();}try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}try {if (socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}try {if (serverSocket != null) {serverSocket.close();}} catch (IOException e) {e.printStackTrace();}try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}}}
}

【案例】聊天室

聊天室模型

在这里插入图片描述

服务器端

public class ChatSeverTest {//这个集合用来存储所有在线的客户端static ArrayList<Socket> online = new ArrayList<Socket>();public static void main(String[] args) throws IOException {//1、启动服务器,绑定端口号ServerSocket server = new ServerSocket(8989);//2、接收n多的客户端同时连接while (true) {Socket accept = server.accept();online.add(accept);//把新连接的客户端添加到online列表中MessageHandler mh = new MessageHandler(accept);mh.start();}}static class MessageHandler extends Thread {private Socket socket;private String ip;public MessageHandler(Socket socket) {super();this.socket = socket;}@Overridepublic void run() {try {ip = socket.getInetAddress().getHostAddress();//插入:给其他客户端转发“我上线了”sendToOther(ip+"上线了");//(1)接收该客户端的发送的消息InputStream input = socket.getInputStream();InputStreamReader reader = new InputStreamReader(input);BufferedReader br = new BufferedReader(reader);String str;while ((str = br.readLine()) != null) {//(2)给其他在线客户端转发sendToOther(ip + ":" + str);}sendToOther(ip + "下线了");} catch (IOException e) {try {sendToOther(ip + "掉线了");} catch (Exception e1) {e1.printStackTrace();}} finally {//从在线人员中移除我online.remove(socket);}}//封装一个方法:给其他客户端转发xxx消息public void sendToOther(String message) throws IOException {//遍历所有的在线客户端,一一转发for (Socket on : online) {OutputStream every = on.getOutputStream();PrintStream ps = new PrintStream(every);ps.println(message);}}}
}

客户端

public class ChatClientTest {public static void main(String[] args) throws Exception {//1、连接服务器Socket socket = new Socket("127.0.0.1", 8989);//2、开启两个线程//(1)一个线程负责看别人聊,即接收服务器转发的消息Receive receive = new Receive(socket);receive.start();//(2)一个线程负责发送自己的话Send send = new Send(socket);send.start();send.join();//等我发送线程结束了,才结束整个程序socket.close();}
}class Send extends Thread{private Socket socket;public Send(Socket socket) {super();this.socket = socket;}@Overridepublic void run() {try {OutputStream outputStream = socket.getOutputStream();//按行打印PrintStream ps = new PrintStream(outputStream);Scanner input = new Scanner(System.in);//从键盘不断的输入自己的话,给服务器发送,由服务器给其他人转发while (true) {System.out.println("自己的话:");String str = input.nextLine();if ("bye".equals(str)) {break;}ps.println(str);}input.close();} catch (IOException e) {e.printStackTrace();}}
}class Receive extends Thread{private Socket socket;public Receive(Socket socket) {super();this.socket = socket;}@Overridepublic void run() {try {InputStream inputStream = socket.getInputStream();Scanner input = new Scanner(inputStream);while (input.hasNextLine()) {String line = input.nextLine();System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

UDP网络编程

通信模型

在这里插入图片描述

示例

public class UDPTest {//发送端@Testpublic void sender() throws Exception {//1.创建DatagramSocket的实例DatagramSocket ds = new DatagramSocket();//2、将数据、目的地的ip,目的地的端口号部封装在DatagramPacket数据报中InetAddress inetAddress = InetAddress.getByName("127.0.0.1");int port = 9090;byte[] bytes = "我是发送端".getBytes("utf-8");DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, inetAddress, port);//发送数据ds.send(packet);ds.close();}//接收端@Testpublic void receiver() throws IOException {//1.创建DatagramSocket的实例int port = 9090;DatagramSocket ds = new DatagramSocket(port);//2. 创建数据报的对象,用于接收发送端发送过来的数据byte[] buffer = new byte[1024 * 64];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);//3.接收数据ds.receive(packet);//4.获取数据,并打印到控制台上String str = new String(packet.getData(), 0, packet.getLength());System.out.println(str);ds.close();}
}

URL编程

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

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

相关文章

昇思25天学习打卡营第16天 | Vision Transformer图像分类

昇思25天学习打卡营第16天 | Vision Transformer图像分类 文章目录 昇思25天学习打卡营第16天 | Vision Transformer图像分类Vision Transform&#xff08;ViT&#xff09;模型TransformerAttention模块Encoder模块 ViT模型输入 模型构建Multi-Head Attention模块Encoder模块Pa…

BiLSTM 实现股票多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

三、GPIO口

我们在刚接触C语言时&#xff0c;写的第一个程序必定是hello world&#xff0c;其他的编程语言也是这样类似的代码是告诉我们进入了编程的世界&#xff0c;在单片机中也不例外&#xff0c;不过我们的传统就是点亮第一个LED灯&#xff0c;点亮电阻&#xff0c;电容的兄弟&#x…

【Java项目笔记】01项目介绍

一、技术框架 1.后端服务 Spring Boot为主体框架 Spring MVC为Web框架 MyBatis、MyBatis Plus为持久层框架&#xff0c;负责数据库的读写 阿里云短信服务 2.存储服务 MySql redis缓存数据 MinIO为对象存储&#xff0c;存储非结构化数据&#xff08;图片、视频、音频&a…

防溺水预警系统引领水域安全新篇章

一、系统概述 随着人们对水域活动的需求增加&#xff0c;溺水事故频发&#xff0c;给人们的生命安全带来了严重威胁。然而&#xff0c;如今&#xff0c;一项创新科技正在以强大的功能和无限的潜力引领着水域安全的新篇章。智能防溺水预警系统&#xff0c;作为一种集成了智能感知…

神经网络构造

目录 一、神经网络骨架&#xff1a;二、卷积操作&#xff1a;三、卷积层&#xff1a;四、池化层&#xff1a;五、激活函数&#xff08;以ReLU为例&#xff09;&#xff1a; 一、神经网络骨架&#xff1a; import torch from torch import nn#神经网络 class CLH(nn.Module):de…

【概率论三】参数估计:点估计(矩估计、极大似然法)、区间估计

文章目录 一. 点估计1. 矩估计法2. 极大似然法2.1. 似然函数2.2. 极大似然估计法 3. 评价估计量的标准3.1. 无偏性3.2. 有效性3.3. 一致性 二. 区间估计1. 区间估计的概念2. 正态总体参数的区间估计 参数估计讲什么 由样本来确定未知参数参数估计分为点估计与区间估计 一. 点估…

Golang面试题整理(持续更新...)

文章目录 Golang面试题总结一、基础知识1、defer相关2、rune 类型3、context包4、Go 竞态、内存逃逸分析5、Goroutine 和线程的区别6、Go 里面并发安全的数据类型7、Go 中常用的并发模型8、Go 中安全读写共享变量方式9、Go 面向对象是如何实现的10、make 和 new 的区别11、Go 关…

【Pytorch】RNN for Name Classification

参考学习来自&#xff1a; https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.htmlRNN完成姓名分类https://download.pytorch.org/tutorial/data.zip 导入库 import glob # 用于查找符合规则的文件名 import os import unicodedata import stri…

【linux】信号的理论概述和实操

目录 理论篇 信号概述 信号的分类 信号机制 理解硬件中断 异步 信号对应的三种动作 信号产生的条件 终端按键 系统调用 软件条件 硬件异常 除0错误 野指针 OS对于错误的态度 信号在进程中的内核数据结构 信号的处理 CPU的内核态和用户态概述 进程处理信号的时…

dom4j 操作 xml 之按照顺序插入标签

最近学了一下 dom4j 操作 xml 文件&#xff0c;特此记录一下。 public class Dom4jNullTagFiller {public static void main(String[] args) throws DocumentException {SAXReader reader new SAXReader();//加载 xml 文件Document document reader.read("C:\\Users\\24…

Hadoop3:MR程序的数据倾斜问题处理

一、数据倾斜 什么是数据倾斜&#xff1f; 学过Redis集群的都知道数据倾斜这个问题。 就是大量数据&#xff0c;分配不均匀的现象。 二、MR数据倾斜 1、怎么判断出现数据倾斜&#xff1f; 数据频率倾斜——某一个区域的数据量要远远大于其他区域。 数据大小倾斜——部分记…

[iOS]浅析isa指针

[iOS]浅析isa指针 文章目录 [iOS]浅析isa指针isa指针isa的结构isa的初始化注意事项 上一篇留的悬念不止分类的实现 还有isa指针到底是什么 它是怎么工作的 class方法又是怎么运作的 class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags 这里面的class又是何方…

【BUG】已解决:Uncaught SyntaxError: Unexpected token ‘<‘

已解决&#xff1a;Could not install packages due to an EnvironmentError: [Errno 13] Permission denied 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 …

用 WireShark 抓住 TCP

Wireshark 是帮助我们分析网络请求的利器&#xff0c;建议每个同学都装一个。我们先用 Wireshark 抓取一个完整的连接建立、发送数据、断开连接的过程。 简单的介绍一下操作流程。 1、首先打开 Wireshark&#xff0c;在欢迎界面会列出当前机器上的所有网口、虚机网口等可以抓取…

Nginx、LNMP万字详解

目录 Nginx 特点 Nginx安装 添加Nginx服务 Nginx配置文件 全局配置 HTTP配置 状态统计页面 Nginx访问控制 授权用户 授权IP 虚拟主机 基于域名 测试 基于IP 测试 基于端口 测试 LNAMP 解析方式 LNMP转发php-fpm解析 Nginx代理LAMP解析 LNMP部署示例 实…

github汉化

GitHub: Let’s build from here GitHub 进入后在顶部搜索栏直接搜索 选第一个点进去后根据教程安装即可 注意如果是chrome浏览器的话 安装篡改猴如果这个问题参考这个链接 chrome浏览器安装篡改猴脚本不执行&#xff08;Please enable developer mode to allow userscript…

数据结构(单链表算法题)

1.删除链表中等于给定值 val 的所有节点。 OJ链接 typedef struct ListNode ListNode;struct ListNode {int val;struct ListNode* next; };struct ListNode* removeElements(struct ListNode* head, int val) {//创建新链表ListNode* newhead, *newtail;newhead newtail N…

IDEA工具中Java语言写小工具遇到的问题

一&#xff1a;读取excel时遇到 org/apache/poi/ss/usermodel/WorkbookProvider 解决办法&#xff1a; 在pom.xml中把poi的引文包放在最前面即可

小技巧:通过命令行和网络连接获取电脑所连wifi密码

方法一&#xff1a;命令行 第一步&#xff0c;命令行输入下列命令&#xff0c;获取连接过的wifi netsh wlan show profile 第二步&#xff0c;输入以下命令查看你想看的wifi密码&#xff08;红色改为你获取的任意一个wifi名称&#xff09; netsh wlan show profile happy key…