网络编程

一、什么是网络编程

二、基本的通信架构

三、网络通信的三要素

1.IP地址

1.IPv4,IPv6

2.IP域名

3.公网IP ,内网IP,本机IP

4.InetAddress

import java.net.InetAddress;public class InetAddressTest {public static void main(String[] args) throws Exception {//获取本机IP地址对象InetAddress ip1 = InetAddress.getLocalHost ();System.out.println ( ip1.getHostAddress () );//获取本机IP地址System.out.println ( ip1.getHostName () );//获得主机名//2.获取指定IP地址或者域名的对象InetAddress ip2 = InetAddress.getByName ( "WWW.baidu.com" );System.out.println ( ip2.getHostName () );//WWW.baidu.comSystem.out.println ( ip2.getHostAddress () );//39.156.66.14System.out.println ( ip2.isReachable ( 6000 ) );//判断能否联通}
}

2.端口号

3.协议

1.什么是协议

2.UDP协议

3.TCP协议

四、网络通信

1.UDP通信

1.常用API

2.代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class Client {public static void main(String[] args) throws Exception {//1.创建客户端对象(发送方)DatagramSocket socket = new DatagramSocket (7777);//2.创建数据包对象封装要发出去的数据
//        DatagramPacket(byte[], int length,InetAddress,int port)
/** byte[]:代表要传输的数据*  int length:发出去数据的大小*  InetAddress:服务端的IP地址*  int port:服务端程序的端口号**/byte[] bytes = "我是快乐的客户端,我爱你abc".getBytes ();DatagramPacket packet = new DatagramPacket (bytes,bytes.length, InetAddress.getLocalHost (),6666 );//3.开始正式发送数据包出去socket.send ( packet );System.out.println ("客户端数据发送完毕");socket.close ();//释放资源}
}import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class Server {public static void main(String[] args) throws Exception {//1.创建一个服务端对象并注册端口DatagramSocket server = new DatagramSocket ( 6666 );//2.创建一个数据包对象,用于接受数据byte[] bytes = new byte[1024*64];//64kbDatagramPacket packet = new DatagramPacket (bytes,bytes.length);//3.接收客户端发来的数据server.receive ( packet );//4.把字节数组中,接受的数据打印出来//读取多少倒出多少//获取本次数据包接收了多少数据int length = packet.getLength ();//通过数据包拿到客户端的IP地址System.out.println ( packet.getAddress ().getHostAddress () );//通过数据包拿到客户端的端口号System.out.println ( packet.getPort () );String s = new String ( bytes,0,length );System.out.println ( s );server.close ();}
}
3.UDP通信-多发多收
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建客户端对象(发送方)DatagramSocket socket = new DatagramSocket ();//2.创建数据包对象封装要发出去的数据
//        DatagramPacket(byte[], int length,InetAddress,int port)
/** byte[]:代表要传输的数据*  int length:发出去数据的大小*  InetAddress:服务端的IP地址*  int port:服务端程序的端口号**/Scanner sc=new Scanner ( System.in );while (true) {System.out.println ("请说:");String msg = sc.nextLine ();byte[] bytes1 = msg.getBytes ();byte[] bytes = "我是快乐的客户端,我爱你abc".getBytes ();DatagramPacket packet = new DatagramPacket (bytes1,bytes1.length, InetAddress.getLocalHost (),6666 );//3.开始正式发送数据包出去socket.send ( packet );if ("exit".equals ( msg )){System.out.println ("欢迎下次光临,退出成功");break;}}}
}import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Server {public static void main(String[] args) throws Exception {//1.创建一个服务端对象并注册端口DatagramSocket server = new DatagramSocket ( 6666 );//2.创建一个数据包对象,用于接受数据byte[] bytes = new byte[1024*64];//64kbDatagramPacket packet = new DatagramPacket (bytes,bytes.length);//3.接收客户端发来的数据while (true) {server.receive ( packet );//4.把字节数组中,接受的数据打印出来//读取多少倒出多少//获取本次数据包接收了多少数据int length = packet.getLength ();//通过数据包拿到客户端的IP地址System.out.println ( packet.getAddress ().getHostAddress () );//通过数据包拿到客户端的端口号System.out.println ( packet.getPort () );String s = new String ( bytes,0,length );System.out.println ( s );System.out.println ("--------------------------------------------------------------------");}}
}

2.TCP通信

1.如何实现TCP通信

2.客户端开发

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {//1.创建Socket对象,并同时请求服务器端程序的连接Socket socket = new Socket ("127.0.0.1",8888);//2.从socket管道中得到一个字节输出流,用来发送数据给服务端OutputStream os = socket.getOutputStream ();//3.把低级的字节输出流,包装成数据输出流DataOutputStream dos = new DataOutputStream ( os );//4.开始写数据出去dos.writeUTF ( "在一起好吗?" );dos.close ();socket.close ();}
}
3.服务端开发

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println ("----------服务端启动成功");//1.创建一个服务端对象并设置端口号ServerSocket serverSocket = new ServerSocket ( 8888 );//2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept ();//3.从socket通信管道中得到一个字节输入流InputStream is = socket.getInputStream ();//4.把原始字字节输入流包装成数据输入流DataInputStream dis = new DataInputStream ( is );//5.使用数据输入流读取客户端发送的消息String s = dis.readUTF ();System.out.println ( s );//获取客户端的IP地址System.out.println ( socket.getRemoteSocketAddress () );dis.close ();socket.close ();}
}
4.多发多收

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建Socket对象,并同时请求服务器端程序的连接Socket socket = new Socket ("127.0.0.1",8888);//2.从socket管道中得到一个字节输出流,用来发送数据给服务端OutputStream os = socket.getOutputStream ();//3.把低级的字节输出流,包装成数据输出流DataOutputStream dos = new DataOutputStream ( os );//4.开始写数据出去Scanner scanner = new Scanner (System.in);while (true) {System.out.println ("请说");String s = scanner.nextLine ();dos.writeUTF ( s );dos.flush ();if ("exit".equals ( s )){System.out.println ("欢迎下次使用,成功退出");dos.close ();socket.close ();}}}
}import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println ("----------服务端启动成功");//1.创建一个服务端对象并设置端口号ServerSocket serverSocket = new ServerSocket ( 8888 );//2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept ();//3.从socket通信管道中得到一个字节输入流InputStream is = socket.getInputStream ();//4.把原始字字节输入流包装成数据输入流DataInputStream dis = new DataInputStream ( is );//5.使用数据输入流读取客户端发送的消息while (true) {try {String s = dis.readUTF ();System.out.println ( s );//获取客户端的IP地址System.out.println ( socket.getRemoteSocketAddress () );System.out.println ("--------------------------------------");} catch (IOException e) {System.out.println ( socket.getRemoteSocketAddress () + "离线了" );socket.close ();dis.close ();break;}}}
}
5.支持与多个客户端同时通信(上下线逻辑)

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;public class ServerReaderThread extends Thread{private  Socket socket;public ServerReaderThread(){}public ServerReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream ();DataInputStream dis = new DataInputStream ( is );while (true) {try {String s = dis.readUTF ();System.out.println ( s );} catch (Exception e) {System.out.println ("下线了"+socket.getRemoteSocketAddress ());dis.close ();socket.close ();break;}}} catch (Exception e) {e.printStackTrace ();}}
}import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建Socket对象,并同时请求服务器端程序的连接Socket socket = new Socket ("127.0.0.1",8888);//2.从socket管道中得到一个字节输出流,用来发送数据给服务端OutputStream os = socket.getOutputStream ();//3.把低级的字节输出流,包装成数据输出流DataOutputStream dos = new DataOutputStream ( os );//4.开始写数据出去Scanner scanner = new Scanner (System.in);while (true) {System.out.println ("请说");String s = scanner.nextLine ();dos.writeUTF ( s );dos.flush ();if ("exit".equals ( s )){System.out.println ("欢迎下次使用,成功退出");dos.close ();socket.close ();}}}
}import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println ("----------服务端启动成功");//1.创建一个服务端对象并设置端口号ServerSocket serverSocket = new ServerSocket ( 8888 );while (true) {//2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept ();System.out.println (socket.getRemoteSocketAddress ()+"上线了");//3.把这个客户端对应的socket通信管道,交给一个独立的线程负责处理new ServerReaderThread (socket).start ();}}
}

五、TCP 通信综合案例

1.即使通信-群聊

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class ClientReaderThread extends Thread{private Socket socket;public ClientReaderThread(){}public ClientReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream ();DataInputStream dis = new DataInputStream ( is );while (true) {try {String s = dis.readUTF ();System.out.println ( s );//把这个消息发给全部的客户端进行接受sendMsgAll(s);} catch (Exception e) {System.out.println ("自己下线了"+socket.getRemoteSocketAddress ());dis.close ();socket.close ();break;}}} catch (Exception e) {e.printStackTrace ();}}private void sendMsgAll(String s) throws Exception {//发送给全部在线的Socket对象for (Socket onLineSocket : Server.onLineSockets) {OutputStream os = onLineSocket.getOutputStream ();DataOutputStream dos = new DataOutputStream ( os );dos.writeUTF ( s );dos.flush ();}}
}import java.io.*;
import java.net.Socket;public class ServerReaderThread extends Thread{private  Socket socket;public ServerReaderThread(){}public ServerReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream ();DataInputStream dis = new DataInputStream ( is );while (true) {try {String s = dis.readUTF ();System.out.println ( s );//把这个消息发给全部的客户端进行接受sendMsgAll(s);} catch (Exception e) {System.out.println ("下线了"+socket.getRemoteSocketAddress ());Server.onLineSockets.remove ( socket );//离线时抹掉Socketdis.close ();socket.close ();break;}}} catch (Exception e) {e.printStackTrace ();}}private void sendMsgAll(String s) throws Exception {//发送给全部在线的Socket对象for (Socket onLineSocket : Server.onLineSockets) {OutputStream os = onLineSocket.getOutputStream ();DataOutputStream dos = new DataOutputStream ( os );dos.writeUTF ( s );dos.flush ();}}
}import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建Socket对象,并同时请求服务器端程序的连接Socket socket = new Socket ("127.0.0.1",8888);//创建一个独立的线程,负责随时从socket中接受来自服务端的消息new ClientReaderThread (socket).start ();//2.从socket管道中得到一个字节输出流,用来发送数据给服务端OutputStream os = socket.getOutputStream ();//3.把低级的字节输出流,包装成数据输出流DataOutputStream dos = new DataOutputStream ( os );//4.开始写数据出去Scanner scanner = new Scanner (System.in);while (true) {System.out.println ("请说");String s = scanner.nextLine ();dos.writeUTF ( s );dos.flush ();if ("exit".equals ( s )){System.out.println ("欢迎下次使用,成功退出");dos.close ();socket.close ();}}}
}import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Server {public static List<Socket> onLineSockets=new ArrayList<> ();public static void main(String[] args) throws Exception {System.out.println ("----------服务端启动成功");//1.创建一个服务端对象并设置端口号ServerSocket serverSocket = new ServerSocket ( 8888 );while (true) {//2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept ();onLineSockets.add ( socket );//有连接就存储Socket管道System.out.println (socket.getRemoteSocketAddress ()+"上线了");//3.把这个客户端对应的socket通信管道,交给一个独立的线程负责处理new ServerReaderThread (socket).start ();}}
}

2.实现一个简易的BS架构

B/S架构
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Server {public static List<Socket> onLineSockets=new ArrayList<> ();public static void main(String[] args) throws Exception {System.out.println ("----------服务端启动成功");//1.创建一个服务端对象并设置端口号ServerSocket serverSocket = new ServerSocket ( 8888 );while (true) {//2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept ();onLineSockets.add ( socket );//有连接就存储Socket管道System.out.println (socket.getRemoteSocketAddress ()+"上线了");//3.把这个客户端对应的socket通信管道,交给一个独立的线程负责处理new ServerReaderThread (socket).start ();}}
}import java.io.*;
import java.net.Socket;public class ServerReaderThread extends Thread{private  Socket socket;public ServerReaderThread(){}public ServerReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {//立即响应一个网页内容:“黑马程序员”给浏览器提示try {OutputStream os = socket.getOutputStream ();PrintStream ps = new PrintStream ( os );ps.println ("HTTP/1.1 200 OK");ps.println ("Content-Type:text/html;charset=UTF-8");ps.println ();//必须换行ps.println ("<div >黑马666</div>");socket.close ();//响应网页短连接} catch (Exception e) {e.printStackTrace ();}}}
使用线程池优化

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class Server {public static List<Socket> onLineSockets=new ArrayList<> ();public static void main(String[] args) throws Exception {System.out.println ("----------服务端启动成功");//1.创建一个服务端对象并设置端口号ServerSocket serverSocket = new ServerSocket ( 8888 );//创建一个线程池,负责处理通信管道的任务ThreadPoolExecutor pool = new ThreadPoolExecutor (16*2,16*2,0, TimeUnit.SECONDS,new ArrayBlockingQueue<> ( 8 ), Executors.defaultThreadFactory (),new ThreadPoolExecutor.AbortPolicy () );while (true) {//2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept ();onLineSockets.add ( socket );//有连接就存储Socket管道System.out.println (socket.getRemoteSocketAddress ()+"上线了");//3.把这个客户端对应的socket通信管道,交给一个独立的线程负责处理//把通信管道封装成任务对象pool.execute ( new ServerReaderRunnable (socket));}}
}import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;public class ServerReaderRunnable implements Runnable{private  Socket socket;public ServerReaderRunnable(){}public ServerReaderRunnable(Socket socket){this.socket=socket;}@Overridepublic void run() {//立即响应一个网页内容:“黑马程序员”给浏览器提示try {OutputStream os = socket.getOutputStream ();PrintStream ps = new PrintStream ( os );ps.println ("HTTP/1.1 200 OK");ps.println ("Content-Type:text/html;charset=UTF-8");ps.println ();//必须换行ps.println ("<div >黑马666</div>");socket.close ();//响应网页短连接} catch (Exception e) {e.printStackTrace ();}}}

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

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

相关文章

Hadoop、Spark、Storm、Flink区别及选择

hadoop、spark、storm、flink如何选择 hadoop和spark是更偏向于对大量离线数据进行批量计算&#xff0c;提高计算速度storm和flink适用于实时在线数据&#xff0c;即针对源源不断产生的数据进行实时处理。至于storm和flink之间的区别在于flink的实时性和吞吐量等要比storm高。…

Java中的泛型

一. 泛型简介 泛型&#xff0c;即“参数化类型”。 作为Java中常用且重要的一个概念&#xff0c;泛型帮我们实现了代码重用&#xff0c;也保证了类型安全。但关于它的详细内容&#xff0c;目前很多同学还不清楚&#xff0c;所以接下来就带各位来学习这个重要的知识点。 背景 …

利用fiddler正向代理前端请求到本地后端

前景&#xff1a;在实际开发测试环境中&#xff0c;&#xff08;前后端均已上线到测试服务器或前端以上线而后端还在开发中)。在测试过程中&#xff08;前端页面点击&#xff0c;功能测试&#xff09;发现了bug或异常点。 正常排查问题可能是先利用浏览器检查工具查看接口的返回…

flv怎么转换成mp4格式?准备3个方法给大家

flv怎么转换成mp4格式&#xff1f;FLV是一种流行的视频文件格式&#xff0c;最初由Adobe公司开发&#xff0c;用于在Web上播放和传输视频内容。FLV格式以其较小的文件大小和较高的压缩比而闻名&#xff0c;并广泛应用于在线视频分享平台、流媒体服务和网络广告等领域。能够提供…

驱动开发---基于gpio子系统编写LED灯的驱动

一、GPIO子系统相关API 1.解析GPIO相关的设备树节点 struct device_node *of_find_node_by_path(const char *path) 功能&#xff1a;根据设备树节点路径解析设备树节点信息 参数&#xff1a; path&#xff1a;设备树所在的节点路径 /mynode0X12345678 返回值&#xff1a;成…

JS的基本组成

JavaScript的实现包括以下3个部分&#xff1a; 模块功能ECMAScript(核心)描述了JS的语法和基本对象。文档对象模型 &#xff08;DOM&#xff09;处理网页内容的方法和接口浏览器对象模型&#xff08;BOM&#xff09;与浏览器交互的方法和接口 javascript 有三部分构成&#…

腾讯mini项目-【指标监控服务重构-会议记录】2023-07-26

2023-07-26组长会议纪要 A组 项目对齐和问题 分配需求&#xff0c;SLI指标上报&#xff0c;暂时没有实际效果 每个人负责一条指标&#xff0c;同步代码&#xff0c;时间问题还是难题跟B组同学请教&#xff0c;答疑 问题&#xff1a;启动 Tracer 【已解决】 环境问题&#xf…

Python读取Excel每一行为列表—大PK(openpyxl\pandas\xlwings\xlrd)看谁用时少?

目录 背景使用—openpyxl&#xff08;耗时89秒输出&#xff09;使用—pandas&#xff08;耗时44秒输出&#xff09;使用—xlwings&#xff08;耗时15秒输出&#xff09;使用—xlrd&#xff08;耗时47秒输出&#xff09;总结 背景 我们在平常办公的时候&#xff0c;尤其是财务人…

asisctf 2023 web hello wp

hello 开题&#xff0c;直接给了源码。 <?php /* Read /next.txt Hint for beginners: read curls manpage. */ highlight_file(__FILE__); $url file:///hi.txt; if(array_key_exists(x, $_GET) &&!str_contains(strtolower($_GET[x]),file) && !str_c…

ElementUI之动态树+数据表格+分页

目录 前言 一.ElementUI之动态树 1.前端模板演示 2.数据绑定 2.1 通过链接获取后台数据 2.2 对链接进行绑定 2.3添加动态路由 2.4 配置路由 3.效果演示 二.数据表格动态分页 1.前端模板 2.通过JS交互获取后端数据 3 效果演示 前言 Element UI 是一个基于 Vue.js 的开…

64位Ubuntu20.04.5 LTS系统安装32位运行库

背景&#xff1a; 在ubutu&#xff08;版本为20.04.5 LTS&#xff09;中运行./arm-none-linux-gnueabi-gcc -v 后提示“no such device”。 经多方查证&#xff0c;是ubutu的版本是64位的&#xff0c;而需要运行的编译工具链是32位的&#xff0c;因此会不兼容。 解决方法就是在…

反射学习笔记

反射学习笔记 一、反射入门案例 在反射中&#xff0c;万物皆对象&#xff0c;方法也是对象。反射可以在不修改源码的情况下&#xff0c;只需修改配置文件&#xff0c;就能实现功能的改变。 实体类 /*** 动物猫类*/ public class Cat {private String name;public void hi()…

系统安全测试要怎么做?

进行系统安全测试时&#xff0c;可以按照以下详细的步骤进行&#xff1a; 1、信息收集和分析&#xff1a; 收集系统的相关信息&#xff0c;包括架构、部署环境、使用的框架和技术等。 分析系统的安全需求、威胁模型和安全策略等文档。 2、威胁建模和风险评估&#xff1a; …

gitee-快速设置

快速设置— 如果你知道该怎么操作&#xff0c;直接使用下面的地址 HTTPS SSH: gitgitee.com:liuzl33078235/esp-idf.git 我们强烈建议所有的git仓库都有一个README, LICENSE, .gitignore文件 初始化 readme 文件 Git入门&#xff1f;查看 帮助 , Visual Studio / TortoiseG…

el-table 指定层级展开

先来看看页面默认全部展开时页面的显示效果&#xff1a;所有节点被展开&#xff0c;一眼望去杂乱无章&#xff01; 那么如何实现只展开指定的节点呢&#xff1f;最终效果如下&#xff1a;一眼看去很舒爽。 干货上代码&#xff1a; <el-table border v-if"refreshTabl…

软件测试-测试用例

软件测试-测试用例 1.什么是测试用例 为了实施测试而向被测系统提供的一组集合。这组集合包括测试环境、操作步骤、测试数据、预期结果等要素。 举例&#xff1a;对一个垃圾桶设计测试用例 2.设计测试用例的万能公式 设计测试用例的万能公式&#xff1a;功能测试性能测试界…

卤制品配送经营商城小程序的用处是什么

卤制品也是食品领域重要的分支&#xff0c;尤其对年轻人来说&#xff0c;只要干净卫生好吃价格合理&#xff0c;那复购率宣传性自是不用说&#xff0c;而随着互联网发展&#xff0c;传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…

【漏洞复现】企望制造 ERP命令执行

漏洞描述 由于企望制造 ERP comboxstore.action接口权限设置不当&#xff0c;默认的配置可执行任意SQL语句&#xff0c;利用xp_cmdshell函数可远程执行命令&#xff0c;未经认证的攻击者可通过该漏洞获取服务器权限。 免责声明 技术文章仅供参考&#xff0c;任何个人和组织…

Maven项目package为jar包后在window运行报A JNI error has occurred

原因&#xff1a;本地java版本与项目结构中使用的java版本不一致&#xff08;之前因为别的需求把idea的java版本改为了18&#xff09; 解决方法 打开项目结构&#xff0c;将idea的java版本改为与本地一致 再修改项目中的pom.xml 重新编译&#xff0c;package即可

Spark集成ClickHouse(笔记)

目录 前言&#xff1a; 一.配置环境 1.安装clickhouse驱动 2.配置clickhouse环境 二.spark 集成clickhouse 直接上代码&#xff0c;里面有一些注释哦&#xff01; 前言&#xff1a; 在大数据处理和分析领域&#xff0c;Spark 是一个非常强大且广泛使用的开源分布式计算框架…