Java实战报错 tcp
为什么报错tcp
Preview
从图片中的错误信息来看,程序遇到了 java.net.BindException
,具体错误信息是 "Address already in use: bind"。这意味着你的程序试图绑定到一个已经被其他进程占用的端口(在本例中是9999端口)。
以下是一些可能的原因和解决方法:
-
检查是否有其他进程正在使用该端口:
- 在Windows上,可以使用命令
netstat -ano | findstr :9999
来查找正在使用9999端口的进程。 - 在Linux或Mac上,可以使用命令
netstat -tuln | grep :9999
。
- 在Windows上,可以使用命令
-
终止占用该端口的进程:
- 如果找到了占用端口的进程,可以通过其PID来终止它。例如,在Windows上使用
taskkill /PID <PID>
,在Linux或Mac上使用kill <PID>
。
- 如果找到了占用端口的进程,可以通过其PID来终止它。例如,在Windows上使用
-
更改端口号:
- 如果无法终止占用端口的进程,或者希望避免冲突,你可以修改代码中的端口号。例如,将
new ServerSocket(9999);
改为new ServerSocket(9998);
或其他未被占用的端口。
- 如果无法终止占用端口的进程,或者希望避免冲突,你可以修改代码中的端口号。例如,将
-
确保服务器没有重复启动:
- 确保在同一台机器上没有多次启动同一个服务器实例,因为这也会导致端口冲突。
-
检查防火墙设置:
- 有时防火墙可能会阻止某些端口的访问。检查防火墙设置,确保9999端口没有被阻止。
-
使用随机端口:
- 如果你不确定哪个端口可用,可以使用
ServerSocket serverSocket = new ServerSocket(0);
,这样系统会自动分配一个可用的端口。
- 如果你不确定哪个端口可用,可以使用
接口改成9998后解决!
package demotcp1; import java.io.DataInputStream; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo1 { public static void main(String[] args) throws Exception{ //ServerSocket对象 ServerSocket ss = new ServerSocket(9999); //阻塞 等待连接,有人链接就会返回Socket Socket s = ss.accept(); //收取数据:用输入流 InputStream is = s.getInputStream(); //包装 DataInputStream dis =new DataInputStream(is); //按照类型对应读取数据int+String int i1=dis.readInt(); System.out.println("第一个消息:"+i1); String s2 = dis.readUTF(); System.out.println("第二个消息:"+s2); //谁发的? System.out.println("客户端ip"+s.getInetAddress().getHostAddress()); System.out.println("客户端端口"+s.getPort()); while (true) { String swhile = dis.readUTF(); System.out.println("消息:"+swhile); //服务端不用关管道,客户端关了会自动结束 } } } 报错:D:\jv\bin\java.exe "-javaagent:D:\idea\IntelliJ IDEA Community Edition 2024.3.2.2\lib\idea_rt.jar=50709:D:\idea\IntelliJ IDEA Community Edition 2024.3.2.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\codeJava\Javaseai\out\production\20250409;D:\codeJava\Javaseai\lib\junit-4.13.1.jar;D:\codeJava\Javaseai\lib\hamcrest-core-1.3.jar demotcp1.ClientDemo1 Exception in thread "main" java.net.ConnectException: Connection refused: connect at java.base/sun.nio.ch.Net.connect0(Native Method) at java.base/sun.nio.ch.Net.connect(Net.java:589) at java.base/sun.nio.ch.Net.connect(Net.java:578) at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:583) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) at java.base/java.net.Socket.connect(Socket.java:751) at java.base/java.net.Socket.connect(Socket.java:686) at java.base/java.net.Socket.<init>(Socket.java:555) at java.base/java.net.Socket.<init>(Socket.java:324) at demotcp1.ClientDemo1.main(ClientDemo1.java:14) 进程已结束,退出代码为 1
根据你提供的代码和错误信息,问题出在客户端(ClientDemo1
)尝试连接服务器时,未能成功建立连接。以下是可能的原因及解决方法:
错误分析:
-
java.net.ConnectException: Connection refused: connect
- 这个错误表示客户端尝试连接服务器时,服务器未监听指定的端口,或者服务器未运行。
- 通常是因为以下原因之一:
- 服务器程序未启动或未正确绑定到指定端口。
- 客户端连接的 IP 地址或端口号与服务器监听的地址或端口不匹配。
- 防火墙或其他网络配置阻止了客户端与服务器之间的通信。
-
关键点:
- 你的服务器代码绑定了
9999
端口(new ServerSocket(9999)
),因此客户端必须连接到同一端口。 - 如果服务器未运行,客户端尝试连接时会失败。
- 你的服务器代码绑定了
解决方法:
1. 检查服务器是否正在运行
- 确保服务器程序(
ServerDemo1
)已启动并正在监听9999
端口。 - 在终端运行服务器程序后,应该能看到类似以下输出:
深色版本
Server is listening on port 9999...
- 如果没有看到类似的输出,说明服务器未正确启动。
2. 检查客户端代码
- 客户端代码中,确保连接的是正确的 IP 地址和端口号。例如: java
深色版本
Socket socket = new Socket("127.0.0.1", 9999);
- 如果服务器运行在同一台机器上,使用
127.0.0.1
或localhost
即可。 - 如果服务器运行在其他机器上,确保使用服务器的实际 IP 地址。
3. 确保端口未被占用
- 使用以下命令检查
9999
端口是否被占用:- Windows: cmd
深色版本
netstat -ano | findstr :9999
- Linux/Mac: bash
深色版本
lsof -i :9999
- Windows: cmd
- 如果端口已被占用,可以选择更换端口号,或者终止占用该端口的进程。
4. 检查防火墙设置
- 如果服务器和客户端运行在不同的机器上,确保防火墙允许
9999
端口的通信。 - 可以临时关闭防火墙进行测试,或者添加规则允许该端口。
5. 示例客户端代码
- 确保客户端代码如下所示,并且与服务器代码匹配: java
深色版本
package demotcp1;import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket;public class ClientDemo1 {public static void main(String[] args) throws Exception {// 创建Socket对象,连接到服务器Socket socket = new Socket("127.0.0.1", 9999);// 发送数据:用输出流OutputStream os = socket.getOutputStream();DataOutputStream dos = new DataOutputStream(os);// 按照类型发送数据dos.writeInt(123);dos.writeUTF("Hello from client");// 关闭资源dos.close();os.close();socket.close();} }
调试步骤:
- 启动服务器程序(
ServerDemo1
)。 - 启动客户端程序(
ClientDemo1
)。 - 观察服务器端是否有输出,例如:
深色版本
第一个消息:123 第二个消息:Hello from client 客户端ip:127.0.0.1 客户端端口:XXXXX
- 如果仍然报错,检查以下内容:
- 服务器是否正常运行。
- 客户端连接的 IP 和端口是否正确。
- 是否有防火墙或其他网络限制。
总结:
- 确保服务器程序先运行并监听
9999
端口。 - 确保客户端连接到正确的 IP 和端口。
- 检查端口占用和防火墙设置。
- 如果问题仍未解决,请提供更多上下文信息(如客户端代码、完整的错误日志等),以便进一步分析。
代码模式
没有回应
Preview
从你提供的命令行截图来看,你尝试使用 netstat -ano | findstr :9999
来检查端口 9999 是否被占用,但没有得到任何回应。这通常意味着端口 9999 当前没有被任何进程占用。
可能的原因和解决方法:
-
服务器未启动:
- 确保你的服务器程序(
ServerDemo1
)已经正确启动,并且正在监听端口 9999。 - 在终端或命令行中运行服务器程序,并确认它是否在监听端口 9999。
- 确保你的服务器程序(
-
防火墙设置:
- 检查防火墙设置,确保端口 9999 被允许通过。
- 你可以临时关闭防火墙进行测试,或者添加规则允许该端口。
-
网络配置:
- 确保客户端和服务器之间的网络连接正常。
- 如果服务器和客户端不在同一台机器上,确保它们之间可以互相访问。
-
端口被其他进程占用:
- 尝试使用不同的端口号,例如 9090 或其他未被占用的端口。
- 使用
netstat -ano
命令查看所有开放的端口,确保没有其他进程占用目标端口。
示例步骤:
启动服务器
java
深色版本
package demotcp1;import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo1 {public static void main(String[] args) throws Exception {// 创建 ServerSocket 对象并绑定到 9999 端口ServerSocket ss = new ServerSocket(9999);System.out.println("Server is listening on port 9999...");while (true) {// 阻塞等待连接Socket s = ss.accept();System.out.println("Client connected from " + s.getInetAddress().getHostAddress());// 收取数据:用输入流InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);// 按照类型对应读取数据 int + Stringint i1 = dis.readInt();System.out.println("第一个消息:" + i1);String s2 = dis.readUTF();System.out.println("第二个消息:" + s2);// 循环读取消息while (true) {String swhile = dis.readUTF();System.out.println("消息:" + swhile);}}}
}
启动客户端
java
深色版本
package demotcp1;import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;public class ClientDemo1 {public static void main(String[] args) throws Exception {// 创建 Socket 对象,连接到服务器Socket socket = new Socket("127.0.0.1", 9999);// 发送数据:用输出流OutputStream os = socket.getOutputStream();DataOutputStream dos = new DataOutputStream(os);// 按照类型发送数据dos.writeInt(123);dos.writeUTF("Hello from client");// 关闭资源dos.close();os.close();socket.close();}
}
测试步骤:
- 运行服务器程序,确保它在监听端口 9999。
- 运行客户端程序,尝试连接服务器。
- 观察服务器端是否有输出,如:
深色版本
Client connected from 127.0.0.1 第一个消息:123 第二个消息:Hello from client
如果仍然遇到问题,请提供更多的错误信息或日志,以便进一步诊断。
我还没运行客户端呢,我先运行的服务端。为什么报错
如果仅运行了服务端程序(ServerDemo1
),但仍然报错,那么问题可能出在以下几个方面:
1. 检查服务端代码是否正确运行
- 确保服务端代码没有任何语法错误或逻辑问题。
- 运行服务端时,应该能看到类似以下输出:
深色版本
Server is listening on port 9999...
- 如果没有看到这样的输出,说明服务端程序未能成功启动。
解决方法:
- 确保你的服务端代码中
ServerSocket ss = new ServerSocket(9999);
正常执行。 - 在服务端代码的开头添加调试信息,例如: java
深色版本
确保程序能够运行到这一行。System.out.println("Starting server...");
2. 端口绑定失败
- 如果服务端尝试绑定到
9999
端口时失败,可能会抛出异常。例如:深色版本
java.net.BindException: Address already in use: bind
- 这通常是因为端口被其他进程占用。
解决方法:
- 检查是否有其他进程占用了
9999
端口:- Windows: cmd
深色版本
netstat -ano | findstr :9999
- Linux/Mac: bash
深色版本
lsof -i :9999
- Windows: cmd
- 如果端口被占用,可以选择更换端口号,例如改为
9090
: java深色版本
ServerSocket ss = new ServerSocket(9090);
3. 防火墙或其他网络限制
- 防火墙可能会阻止程序绑定到指定端口。
解决方法:
- 暂时关闭防火墙进行测试。
- 或者在防火墙规则中允许 Java 使用该端口。
4. 权限不足
- 如果你尝试绑定到低于 1024 的端口(如 80、443),需要管理员权限。
- 虽然你在使用
9999
端口(高于 1024),但仍需确保运行 Java 的用户有足够的权限。
解决方法:
- 确保以普通用户权限运行程序即可。
- 如果仍有问题,尝试以管理员身份运行 IDE 或命令行。
5. Java 环境问题
- 如果 Java 环境配置不正确,可能导致程序无法正常运行。
解决方法:
- 确保你的 JDK 版本与代码兼容。
- 检查
JAVA_HOME
和PATH
环境变量是否正确配置。 - 使用以下命令验证 Java 版本: bash
深色版本
java -version
6. IDE 配置问题
- 如果你在 IntelliJ IDEA 或其他 IDE 中运行程序,可能是运行配置有问题。
解决方法:
- 检查运行配置,确保主类为
demotcp1.ServerDemo1
。 - 清理并重新构建项目:
- 在 IntelliJ IDEA 中:
Build > Rebuild Project
。
- 在 IntelliJ IDEA 中:
- 确保所有依赖库已正确加载。
7. 完整的服务端代码调试
以下是经过调试的服务端代码,添加了一些额外的日志信息,方便排查问题:
结果是运行的时候运行到别的文件了
java
深色版本
package demotcp1;import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo1 {public static void main(String[] args) {try {System.out.println("Starting server...");// 创建 ServerSocket 对象并绑定到 9999 端口ServerSocket ss = new ServerSocket(9999);System.out.println("Server is listening on port 9999...");while (true) {// 阻塞等待连接Socket s = ss.accept();System.out.println("Client connected from " + s.getInetAddress().getHostAddress());// 收取数据:用输入流InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);// 按照类型对应读取数据 int + Stringint i1 = dis.readInt();System.out.println("第一个消息:" + i1);String s2 = dis.readUTF();System.out.println("第二个消息:" + s2);// 循环读取消息while (true) {String swhile = dis.readUTF();System.out.println("消息:" + swhile);}}} catch (Exception e) {System.err.println("Error occurred: " + e.getMessage());e.printStackTrace();}}
}
测试步骤:
- 运行服务端程序,观察控制台输出。
- 如果没有输出
Server is listening on port 9999...
,说明服务端未成功启动。 - 如果有异常信息,请提供完整的错误日志。
- 如果没有输出
- 如果服务端成功启动,再运行客户端程序进行测试。
总结:
- 确保服务端代码无误,并能成功绑定到端口。
- 检查端口是否被占用,或者尝试更换端口号。
- 确保防火墙和权限设置不会阻止程序运行。
- 如果仍有问题,请提供完整的错误日志或更多上下文信息,以便进一步分析。
代码模式
为什么会报异常呢
Preview
从你提供的代码片段来看,ServerReader
类继承了 Thread
类,并且有一个构造函数接收一个 Socket
对象作为参数。但是,IDE 提示了一个错误,显示在构造函数的定义上。
错误原因分析
- 构造函数未被调用:IDE 提示可能是因为构造函数没有被正确地调用。
- 缺少默认构造函数:如果你尝试创建一个
ServerReader
对象而没有传递Socket
参数,那么需要有一个默认的构造函数。
解决方法
-
确保构造函数被正确调用:
- 确保在创建
ServerReader
对象时传递了Socket
参数。 - 如果你不希望传递参数,可以添加一个默认构造函数。
- 确保在创建
-
添加默认构造函数:
- 如果你需要一个不带参数的构造函数,可以在类中添加它。
示例代码修改
1. 确保构造函数被正确调用
java
深色版本
public class ServerReader extends Thread {private Socket s;public ServerReader(Socket s) {this.s = s;}public void run() {// 收取数据:用输入流InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);// 按照类型对应读取数据 int + Stringint i1 = dis.readInt();System.out.println("第一个消息:" + i1);String s2 = dis.readUTF();System.out.println("第二个消息:" + s2);while (true) {String swhile = dis.readUTF();System.out.println("消息:" + swhile);}}
}
2. 添加默认构造函数
java
深色版本
public class ServerReader extends Thread {private Socket s;public ServerReader(Socket s) {this.s = s;}// 默认构造函数public ServerReader() {// 可以在这里进行初始化操作}public void run() {// 收取数据:用输入流InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);// 按照类型对应读取数据 int + Stringint i1 = dis.readInt();System.out.println("第一个消息:" + i1);String s2 = dis.readUTF();System.out.println("第二个消息:" + s2);while (true) {String swhile = dis.readUTF();System.out.println("消息:" + swhile);}}
}
使用示例
假设你在服务端主程序中使用 ServerReader
类:
java
深色版本
public class ServerDemo1 {public static void main(String[] args) throws Exception {ServerSocket ss = new ServerSocket(9999);System.out.println("Server is listening on port 9999...");while (true) {Socket s = ss.accept();System.out.println("Client connected from " + s.getInetAddress().getHostAddress());ServerReader reader = new ServerReader(s);reader.start();}}
}
总结
- 确保
ServerReader
的构造函数被正确调用,并且传递了Socket
参数。 - 如果需要,默认构造函数也可以添加,但通常情况下,传递
Socket
参数是必要的。
通过这些修改,你应该能够解决 IDE 提示的错误,并确保 ServerReader
类能够正常工作。
这个override有什么问题吗?
Preview
从你提供的代码片段来看,@Override
注解用于覆盖 Thread
类中的 run
方法。IDE 提示的错误可能是因为以下几个原因:
- 构造函数未被调用:确保在创建
ServerReader
对象时传递了Socket
参数。 - 变量未初始化:确保
s
变量已经被正确初始化。
代码分析
java
深色版本
public class ServerReader extends Thread {private Socket s;public ServerReader(Socket s) {this.s = s;}@Overridepublic void run() {// 收取数据:用输入流InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);// 按照类型对应读取数据 int + Stringint i1 = dis.readInt();System.out.println("第一个消息:" + i1);String s2 = dis.readUTF();System.out.println("第二个消息:" + s2);while (true) {String swhile = dis.readUTF();System.out.println("消息:" + swhile);}}
}
错误提示解释
- IDE 提示
0 个用法
:这通常意味着run
方法没有被正确地调用或使用。 @Override
标注:这个标注表示run
方法是覆盖父类(Thread
)的方法。如果run
方法没有被正确地调用,那么@Override
标注可能会失效。
解决方法
-
确保构造函数被正确调用:
- 确保在创建
ServerReader
对象时传递了Socket
参数。 - 示例代码如下:
深色版本
public class ServerDemo1 {public static void main(String[] args) throws Exception {ServerSocket ss = new ServerSocket(9999);System.out.println("Server is listening on port 9999...");while (true) {Socket s = ss.accept();System.out.println("Client connected from " + s.getInetAddress().getHostAddress());ServerReader reader = new ServerReader(s);reader.start(); // 启动线程}} }
- 确保在创建
-
检查
Socket
是否正确初始化:- 确保
Socket
对象在ServerReader
构造函数中被正确初始化。
- 确保
-
确保
run
方法被调用:- 在创建
ServerReader
对象后,必须调用start()
方法来启动线程。
- 在创建
完整示例
java
深色版本
public class ServerReader extends Thread {private Socket s;public ServerReader(Socket s) {this.s = s;}@Overridepublic void run() {try {// 收取数据:用输入流InputStream is = s.getInputStream();DataInputStream dis = new DataInputStream(is);// 按照类型对应读取数据 int + Stringint i1 = dis.readInt();System.out.println("第一个消息:" + i1);String s2 = dis.readUTF();System.out.println("第二个消息:" + s2);while (true) {String swhile = dis.readUTF();System.out.println("消息:" + swhile);}} catch (IOException e) {e.printStackTrace();}}
}public class ServerDemo1 {public static void main(String[] args) throws Exception {ServerSocket ss = new ServerSocket(9999);System.out.println("Server is listening on port 9999...");while (true) {Socket s = ss.accept();System.out.println("Client connected from " + s.getInetAddress().getHostAddress());ServerReader reader = new ServerReader(s);reader.start(); // 启动线程}}
}
通过这些修改,你应该能够解决 IDE 提示的错误,并确保 ServerReader
类能够正常工作。
相关文章:
Java实战报错 tcp
为什么报错tcp Preview 从图片中的错误信息来看,程序遇到了 java.net.BindException,具体错误信息是 "Address already in use: bind"。这意味着你的程序试图绑定到一个已经被其他进程占用的端口(在本例中是9999端口)。…...
【补题】P10424 [蓝桥杯 2024 省 B] 好数(数位dp)
题意: 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。 给定一个正整数 N…...
控制 ElementUI el-table 树形表格多选框的显示层级
1、你可以通过 selectable 属性来控制哪些行可以选择(显示多选框) <el-table:data"tableData"row-key"id"default-expand-all:tree-props"{children: children, hasChildren: hasChildren}"select"handleSelect&…...
今日行情明日机会——20250409
今日行情还需要考虑关税对抗~ 2025年4月8日涨停的主要行业方向分析 1. 军工(19家涨停) 细分领域:国防装备、航空航天、军民融合。催化因素:国家安全战略升级、国防预算增加、重大军工项目落地预期。 2. 免税(15家涨…...
基础知识补充篇:什么是DAPP前端连接中的provider
专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读352次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...
47常用控件_QWidget的toolTip属性
一个 GUI 程序,界面比较复杂, 按啥的很多~~ 当你把鼠标悬停到这个控件上的时候,就能弹出一个提示~~ setToolTip:设置提示内容 setToolTipDuring:设置提示的时间 toolTip 只是给用户看的.在代码中一般不需要获取到 toolTip. 代码示例: 设置按钮的 toolT…...
解密工业控制柜:认识关键硬件(PLC)
前言 作为一名视觉开发工程师,我们不仅要做到做好自己的工作,我们更需要在工业现场学习更多知识,最近网上流传很多,“教会徒弟,饿死师傅”;在自动化行业中,在项目下来很忙的时候,我们…...
PDF编辑,小白工具功能丰富多样,在线无需下载,操作便捷,新手小白必备
在当今数字化办公和学习的时代,PDF 文件的使用极为广泛,而小白工具的在线 PDF 浏览器以其强大且丰富的功能,成为了一款不可多得的优质 PDF 阅读工具,PDF编辑,在线无需下载,操作便捷,新手小白必备以下为您详细推荐: 功能…...
网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者
API的广泛使用正推动安全实践的重大变革。研究表明,有41%的企业管理的API数量至少与应用数量相等,因此企业亟需实现全面的API防护。近日,IDC发布《IDC MarketScape:2024年全球Web应用和API防护企业平台供应商评估报告》࿰…...
WPF轮播图动画交互 动画缩放展示图片
WPF轮播图动画交互 动画缩放展示图片 效果如下图: XAML代码: <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…...
玩转Docker | 使用Docker安装FileDrop文件共享工具
玩转Docker | 使用Docker安装FileDrop文件共享工具 前言一、FileDrop介绍FileDrop简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署FileDrop服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问FileDrop应用创建名称五、测试与使用…...
实战篇-主时钟约束
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据 总结 前言 这是对B站傅里叶的猫视频时钟约束的笔记 一、主时钟约束 report_clock_networks …...
Oracle JDBC驱动 ojdbc14:使用指南与版本说明(附资源下载)
ojdbc14 是 Oracle 公司提供的 JDBC(Java 数据库连接)驱动程序,用于连接 Java 应用程序与 Oracle 数据库。 ojdbc14.jar包已下载:https://pan.quark.cn/s/5ee7841dcd9c 关键信息 用途:使 Java 应用程序能够连接 Orac…...
spring mvc 异常处理中@RestControllerAdvice 和 @ControllerAdvice 对比详解
RestControllerAdvice 和 ControllerAdvice 对比详解 1. 基本概念 注解等效组合核心作用ControllerAdviceComponent RequestMapping(隐式)定义全局控制器增强类,处理跨控制器的异常、数据绑定或全局响应逻辑。RestControllerAdviceControll…...
单元测试原则之——不要过度模拟
什么是过度模拟? 过度模拟(over-mocking)是指在单元测试中,模拟了太多依赖项,甚至模拟了本不需要模拟的简单对象或行为。过度模拟会导致: 测试代码变得复杂,难以阅读和维护。测试逻辑偏离了实际业务逻辑,无法验证真实代码的行为。忽略了被测单元与依赖项之间的真实交互…...
云轴科技ZStackCTO王为:AI Infra平台具备解决私有化AI全栈难题能力
4月1-2日,2025中国生成式AI大会在北京举办,该会议已成为国内AI领域最具影响力的产业峰会之一。云轴科技ZStack CTO王为受邀在“大模型”峰会上发表主题为《AI 原生实践:企业实际场景的 AI 赋能与 Infra 实践探索》演讲,并参加《De…...
牛客 小苯的Z串匹配
注意数组元素是0的情况 #include<iostream> using namespace std;int t; const int N2e510;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;while(t){long long n;cin>>n;long long a[N];for(int i0; i<n; i) cin>>a[i];stri…...
拜特科技受邀参加跨境电商行业分会,共探资金管理数字化与AI应用新路径
3月12日,由广东省首席信息官协会主办的“跨境电商行业分会——走进绿联科技”活动在深圳绿联科技圆满举行。作为专注于金融科技与资金管理数字化解决方案的领先提供商,拜特科技受邀参加此次会议,与行业精英共同探讨跨境电商企业的资金管理数字…...
贪心算法(17)(java)可被三整除的最大整数和
给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和。 示例 1: 输入:nums [3,6,5,1,8] 输出:18 解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。 …...
架构师面试(二十八):业务建模
问题 今天我们撇开纯技术,聊一下关于【业务建模】的话题。 何为业务建模?即通过易于理解的模型将业务中的关键问题准确表达出来。 业务建模是需求分析环节乃至整个软件生命周期中非常关键的一环,它几乎决定了软件的开发周期和成本。下面关…...
求教:vue中的find()函数的用法this.$set
需求:为了实现联动,当我在选择问题标题之后,后面几列的内容就会自动联动显示 方案一: 选完之后 直接 是this.questionList[index] this.selected; 这样的效果虽然改动了数组,但是页面上没有显示出来实际数组的内容 …...
常见算法模板总结
文章目录 一、二叉树1. DFS2. BFS 二、回溯模板三、记忆化搜索四、动态规划1. 01背包朴素版本滚动数组优化 2. 完全背包朴素版本滚动数组优化 3. 最长递增子序列LIS朴素版本贪心二分优化 4. 最长公共子序列5. 最长回文子串 五、滑动窗口六、二分查找七、单调栈八、单调队列九、…...
生产者消费者模型
目录 一、生产者消费者模型 1. 生产者消费者模型是什么? 2. 为什么使用生产者消费者模型? 3. 生产者消费者模型的特点(321原则) 🌵3种关系 🌵2种角色 🌵1个交易场所 二、基于BlockingQue…...
linux里怎么禁用 其他用户使用sudo添加定时器,例如创建的tomcat用户禁止使用 sudo crontab -u tomcat -e 添加定时器
要禁止 tomcat 用户通过 sudo crontab -u tomcat -e 添加定时任务,需从 sudo 权限控制和 crontab 访问限制两方面入手。以下是具体步骤: 一、核心思路 禁止 tomcat 用户使用 sudo 提权执行 crontab 修改 /etc/sudoers 配置,移除 tomcat 用户…...
函数作为返回值输出
实际上,函数当做返回值输出的应用场景也很多,也更能体现函数式变成的巧妙,让函数继续返回一个可执行的函数,意味着运算过程是可延续的。 判断数据的类型 常见的判断一个数据的类型的函数: 单例模式 下面是一个单例模…...
黑马 SpringAI+DeepSeek 实战:从对话机器人到企业级知识库的大模型开发全攻略
附完整代码 项目案例,3 天吃透大模型应用开发核心技术 需要完整项目学习视频以及源码的私信博主,谢谢~大家一起加油呐!! 01.认识AI和大模型 小结 AI的发展过程 符号主义 机器学习 深度学习——自然语言处理(NLP…...
word表格间隔设置
1.怎么解决word表格间隔达不到我们想要的要求 其实很简单, 我们直接在word表格里面, 全选表格中里面的内容。接着,我们选择自动调整---->根据内容自动调整表格,即可达到我们想要的要求...
Windows批处理脚本,bat 循环数组进入文件夹进行后续操作
文章目录 前言一、脚本功能解析1.2、定义数组1.2、遍历数组1.2、处理每个数组元素1.2、循环控制1.2、结束脚本 二、之前编写的脚本三、优化后的脚本代码四、总结五、感谢 前言 Windows批处理脚本,主要功能是遍历一个预定义的数组,并对每个数组元素执行cd…...
TurtleBot3 Package turtlebot3_drive source code read
前言 此处阅读简单的 turtlebot3_drive 代码。 从ROS的角度,作为一个demo,它足够小、简单,可以从中看见ROS的 NodeHandle如何使用。此外,我们也能简单地看到 “自动避障功能的实现”。 从C的角度,它实际上并不复杂&…...
机器学习的下一个前沿是因果关系吗?
如今,越来越多研究人员意识到,将因果关系融入机器学习,或许会是该领域实现重大突破的关键所在。 机器学习凭借先进的预测能力,已为诸多行业带来了显著变革,但也暴露出了一定的局限性。而因果关系,作为理解…...
Mujoco xml模型
Mujoco xml模型 一个例子compileroptionassetmesh default基本使用childclass与class多个class worldbodybody关系inertialjointgeom XML主要分为以下三个部分: < asset> : 用 tag导入STL文件;< worldbody>:用tag定义…...
MyBatis 详解及代码示例
MyBatis 是一个 半自动 ORM 框架,主要用于 Java 与数据库之间的持久化操作,它本质是对 JDBC 的封装 全名:MyBatis(前身 iBATIS)核心作用:自动将 SQL 执行结果映射为 Java 对象;也可以将 Java 对…...
STL-list链表
STL-list链表实现 STL中采用双向带头循环链表来实现 list,下面将使用 C++ 实现 STL list 链表。 list 类中包含两个主要部分,一个是指向哨兵位头节点的指针(_head),另一个是结构体类型的迭代器(__list_iterator)。 哨兵位头节点本身是不存储数据的,它只是用于简化代码…...
R语言中的rvest库写个视频爬虫通用代码
朋友让我用R语言的rvest库写一个通用的视频爬虫代码示例。首先,我需要回忆一下rvest库的主要功能,它主要是用来做网页抓取和解析的,类似于Python的BeautifulSoup。但是视频爬虫的话,可能需要处理动态加载的内容,或者找…...
SQLite 中日期型数据定义及处理(Delphi 版本)
在使用SQLite的时候,肯定需要使用到日期型数据类型,但是SQLite没有直接支持日期类型,比如在其他数据库中支持的DateTime类型,在Delphi中是TDateTime类型。 那么实际处理中应该如何处理呢? 可以使用两种方式类在SQLit…...
4.9复习记
1.地宫取宝--记忆化搜索,可以先写void dfs,然后在改成ll 形式的,边界条件return 0/1; 记忆化数组与dfs元素保持一致,记得记忆化剪枝 这个题特殊在value可能是0,不取的时候应该记为-1 https://mpbeta.cs…...
Flink基础
Flink基础 目录 Flink简介核心概念编程模型核心功能应用场景部署模式生态系统最佳实践学习资源实践案例高级特性 1. Flink简介 1.1 什么是Flink Apache Flink是一个开源的分布式流处理和批处理系统。它能够处理有界(批处理)和无界(流处理…...
SASE、零信任安全理念的发展脉络
SASE(安全访问服务边缘)与零信任架构的发展脉络,是云安全理念从 “边界防御” 向 “动态信任” 跃迁的典型缩影。两者的演进既独立又交织,共同推动网络安全从静态合规走向主动治理。以下从技术起源、理念突破、产业实践到未来趋势展开深度解析: 一、零信任:从理论构想到…...
CompletableFuture 和 List<CompletableFuture> allOf() join() get() 使用经验
CompletableFuture<Map<Menu, Map<IntentDetail, Double>>> xxx CompletableFuture.supplyAsync(() -> {Map<Menu, Map<IntentDetail, Double>> scores new ConcurrentHashMap<>();// 存储结果scores.computeIfAbsent(menu, k -> n…...
Vue.js组件化开发实战:从工程化到安全纵深设计
文章目录 开篇:现代前端组件化演进之路 组件设计核心:高内聚低耦合实践 工程化基石:从Webpack到Monorepo 安全纵深设计:RASP在组件层的实现 实战:动态表单组件的三次进化 进阶篇:组件工厂模式与策略模…...
【深度解析】SkyWalking 10.2.0版本安全优化与性能提升实战指南
前言 Apache SkyWalking 作为云原生可观测性领域的佼佼者,在微服务架构监控中扮演着至关重要的角色。然而,官方版本在安全性、镜像体积和功能扩展方面仍有优化空间。本文将分享一套完整的 SkyWalking 10.2.0 版本优化方案,从安全漏洞修复到镜…...
NOIP2011提高组.玛雅游戏
目录 题目算法标签: 模拟, 搜索, d f s dfs dfs, 剪枝优化思路*详细注释版代码精简注释版代码 题目 185. 玛雅游戏 算法标签: 模拟, 搜索, d f s dfs dfs, 剪枝优化 思路 可行性剪枝 如果某个颜色的格子数量少于 3 3 3一定无解因为要求字典序最小, 因此当一个格子左边有…...
常微分方程求解全解析:从基础到矩阵方法深度实践
常微分方程求解全解析:从基础到矩阵方法深度实践 一、常微分方程基础与解法体系 1.微分方程基本概念解析 常微分方程的阶数指方程中未知函数导数的最高阶数。通解是包含任意常数且常数个数与方程阶数相同的解,特解则是通解中任意常数取特定值得到的解。以自由落体运动为例…...
Go 微服务框架 | 中间件
文章目录 定义中间件前置中间件后置中间件路由级别中间件 定义中间件 中间件的作用是给应用添加一些额外的功能,但是不会影响原有应用的编码方式,想用的时候直接添加,不想用的时候也可以轻松去除,实现所谓的可插拔。中间件的实现…...
【HarmonyOS Next之旅】DevEco Studio使用指南(十二)
目录 1 -> Code Linter代码检查 2 -> 配置代码检查规则 3 -> 查看/处理代码检查结果 1 -> Code Linter代码检查 Code Linter针对ArkTS/TS代码进行最佳实践/编程规范方面的检查。 可根据扫描结果中告警提示手工修复代码缺陷,或者执行一键式自动修复…...
Java设计模式之桥接模式:从入门到架构级实践
1. 什么是桥接模式? 桥接模式(Bridge Pattern) 是一种结构型设计模式,其核心目标是将抽象部分与实现部分分离,使它们能够独立变化。通过这种方式,桥接模式解决了多层继承带来的复杂性,并增强了…...
Jupyter Lab 无法启动 Kernel 问题排查与解决总结
📄 Jupyter Lab 无法启动 Kernel 问题排查与解决总结 一、问题概述 🚨 现象描述: 用户通过浏览器访问远程服务器的 Jupyter Lab 页面(http://xx.xx.xx.xx:8891/lab)后,.ipynb 文件可以打开,但无…...
【LeetCode 热题100】73:矩阵置零(详细解析)(Go语言版)
🚀 力扣热题 73:矩阵置零(详解 多种解法) 📌 题目描述 给定一个 m x n 的整数矩阵 matrix,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请你 原地 使用常量空间解决。 Ἲ…...
OminiAdapt:学习跨任务不变性,实现稳健且环境-觉察的机器人操作
25年3月来自中科大、北理工和中科院自动化所的论文“OminiAdapt: Learning Cross-Task Invariance for Robust and Environment-Aware Robotic Manipulation”。 随着具身智能的快速发展,利用大规模人体数据对人形机器人进行高水平的模仿学习,成为学术界…...
Vue3中父组件将一个ref定义的对象类型传递给子组件的解包机制
在Vue3中,当父组件将一个ref定义的对象类型传递给子组件时,子组件接收到的不是原始的Ref类型,而是该ref的.value值,即被解包后的响应式对象。具体行为如下: 关键点解析: 自动解包机制: Vue3在模…...