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://www.mzph.cn/pingmian/47312.shtml

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

相关文章

好玩的调度技术-场景编辑器

好玩的调度技术-场景编辑器 文章目录 好玩的调度技术-场景编辑器前言一、演示一、代码总结好玩系列 前言 这两天写前端写上瘾了&#xff0c;顺手做了个好玩的东西&#xff0c;好玩系列也好久没更新&#xff0c;正好作为素材写一篇文章&#xff0c;我真的觉得蛮好玩的&#xff…

LinuxShell编程1———shell基础命令

文章目录 前言 一、shell基础知识 1、shell概念 2、Shell的功能 接收&#xff1a;用户命令 调用&#xff1a;相应的应用程序 解释并交给&#xff1a;内核去处理 返还&#xff1a;内核处理结果 3、Shell种类&#xff08;了解&#xff09; 3.1、MS-DOS 3.2、Windows的…

R语言进行K折交叉验证问题

在使用R语言进行模型参数评估优化时候&#xff0c;会使用K折交叉验证&#xff0c;其中会遇到各种各样问题&#xff1a; 错误: C5.0 models require a factor outcome > (1-mean(E0));(1-mean(E1)) [1] 1 [1] 1 报错说明C5.0模型需要因子变量输出&#xff0c;源代码如下&am…

无人机技术优势及发展详解

一、技术优势 无人机&#xff08;Unmanned Aerial Vehicle&#xff0c;UAV&#xff09;作为一种新兴的空中智能平台&#xff0c;凭借其独特的技术优势&#xff0c;已经在众多领域中展现出强大的应用潜力和实用价值。以下是无人机的主要技术优势&#xff1a; 1. 自主导航与远程…

【Harmony】SCU暑期实训鸿蒙开发学习日记Day2

目录 Git 参考文章 常用操作 ArkTS的网络编程 Http编程 发送请求 GET POST 处理响应 JSON数据解析 处理响应头 错误处理 Web组件 用生命周期钩子实现登录验证功能 思路 代码示例 解读 纯记录学习日记&#xff0c;杂乱&#xff0c;误点的师傅可以掉了&#x1…

How to integrate GPT-4 model hosted on Azure with the gptstudio package

题意&#xff1a;怎样将托管在Azure上的GPT-4模型与gptstudio包集成&#xff1f; 问题背景&#xff1a; I am looking to integrate the OpenAI GPT-4 model into my application. Here are the details I have: Endpoint: https://xxxxxxxxxxxxxxx.openai.azure.com/Locatio…

LG 选择 Flutter 来增强其智能电视操作系统 webOS

可以这个话题会让大多数人困惑&#xff0c;2024 年了为什么还会冒出 webOS 这种老古董&#xff1f;然后 LG 为什么选择 webOS &#xff1f;现在为什么又选择 Flutter &#xff1f; 其实早在 Google I/O 发布 Flutter 3.22 版本的时候&#xff0c;就提到了 LG 选择 Flutter 来增…

tinymce富文本支持word内容同时粘贴文字图片上传 vue2

效果图 先放文件 文件自取tinymce: tinymce富文本简单配置及word内容粘贴图片上传 封装tinymce 文件自取&#xff1a;tinymce: tinymce富文本简单配置及word内容粘贴图片上传 页面引用组件 <TinymceSimplify refTinymceSimplify v-model"knowledgeBlockItem.content…

【leetcode】 字符串相乘(大数相乘、相加)

记录一下大数相乘相加方法&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: nu…

vue3前端开发-执行npm run dev提示报错怎么解决

vue3前端开发-执行npm run dev提示报错怎么解决&#xff01;今天在本地安装初始化了一个vue3的案例demo。但是当我执行npm run dev想启动它时报错了说&#xff0c;找不到dev。让我检查package.json文件是否包含dev。如下图所示&#xff1a; 实际上&#xff0c;不必惊慌&#xf…

iOS ------ tagged Pointer 内存对齐

一&#xff0c;tagged Pointer 为了节省内存和提高执行效率&#xff0c;苹果在64bit程序中引入了Tagged Pointer计数&#xff0c;用于优化NSNumber, NSDate, NSString等小对象的存储。一个指针或地址区域&#xff0c;除了放对象地址之外&#xff0c;也可以放其他额外的信息&am…

240717.LeetCode——2974.最小数字游戏

题目描述 你有一个下标从 0 开始、长度为 偶数 的整数数组 nums &#xff0c;同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏&#xff0c;游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下&#xff1a; 每一轮&#xff0c;Alice 先从 nums 中移除一个 …

转移C盘中的conda环境(包括.condarc文件修改,environment.txt文件修改,conda报错)

conda环境一般是默认安装到C盘的&#xff0c;若建立多个虚拟环境&#xff0c;时间长了&#xff0c;容易让本不富裕的C盘更加雪上加霜&#xff0c;下面给出将conda环境从C盘转移到D盘的方法。 目录 电脑软硬件转移方法查看当前conda目录转移操作第一步&#xff1a;.condarc文件修…

Apache Flink 入门

零、概述 Apache Flink 是一个高性能的开源分布式流处理框架&#xff0c;专注于实时数据流的处理。 它设计用于处理无界和有界数据流&#xff0c;在内存级速度下提供高效的有状态计算。 Flink 凭借其独特的Checkpoint机制和Exactly-Once语义&#xff0c;确保数据处理的准确性…

只用 CSS 能玩出什么花样?

在前端开发领域&#xff0c;CSS 不仅仅是一种样式语言&#xff0c;它更像是一位多才多艺的艺术家&#xff0c;能够创造出令人惊叹的视觉效果。本文将带你探索 CSS 的无限可能&#xff0c;从基本形状到动态动画&#xff0c;从几何艺术到仿生设计&#xff0c;只用 CSS 就能玩出令…

Vscode中Github copilot插件无法使用(出现感叹号)解决方案

1、击扩展或ctrl shift x ​​​​​​​ 2、搜索查询或翻找到Github compilot 3、点击插件并再左侧点击登录github 点击Sign up for a ... 4、跳转至github登录页&#xff0c;输入令牌完成登陆后返回VScode 5、插件可以正常使用

微服务实战系列之玩转Docker(三)

前言 镜像&#xff08;Image&#xff09;作为Docker的“水源”&#xff0c;取之于它&#xff0c;用之于它。这对于立志成为运维管理的撒手锏——Docker而言&#xff0c;重要性不言而喻。 我们在虚拟机时代&#xff08;当然现在依然ing…&#xff09;&#xff0c;如何快速完成…

成为CMake砖家(5): VSCode CMake Tools 插件基本使用

大家好&#xff0c;我是白鱼。 之前提到过&#xff0c;白鱼的主力 编辑器/IDE 是 VSCode&#xff0c; 也提到过使用 CMake Language Support 搭配 dotnet 执行 CMakeLists.txt 语法高亮。 对于阅读 CMakeLists.txt 脚本&#xff0c; 这足够了。 而在 C/C 开发过程中&#xff…

NXP i.MX8系列平台开发讲解 - 3.19 Linux TTY子系统(二)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. Linux 串口驱动 1.1 Uart 驱动注册流程 1.2 uart 操作函数 1.3 line discipline 2. Linux tty应用层使用…

FPGA 实现DDR4的读写

1 硬件设计 FPGA 端&#xff1a; DDR4: 2 验证方案 3 仿真验证 4 DDR4 下板验证