Java基础——网络编程

  1. 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。

1. 基本的通信架构

  1. 基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)
  2. 无论CS架构,还是BS架构的软件都必须依赖网络编程

2. 网络通信的三要素

2.1. IP

  1. 全称互联网协议地址,是设备在网络中的地址,是唯一的标识。
2.1.1. IP地址的形式
  1. IPv4(32位,点分十进制表示)
  2. IPv6(128位,分成8段表示,每段每四位编码成一个十六进制位表示,每段中间用:隔开)
2.1.2. 公网IP、内网IP
  1. 公网IP:是可以连接互联网的IP地址
  2. 内网IP:也叫局域网IP,只能组织或机构内部使用
  3. 192.168.开头的就是常见的局域网地址,范围为192.168.0.0-192.168.255.255,专门为组织机构内部使用
  4. 127.0.0.1、localhost代表本机,只会寻找当前所在的主机。
2.1.3. 常用命令
  1. ipconfig:查看本机IP地址
  2. ping IP地址:检查网络是否连通
2.1.4. InetAddress

代表IP地址

2.2. 端口

  1. 应用程序在设备中唯一的标识
  2. 是一个16位的二进制,范围是0~65535
2.2.1. 分类
  1. 周知端口:0~1023,内预先定义的知名应用占用(如,HTTP占用80,FTP占用21)
  2. 注册端口:1024~49151,分配给用户进程或某些应用程序
  3. 动态端口:49151~65535,一般不固定分配给某种进程,而是动态分配
  4. 我们自己开发的程序一般选择注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错

2.3. 协议

  1. 网络中的通信设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议。
2.3.1. 网络模型

2.3.2. UDP协议
  1. 用户数据报协议
  2. 无连接、不可靠通信
  3. 通信效率高,适合语音通话、视频直播等
2.3.3. TCP协议
  1. 传输控制协议
  2. 面向连接、可靠通信
  3. 目的是要保证在不可靠的信道上实现可靠的传输
  4. 三个步骤实现可靠通信:三次握手建立连接,传输数据进行确认,四次挥手断开连接。
  5. 可靠连接:客户端和服务器都能发送和接收数据,全双工
  6. 通信效率相对不高,但可靠,适用于网页、文件下载、支付等

3. UDP通信

  1. Java提供了一个java.net.DatagramSocket类来实现UDP通信。

3.1. 提供方法

3.2. 一发一收

public class Client {public static void main(String[] args) throws IOException {// 1. 创建客户端对象DatagramSocket socket = new DatagramSocket();// 2. 创建数据包对象, 封装要发的数据/*参数一 要发送的数据的字节数组参数二 要发送数据的字节数参数三 目标服务端地址参数四 目标服务端端口*/byte[] bytes = "我是客户端, 123".getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 6666);// 3. 开始发送数据到服务端socket.send(packet);System.out.println("客户端发送数据完毕");socket.close(); // 释放系统资源}
}
public class Server {public static void main(String[] args) throws Exception {// 1. 创建一个服务端对象 并注册端口DatagramSocket server = new DatagramSocket(6666);// 2. 创建数据包对象 用于接收数据byte[] buffer = new byte[1024 * 64]; // 64kbDatagramPacket packet = new DatagramPacket(buffer, buffer.length);// 3. 接收数据server.receive(packet);// 4. 将接收的数据输出 接收多少 输出多少System.out.println(new String(buffer, 0, packet.getLength()));server.close(); // 释放资源}
}

3.3. 多发多收

public class Client {public static void main(String[] args) throws IOException {// 1. 创建客户端对象DatagramSocket socket = new DatagramSocket();// 2. 创建数据包对象, 封装要发的数据/*参数一 要发送的数据的字节数组参数二 要发送数据的字节数参数三 目标服务端地址参数四 目标服务端端口*/Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请说");String s = scanner.nextLine();byte[] bytes = s.getBytes();if("exit".equals(s)){socket.close();System.out.println("退出成功");break;}DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 6666);// 3. 开始发送数据到服务端socket.send(packet);}}
}
public class Server {public static void main(String[] args) throws Exception {// 1. 创建一个服务端对象 并注册端口DatagramSocket server = new DatagramSocket(6666);// 2. 创建数据包对象 用于接收数据byte[] buffer = new byte[1024 * 64]; // 64kbDatagramPacket packet = new DatagramPacket(buffer, buffer.length);while (true) {// 3. 接收数据server.receive(packet);// 4. 将接收的数据输出 接收多少 输出多少System.out.println(new String(buffer, 0, packet.getLength()));// 5. 获取客户端主机名 和 端口System.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());System.out.println("-----------------------------");}}
}

4. TCP通信

  1. Java提供了一个java.net.Socket类来实现TCP通信

4.1. 客户端

public class Client {public static void main(String[] args) throws Exception {// 1. 创建一个Socket对象 请求与服务端进行连接Socket socket = new Socket(InetAddress.getLocalHost(), 8888);// 2. 获取输出流 向服务端发送数据OutputStream outputStream = socket.getOutputStream();// 3. 使用高级流包装原始流DataOutputStream dataOutputStream = new DataOutputStream(outputStream);// 4. 向服务端发送数据dataOutputStream.writeUTF("你好, 我是客户端");dataOutputStream.close(); // 释放资源socket.close();}
}

4.2. 服务端

  1. 服务端是通过java.net.ServerSocket类来实现的。

public class Server {public static void main(String[] args) throws Exception {// 1. 创建ServerSocket对象, 并指名端口号ServerSocket serverSocket = new ServerSocket(8888);// 2. 使用accept方法, 等待客户端的连接请求Socket socket = serverSocket.accept();// 3. 获取字节输入流InputStream inputStream = socket.getInputStream();// 4. 包装成数据输入流DataInputStream dataInputStream = new DataInputStream(inputStream);// 5. 读取客户端发来的数据String s = dataInputStream.readUTF();System.out.println(s);// 释放资源dataInputStream.close();socket.close();}
}

4.3. 多发多收

  1. 客户端
public class Client {public static void main(String[] args) throws Exception {// 1. 创建一个Socket对象 请求与服务端进行连接Socket socket = new Socket(InetAddress.getLocalHost(), 8888);// 2. 获取输出流 向服务端发送数据OutputStream outputStream = socket.getOutputStream();// 3. 使用高级流包装原始流DataOutputStream dataOutputStream = new DataOutputStream(outputStream);Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请说");String s = scanner.nextLine();if("exit".equals(s)){dataOutputStream.close(); // 释放资源socket.close();System.out.println("退出成功");break;}// 4. 向服务端发送数据dataOutputStream.writeUTF(s);dataOutputStream.flush();}}
}
  1. 服务端
public class Server {public static void main(String[] args) throws Exception {// 1. 创建ServerSocket对象, 并指名端口号ServerSocket serverSocket = new ServerSocket(8888);// 2. 使用accept方法, 等待客户端的连接请求Socket socket = serverSocket.accept();// 3. 获取字节输入流InputStream inputStream = socket.getInputStream();// 4. 包装成数据输入流DataInputStream dataInputStream = new DataInputStream(inputStream);while (true) {try {// 5. 读取客户端发来的数据String s = dataInputStream.readUTF();System.out.println(s);} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress() + "离线了");dataInputStream.close();socket.close();break;}}}
}

4.4. 实现与多个客户端同时通信

  1. 上述的服务端程序是不支持与多个客户端同时通信的,因为服务端现在只有一个主线程,只能处理一个客户端的消息。
  2. 可以通过多线程实现与多个客户端的同时通信

客户端

public class Client {public static void main(String[] args) throws Exception {// 1. 创建一个Socket对象 请求与服务端进行连接Socket socket = new Socket(InetAddress.getLocalHost(), 8888);// 2. 获取输出流 向服务端发送数据OutputStream outputStream = socket.getOutputStream();// 3. 使用高级流包装原始流DataOutputStream dataOutputStream = new DataOutputStream(outputStream);Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请说");String s = scanner.nextLine();if("exit".equals(s)){dataOutputStream.close(); // 释放资源socket.close();System.out.println("退出成功");break;}// 4. 向服务端发送数据dataOutputStream.writeUTF(s);dataOutputStream.flush();}}
}

服务端

public class Server {public static void main(String[] args) throws Exception {// 1. 创建ServerSocket对象, 并指名端口号ServerSocket serverSocket = new ServerSocket(8888);while (true) {// 2. 使用accept方法, 等待客户端的连接请求Socket socket = serverSocket.accept();System.out.println("有人上线了" + socket.getRemoteSocketAddress());// 3. 将这个客户端对应的Socket管道交给独立的线程处理new ServerReaderThread(socket).start();}}
}

自定义线程

public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {try {// 1. 获取字节输入流InputStream inputStream = this.socket.getInputStream();// 2. 使用高级流进行封装DataInputStream dataInputStream = new DataInputStream(inputStream);while (true){// 3. 读取信息try {String s = dataInputStream.readUTF();System.out.println(s);} catch (IOException e) {System.out.println("有人下线了" + socket.getRemoteSocketAddress());dataInputStream.close();socket.close();break;}}} catch (IOException e) {throw new RuntimeException(e);}}
}

4.5. TCP通信实现BS架构

  1. 服务端
public class Server {public static void main(String[] args) throws Exception {// 1. 创建ServerSocket对象, 并指名端口号ServerSocket serverSocket = new ServerSocket(8080);while (true) {// 2. 使用accept方法, 等待浏览器的连接请求Socket socket = serverSocket.accept();System.out.println("有人上线了" + socket.getRemoteSocketAddress());// 3. 将这个浏览器对应的Socket管道交给独立的线程处理new ServerReaderThread(socket).start();}}
}
  1. 自定义线程
public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {// 处理浏览器请求, 返回一个你好,666try {OutputStream outputStream = socket.getOutputStream();PrintStream printStream = new PrintStream(outputStream);printStream.println("HTTP/1.1 200 OK");printStream.println("Content-Type:text/html;charset=UTF-8");printStream.println(); // 必须换行printStream.println("<h1>你好, 666</h1>");printStream.close();socket.close();} catch (IOException e) {throw new RuntimeException(e);}}
}
  1. 使用线程池优化
public class Server {public static void main(String[] args) throws Exception {// 1. 创建ServerSocket对象, 并指名端口号ServerSocket serverSocket = new ServerSocket(8080);// 创建线程池ThreadPoolExecutor pool = new ThreadPoolExecutor(8 * 2, 8 * 2, 0,TimeUnit.SECONDS, new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());while (true) {// 2. 使用accept方法, 等待浏览器的连接请求Socket socket = serverSocket.accept();System.out.println("有人上线了" + socket.getRemoteSocketAddress());// 3. 将这个浏览器对应的Socket管道交给独立的线程处理// 创建Runnable任务对象ServerReaderRunnable runnable = new ServerReaderRunnable(socket);pool.execute(runnable);}}
}

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

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

相关文章

变分自编码器(VAE, Variational Autoencoder)

代码说明 VAE 模型结构&#xff1a; 编码器将输入数据&#xff08;如 MNIST 图像&#xff09;映射到潜在空间&#xff0c;生成均值 (mu) 和对数方差 (logvar)。 通过重新参数化技巧 (reparameterize) 从正态分布中采样潜在向量 z。 解码器将潜在向量 z 映射回原始空间&#xf…

1. Django中的URL调度器 (项目创建与简单测试)

1. 创建 Django 项目 运行以下命令创建一个名为 blog_project 的 Django 项目&#xff1a; django-admin startproject blog_project2. 创建博客应用 Django 中&#xff0c;项目可以包含多个应用。创建一个名为 blog 的应用&#xff1a; cd blog_project python manage.py …

多目标优化算法:多目标黑翅鸢算法(MOBKA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、黑翅鸢算法介绍 黑翅鸢优化算法&#xff08;Black-winged Kite Algorithm, BKA&#xff09;是2024年提出的一种元启发式优化算法&#xff0c;其灵感来源于黑翅鸢的迁徙和捕食行为。这种算法通过模拟黑翅鸢在捕食过程中的飞行和搜索策略&#xff0c;被用来解决优化问题&…

记一次Mysql远程连接报错

问题描述&#xff1a; Plugin caching sha2 password could not be loaded: 在wsl2用docker中拉取了mysql镜像&#xff0c;启动后想在win下的环境远程连接到docker中的mysql&#xff0c;报错了&#xff0c;报错如下所示 搜寻了相关的资料发现&#xff0c;在拉下来的myslq版本…

STM32F103移植FreeRTOS

1. 源码下载 在https://www.freertos.org/中下载源码&#xff0c;这里下载的是FreeRTOSv202212.01版本&#xff0c;源码内容解释可参考&#xff1a; https://rtos.100ask.net/zh/FreeRTOS/DShanMCU-F103/chapter7.html#_7-1-freertos%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84拷贝…

CAD多段线两侧偏移(交叉线容易出错)

public void 交叉多段线容易出错(){List<Curve> entse Z.db.SelectEntities<Curve>();List<Polyline> ents Z.db.CurvesToPolyLines(entse);//Z.db.SelectEntities<Polyline>();double offsetDistance 5.0;//偏移距离List<Polyline> resultP…

数据库EVA模式与传统数据库模式 | 分析对比及应用场景

目录 1. 实战场景2. 基本知识3. 应用场景 1. 实战场景 从实战进行探讨以及深入&#xff1a; 事因是同事给我创建表结构的时候&#xff0c;以如下这种方式进行创建&#xff1a; 看到这张表的结构可能会思考&#xff1a; 为啥设备的部件值&#xff08;日期、数值、字符串&…

算法【Java】—— 动态规划之简单多状态 dp 问题

按摩师 https://leetcode.cn/problems/the-masseuse-lcci 状态表示&#xff1a;根据经验和题目要求&#xff0c;达到 i 位置的时候&#xff0c;预约时间最长 接着我们细分状态表示&#xff1a;在遍历数组的时候&#xff0c;到达 i 位置的时候&#xff0c;又两种情况&#xff…

小鸡模拟器 1.8.11 | 街机怀旧重温经典游戏,支持手柄

小鸡模拟器是一款支持多种经典游戏机模拟的游戏应用&#xff0c;包括街机、索尼(SONY)、世嘉、任天堂等主流掌机游戏以及PSP、GBA、NDS、SFC(超级任天堂SNES)、FC(红白机NES)、MD(世嘉MEGA DRIVE)、PS1、PS2等。应用支持手柄完美操作&#xff0c;兼容安卓手柄&#xff0c;让玩家…

Pygame坦克大战游戏开发实验报告

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Springboot3.3.5 启动流程之 tomcat启动流程介绍

在文章 Springboot3.3.5 启动流程&#xff08;源码分析&#xff09; 中讲到 应用上下文&#xff08;applicationContext&#xff09;刷新(refresh)时使用模板方法 onRefresh 创建了 Web Server. 本文将详细介绍 ServletWebServer — Embedded tomcat 的启动流程。 首先&…

电子应用设计方案-12:智能窗帘系统方案设计

一、系统概述 本设计方案旨在打造便捷、高效的全自动智能窗帘系统。 二、硬件选择 1. 电机&#xff1a;选用低噪音、扭矩合适的智能电机&#xff0c;根据窗帘尺寸和重量确定电机功率&#xff0c;确保能平稳拉动窗帘。 2. 轨道&#xff1a;选择坚固、顺滑的铝合金轨道&…

Javaweb-day12(登录认证)

登录功能 登录校验&#xff08;重点&#xff09; 登录校验指的是在服务器接收到浏览器发送过来的请求之后&#xff0c;首先要对这个请求进行校验&#xff0c;先要校验一下用户登录了没有 怎么来实现登录校验的操作呢&#xff1f;具体的实现思路可以分为两部分&#xff1a; 在…

记录大学Linux运维上机考试题目和流程

备注&#xff1a;今年的Linux操作系统考试已经全部结束&#xff0c;仅作为一个记录和留念 前提&#xff1a;配置环回网卡和环境和nat网卡 1、搭建dns服务器 2、Apache和http服务 3、搭建postfix邮件服务器实现邮件发送 4、搭建vsftpdFTP服务器实现文件上传 题目如下&…

Linux驱动开发第2步_“物理内存”和“虚拟内存”的映射

“新字符设备的GPIO驱动”和“设备树下的GPIO驱动”都要用到寄存器地址&#xff0c;使用“物理内存”和“虚拟内存”映射时&#xff0c;非常不方便&#xff0c;而pinctrl和gpio子系统的GPIO驱动&#xff0c;非常简化。因此&#xff0c;要重点学习pinctrl和gpio子系统下的GPIO驱…

关于强化学习的一份介绍

在这篇文章中&#xff0c;我将介绍与强化学习有关的一些东西&#xff0c;具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习&#xff1a;做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作&#xff0c;而是必须通…

vue内置指令和自定义指令

常见的指令&#xff1a; v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简…

《Java核心技术 卷I》用户界面AWT事件继承层次

AWT事件继承层次 EventObject类有一个子类AWTEvent&#xff0c;它是所有AWT事件类的父类。 Swing组件会生成更多其他事件对象&#xff0c;都直接拓展自EventObject而不是AWTEvent。 AWT将事件分为底层(low-level)事件和语义事件。 语义事件&#xff1a;表示用户的动作事件&…

AntFlow:一款高效灵活的开源工作流引擎

AntFlow 是一款功能强大、设计优雅的开源工作流引擎&#xff0c;其灵感来源于钉钉的工作流设计理念&#xff0c;旨在为企业和开发者提供灵活、高效的工作流解决方案。AntFlow 支持复杂的业务流程管理&#xff0c;具有高度可定制性&#xff0c;且拥有现代化的前端设计&#xff0…

2024年江西省职业院校技能大赛网络建设与运维技能竞赛方案赛项规程(中职组)

2024 年江西省职业院校技能大赛网络建设与运维赛项竞赛&#xff0c;为 确保竞赛工作顺利开展&#xff0c;特制定本竞赛方案。 一、赛项介绍 1.赛项简介&#xff1a;本赛项设置网络理论测试、网络建设与调试、 服务搭建与运维三个模块&#xff0c;竞赛内容包括&#xff1a;职…