Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

Socket

在Java中,Socket是一种用于网络通信的编程接口,它允许不同计算机之间的程序进行数据交换和通信。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍:

  • Socket类型:在Java中,有两种主要类型的Socket,分别用于不同类型的通信协议:

  • TCP Socket:使用TCP协议进行通信,提供可靠的、面向连接的数据传输。TCP Socket使用Socket类进行创建和管理。

  • UDP Socket:使用UDP协议进行通信,提供不可靠的、面向无连接的数据传输。UDP Socket使用DatagramSocket类进行创建和管理。

  • 套接字连接Socket允许两台计算机之间建立连接,一台计算机充当服务器,另一台计算机充当客户端服务器Socket等待客户端连接请求,客户端Socket通过指定服务器地址和端口号来连接服务器。客户端和服务器端都有Socket,是两台机器通信的端点

  • 通信协议:Socket可以使用不同的通信协议,最常见的是TCP和UDP。TCP提供可靠的、面向连接的通信,确保数据按顺序到达和错误处理。UDP提供不可靠的、面向无连接的通信,适用于低延迟应用。

  • 数据传输Socket允许应用程序通过输入和输出流(InputStream和OutputStream)进行数据传输。应用程序可以使用这些流发送和接收数据。

  • 阻塞和非阻塞模式:Socket可以以阻塞或非阻塞模式工作。在阻塞模式下,Socket操作将等待直到完成,而在非阻塞模式下,Socket操作可以立即返回。

  • 安全性:Socket通信可以通过安全套接字层(SSL)或传输层安全性(TLS)来加密,以提供数据的保密性和完整性。

TCP网络通信编程

TCP(传输控制协议)是一种可靠的、面向连接的网络通信协议,它用于在计算机网络上可靠地传输数据。TCP通信是客户端-服务器模型的基础,它确保了数据的可靠性和有序性。以下是TCP网络通信编程的基本介绍:

  1. 面向连接:TCP是一种面向连接的协议,通信的两端(客户端和服务器)在开始通信之前必须建立连接。连接建立后,数据可以在两端之间可靠地传输。

  2. 可靠性:TCP提供可靠的数据传输。它使用确认机制来确保数据的完整性和有序性。如果接收方收到数据,它会发送一个确认(ACK)给发送方,如果发送方没有收到确认,它会重新发送数据。

  3. 有序性:TCP保证数据按发送的顺序到达接收方。即使数据包在传输过程中可能以不同的顺序到达,TCP会重新排列它们,以确保接收方按正确的顺序接收数据。

  4. 流式数据传输:TCP提供了流式数据传输,数据被视为连续的字节流,而不是分成离散的数据包。这使得TCP适用于传输大文件和多媒体数据。

  5. 双向通信:TCP连接是全双工的,允许双方同时发送和接收数据。客户端和服务器都可以发送请求和响应。

  6. 端口号:TCP通信使用端口号来标识不同的服务或应用程序。服务器应用程序通常监听特定端口,客户端通过指定目标主机和端口来连接到服务器。

  7. 阻塞式通信:TCP通信默认是阻塞的,这意味着发送和接收数据的操作会一直阻塞,直到完成。这可以通过多线程或非阻塞I/O来处理,以确保应用程序的响应性。

  8. 安全性:TCP通信可以通过安全套接字层(SSL)或传输层安全性(TLS)来加密,以提供数据的保密性和完整性。

在这里插入图片描述

在Java中,你可以使用java.net包中的SocketServerSocket类来实现TCP网络通信。客户端使用Socket类来建立与服务器的连接,而服务器使用ServerSocket类来监听客户端连接请求。以下是一些简单的Java TCP服务器和客户端的示例,以便更好地理解TCP通信的基本原理:

1.使用字节流的方式发送数据和接收数据

服务器端代码

public class Server {public static void main(String[] args) throws IOException {//1. 在本机 的 9999 端口监听, 等待连接// 细节: 要求在本机没有其它服务在监听 9999,客户端的端口号只能被一个服务监听// 细节:这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发]ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端,在 9999 端口监听,等待连接..");//2. 当没有客户端连接 9999 端口时,程序会 阻塞, 等待连接// 如果有客户端连接,则会返回 Socket 对象,程序继续Socket socket = serverSocket.accept();//3.从一个已建立的网络套接字(Socket)中获取输入流,以便从该套接字接收数据InputStream inputStream = socket.getInputStream();//4.通过输入流从网络套接字中读取数据byte[] buf = new byte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) != -1) {System.out.println(new String(buf,0,readLen));}//5.从一个已建立的网络套接字(Socket)中获取输出流,以便将数据发送到该套接字OutputStream outputStream = socket.getOutputStream();//6.通过输出流 (outputStream) 发送内容到网络套接字outputStream.write("hello,client".getBytes());//7.设置结束标记。用于关闭套接字(Socket)的输出流。具体来说,它关闭套接字的输出流,表示在此之后不再发送数据到套接字的另一端socket.shutdownOutput();//8.关闭流和 socketinputStream.close();outputStream.close();socket.close();serverSocket.close();}
}

客户端代码

public class Client {public static void main(String[] args) throws IOException {//1. 连接服务端 (ip , 端口)//连接本机的 9999 端口, 如果连接成功,返回 Socket 对象Socket socket = new Socket(InetAddress.getLocalHost(),9999);//2.从一个已建立的网络套接字(Socket)中获取输出流,以便将数据发送到该套接字OutputStream outputStream = socket.getOutputStream();//3.通过输出流 (outputStream) 发送内容到网络套接字outputStream.write("hello,server".getBytes());//4.设置结束标记。用于关闭套接字(Socket)的输出流。具体来说,它关闭套接字的输出流,表示在此之后不再发送数据到套接字的另一端socket.shutdownOutput();//5.从一个已建立的网络套接字(Socket)中获取输入流,以便从该套接字接收数据InputStream inputStream = socket.getInputStream();//6.通过输入流从网络套接字中读取数据byte[] buf = new byte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) != -1){System.out.println(new String(buf,0,readLen));}//7.关闭流和 socketoutputStream.close();inputStream.close();socket.close();System.out.println("客户端退出");}
}

2.使用字符流的方式发送数据和接收数据
服务器端代码

public class Server {public static void main(String[] args) throws IOException {//1. 在本机 的 9999 端口监听, 等待连接// 细节: 要求在本机没有其它服务在监听 9999,客户端的端口号只能被一个服务监听// 细节:这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发]ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端,在 9999 端口监听,等待连接..");//2. 当没有客户端连接 9999 端口时,程序会 阻塞, 等待连接// 如果有客户端连接,则会返回 Socket 对象,程序继续Socket socket = serverSocket.accept();//3.从一个已建立的网络套接字(Socket)中获取输入流,以便从该套接字接收数据InputStream inputStream = socket.getInputStream();//4.将字节流转换为字符流InputStreamReader inputStreamReader = new InputStreamReader(inputStream);//5.对字符流进行包装,提供了更方便的读取方法,如readLine()可以一次读取一行数据BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//6.通过输入流从网络套接字中读取数据String line = "";while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}//7.从一个已建立的网络套接字(Socket)中获取输出流,以便将数据发送到该套接字OutputStream outputStream = socket.getOutputStream();//8.将字节流转换为字符流OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);//9.对字符流进行包装,提供了更方便的写入方法,如writer()可以直接写入字符串而不用转换为字符数组BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);//10.通过输出流发送内容到网络套接字bufferedWriter.write("hello,client");//11.当我们使用缓冲写入数据时,数据会先被写入到缓冲区中,而不是直接写入到目标文件或流中。// 调用flush()方法会强制将缓冲区中的数据立即写入到目标文件或流中,确保数据的及时更新。// 这样可以避免数据在缓冲区中滞留而没有被写入到目标文件或流中的情况发生。bufferedWriter.flush();//12.设置结束标记。用于关闭套接字(Socket)的输出流。具体来说,它关闭套接字的输出流,表示在此之后不再发送数据到套接字的另一端socket.shutdownOutput();//13.关闭流和 socketbufferedReader.close();bufferedWriter.close();socket.close();serverSocket.close();}
}

客户端代码

public class Client {public static void main(String[] args) throws IOException {//1. 连接服务端 (ip , 端口)//连接本机的 9999 端口, 如果连接成功,返回 Socket 对象Socket socket = new Socket(InetAddress.getLocalHost(),9999);//2.从一个已建立的网络套接字(Socket)中获取输出流,以便将数据发送到该套接字OutputStream outputStream = socket.getOutputStream();//3.将字节流转换为字符流OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);//4..对字符流进行包装,提供了更方便的写入方法,如如writer()可以直接写入字符串而不用转换为字符数组BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);//5.通过输出流发送内容到网络套接字bufferedWriter.write("hello,server");//6.当我们使用缓冲写入数据时,数据会先被写入到缓冲区中,而不是直接写入到目标文件或流中。// 调用flush()方法会强制将缓冲区中的数据立即写入到目标文件或流中,确保数据的及时更新。// 这样可以避免数据在缓冲区中滞留而没有被写入到目标文件或流中的情况发生。bufferedWriter.flush();//需要刷新否则写不进去//7.设置结束标记。用于关闭套接字(Socket)的输出流。具体来说,它关闭套接字的输出流,表示在此之后不再发送数据到套接字的另一端socket.shutdownOutput();//8.从一个已建立的网络套接字(Socket)中获取输入流,以便从该套接字接收数据InputStream inputStream = socket.getInputStream();//9.将字节流转换为字符流InputStreamReader inputStreamReader = new InputStreamReader(inputStream);//10.对字符流进行包装,提供了更方便的读取方法,如readLine()可以一次读取一行数据BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//11.通过输入流从网络套接字中读取数据String line = "";while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}//12.关闭流和 socketbufferedWriter.close();bufferedReader.close();socket.close();System.out.println("客户端退出");}
}

3.发送图片的代码:
服务器端代码

public class Server {public static void main(String[] args) throws Exception {ServerSocket serverSocket = new ServerSocket(6666);System.out.println("服务端,在 6666 端口监听,等待连接..");Socket socket = serverSocket.accept();//通过将socket的输入流包装在BufferedInputStream中,可以在读取数据时先将数据存储在缓冲区中,// 然后再从缓冲区中读取数据,减少了直接从输入流中读取数据的次数,提高了读取数据的效率。//当然可以不用缓冲流也是可以的,但是效率不高,最好还是用缓冲流BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);String descFile = "src\\main\\java\\com\\example\\retcode\\test\\net\\socket\\tcp\\tcp4\\线程状态.bmp";BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(descFile));bufferedOutputStream.write(bytes);bufferedOutputStream.close();//通过 socket 获取到输出流(字符)BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("收到图片");bufferedWriter.flush();socket.shutdownOutput();bufferedOutputStream.close();bufferedInputStream.close();bufferedWriter.close();socket.close();}
}

客户端代码

public class Client {public static void main(String[] args) throws Exception {Socket socket = new Socket(InetAddress.getLocalHost(),6666);String filePath = "d:\\线程状态.bmp";BufferedInputStream bufferedInputStream  = new BufferedInputStream(new FileInputStream(filePath));byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);OutputStream outputStream = socket.getOutputStream();BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);bufferedOutputStream.write(bytes);socket.shutdownOutput();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line ="";while ((line = bufferedReader.readLine())!=null){System.out.println(line);}bufferedOutputStream.close();bufferedInputStream.close();bufferedReader.close();socket.close();System.out.println("客户端退出");}
}

StreamUtils类:

public class StreamUtils {/*** 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]* @param is* @return* @throws Exception*/public static byte[] streamToByteArray(InputStream is) throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象byte[] b = new byte[1024];//字节数组int len;while((len=is.read(b))!=-1){//循环读取bos.write(b, 0, len);//把读取到的数据,写入bos	}byte[] array = bos.toByteArray();//然后将bos 转成字节数组bos.close();return array;}/*** 功能:将InputStream转换成String* @param is* @return* @throws Exception*/public static String streamToString(InputStream is) throws Exception{BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder builder= new StringBuilder();String line;while((line=reader.readLine())!=null){builder.append(line+"\r\n");}return builder.toString();}}

netstat指令

netstat 是一个用于显示网络连接和路由表信息的命令行工具,它可以在不同的操作系统中使用,包括Windows、Linux和macOS。netstat 可以帮助你监视和诊断网络连接问题,了解网络活动情况。以下是 netstat 命令的基本介绍:

在命令行中执行 netstat 命令时,通常需要提供一些选项和参数以获取特定的网络信息。以下是一些常见的 netstat 选项和用法:

  1. 查看所有活动连接

    netstat -a
    

    这会显示所有的活动网络连接,包括TCP和UDP连接,以及监听中的端口。

  2. 查看活动TCP连接

    netstat -at
    

    这会显示所有的活动TCP连接,包括本地地址、远程地址、状态等信息。

  3. 查看活动UDP连接

    netstat -au
    

    这会显示所有的活动UDP连接,包括本地地址、远程地址等信息。

  4. 显示监听端口

    netstat -l
    

    这会显示当前正在监听的端口,包括TCP和UDP。

  5. 显示路由表信息

    netstat -r
    

    这会显示操作系统的路由表信息,包括网络地址、网关、接口等。

  6. 显示统计信息

    netstat -s
    

    这会显示各种协议的统计信息,如TCP、UDP、ICMP等。

  7. 显示PID和程序名

    netstat -b
    

    这会显示每个连接的相关进程的PID和程序名。在Windows系统中,需要以管理员权限运行才能查看程序名。

  8. 显示数字格式

    netstat -n
    

    这会以数字格式显示网络地址和端口,而不是尝试解析主机名和服务名。

这只是 netstat 命令的一些常见选项和用法。根据你的需求,你可以根据操作系统和情况选择不同的选项以查看所需的网络信息。netstat 是网络管理和故障排除的有用工具,它可以帮助你了解网络连接、端口使用情况、路由信息等,以便更好地管理和维护计算机网络。

UDP编程

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的网络通信协议,它用于在计算机网络上进行数据传输。UDP通信的特点是速度快,但不保证数据的可靠性。以下是Java中UDP编程的基本介绍:

  1. 无连接性:UDP是无连接的协议,通信双方在发送和接收数据之前不需要建立连接。这使得UDP通信的速度较快,因为不需要进行连接和断开的握手过程。

  2. 不可靠性:UDP不保证数据的可靠性,数据包可能会丢失、乱序到达或重复到达。因此,如果需要可靠的数据传输,必须在应用层进行额外的处理。

  3. 面向数据报:UDP通信是面向数据报的,每个UDP数据包都是独立的,没有关联性。这使得应用程序可以发送和接收独立的消息。

  4. 低开销:由于UDP没有建立连接和维护状态的开销,因此它在某些情况下比TCP更高效。UDP通常用于实时音频、视频和在线游戏等需要快速传输数据的应用。

  5. 广播和多播:UDP支持广播和多播,允许一个主机向多个接收者发送相同的数据包,而无需建立多个连接。

在Java中,你可以使用java.net包中的DatagramSocketDatagramPacket类来实现UDP编程。以下是基本的UDP编程步骤:

发送端(客户端)

  1. 创建一个DatagramSocket对象,用于发送数据。
  2. 创建一个DatagramPacket对象,将要发送的数据放入其中,并指定目标主机的IP地址和端口号。
  3. 使用DatagramSocketsend()方法发送数据包。
  4. 关闭DatagramSocket以释放资源。

接收端(服务器端)

  1. 创建一个DatagramSocket对象,用于接收数据,并指定监听的端口号。
  2. 创建一个DatagramPacket对象,用于接收数据。
  3. 使用DatagramSocketreceive()方法接收数据包。
  4. 从接收到的数据包中提取数据。
  5. 关闭DatagramSocket以释放资源。

以下是一个简单的UDP发送端和接收端的示例:

发送端代码

public class UDPSender {public static void main(String[] args) throws IOException {//1.创建 DatagramSocket 对象,准备在 9998 端口 接收数据DatagramSocket socket = new DatagramSocket(9998);//2. 将需要发送的数据,封装到 DatagramPacket 对象byte[] data = "hello 明天吃火锅~".getBytes();//说明: 封装的 DatagramPacket 对象 data 内容字节数组 , data.length , 主机(IP) , 端口DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("172.21.10.13"), 9999);socket.send(packet);//3.=== 接收从 A 端回复的信息//(1) 构建一个 DatagramPacket 对象,准备接收数据// 在前面讲解 UDP 协议时,一个数据包最大 64kbyte[] data1 = new byte[1024];DatagramPacket packet1 = new DatagramPacket(data1, data1.length);//(2) 调用 接收方法, 将通过网络传输的 DatagramPacket 对象// 填充到 packet 对象//当有数据包发送到 本机的 9998 端口时,就会接收到数据// 如果没有数据包发送到 本机的 9998 端口, 就会阻塞等待. socket.receive(packet);socket.receive(packet1);//(3) 可以把 packet 进行拆包,取出数据,并显示. int length = packet.getLength();//实际接收到的数据字节长度int length = packet1.getLength();data1 = packet1.getData();//接收到数据String s = new String(data1, 0, length);System.out.println(s);//关闭资源socket.close();System.out.println("B 端退出");}
}

接收端代码

public class UDPReceiver {public static void main(String[] args) throws IOException {//1. 创建一个 DatagramSocket 对象,准备在 9999 接收数据System.out.println("9999端口等待数据的请求");DatagramSocket socket = new DatagramSocket(9999);//2. 构建一个 DatagramPacket 对象,准备接收数据// 在前面讲解 UDP 协议时,老师说过一个数据包最大 64kbyte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);//3. 调用 接收方法, 将通过网络传输的 DatagramPacket 对象// 填充到 packet 对象// 当有数据包发送到 本机的 9999 端口时,就会接收到数据// 如果没有数据包发送到 本机的 9999 端口, 就会阻塞等待. System.out.println("接收端 A 等待接收数据..");socket.receive(packet);//4. 可以把 packet 进行拆包,取出数据,并显示. int length = packet.getLength();//实际接收到的数据字节长度int length = packet.getLength();byte[] data = packet.getData();//接收到数据String s = new String(data, 0, length);System.out.println(s);//===回复信息给 B 端//将需要发送的数据,封装到 DatagramPacket 对象byte[] data1 = "好的, 明天见".getBytes();//说明: 封装的 DatagramPacket 对象 data 内容字节数组 , data.length , 主机(IP) , 端口DatagramPacket packet1 = new DatagramPacket(data1, data1.length, InetAddress.getByName("172.21.10.13"), 9998);socket.send(packet1);//发送//5. 关闭资源socket.close();System.out.println("A 端退出...");}
}

UDP通信适用于需要快速传输数据且可以容忍一些数据丢失的场景,例如实时音视频传输和在线游戏。然而,由于UDP不保证数据的可靠性,因此在应用中需要考虑如何处理丢失的数据或保证数据的顺序。

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

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

相关文章

1775_树莓派3B键盘映射错误解决

全部学习汇总: GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 入手树莓派3B之后用了没有多长时间,最初的这段时间感觉想让它代替我的PC机是不肯能的。性能先不说,我完全没有找到当初在我的笔记本上使…

css网格布局

css网格布局 常用属性 display: grid; //开启网格grid-template-columns: 2fr 1fr 1fr 1fr 1fr; //设置多少列每列宽度grid-gap: 10px; // 设置表格之间间距grid-template-rows: 50px 50px 50px 50px; // 设置多少行 每行的高度grid-column : 1 //占据位置 占据1格grid-colu…

机器人中的数值优化(九)——拟牛顿方法(下)、BB方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

某物联网数智化园区行业基于 KubeSphere 的云原生实践

公司简介 作为物联网 数智化园区一体化解决方案提供商,我们致力于为大中型园区、停车场提供软硬件平台,帮助园区运营者实现数字化、智能化运营。 在使用 K8s 之前我们使用传统的方式部署上线,使用 spug(一款轻量级无 Agent 的自…

网络版五子棋C++实现

目录 1.项目介绍 2.开发环境 3.核心技术 4.环境搭建 5.WebSocketpp介绍 5.1WebSocketpp是什么 5.2为什么使用WebSocketpp 5.3原理解析: 5.4WebSocketpp主要特性 6.WebSocketpp使用 7.JsonCpp使用 8.MySQL API 9.项目模块设计以及流程图 10.封装日志宏…

NewStarCTF 2022 web方向题解 wp

----------WEEK1---------- BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP] 先看题目,要传参加绕过。 分析一下代码:首先get一个datadata://test/plain,Wel…。然后key1和2用数组可以绕过。num2077a可以绕过弱类型。eval()中的php语句被#注释了&#xff0c…

并发编程的故事——JUC

JUC 文章目录 JUC一、Semaphore二、CountDownLatch三、线程安全类 一、Semaphore 为什么需要用到Semaphore? 限流 Semaphore的场景? 秒杀商品的时候,不能够让那些没有秒杀成功的线程进入,只有占了坑位的才可以使用,这里可以用re…

【Hello Algorithm】二叉树相关算法

本篇博客介绍:介绍二叉树的相关算法 二叉树相关算法 二叉树结构遍历二叉树递归序二叉树的交集非递归方式实现二叉树遍历二叉树的层序遍历 二叉树难题二叉树的序列化和反序列化lc431求二叉树最宽的层二叉树的后继节点谷歌面试题 二叉树结构 如果对于二叉树的结构还有…

Linux命令执行完成提醒

有些命令任务执行时间较长,可以让其执行完成时发出声音来提示。 如下: ls && echo -e "\a" 前一条命令成功执行后,会发出声音。 如果当前不在Iterm2窗口里,还会弹窗提示。

2023新版医保目录明细(药品查询)

查询医保目录的主要目的是为了了解医保政策对于特定医疗服务、药品和医疗器械的覆盖范围和支付标准。大众可以通过查看医保目录可以确定哪些药品可以被医保支付以及报销的比例和限额;医药从业者可通过查看医保目录可以即使了解医保政策的变化,便于做出相…

15种下载文件的方法文件下载方法汇总超大文件下载

15种下载文件的方法&文件下载方法汇总&超大文件下载 15种下载文件的方法Pentesters经常将文件上传到受感染的盒子以帮助进行权限提升,或者保持在计算机上的存在。本博客将介绍将文件从您的计算机移动到受感染系统的15种不同方法。对于那些在盒子上存在且需要…

基于jeecg-boot的flowable流程审批时增加下一个审批人设置

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 因为有时…

[ROS]虚拟机ubuntu18.04系统里面运行usb_cam

首先安装usb_cam sudo apt-get install ros-melodic-usb-cam 运行: roscore roslaunch usb_cam usb_cam-test.launch 如果一运行报错,首先确认是否存在/dev/video0 可以使用ls /dev/video*查看,如果没有就是没有连接摄像头,…

区块链实验室(20) - FISCO控制台连接到指定的节点

在FISCO技术文档中,控制台默认采用config.toml作为配置文件,并指定了连接的节点地址和商品,如下所示。 [network] peers["127.0.0.1:20200", "127.0.0.1:20201"] # The peer list to connect在该案例中,控…

Vulnhub内网渗透DC-7靶场通关

个人博客: xzajyjs.cn DC系列共9个靶场,本次来试玩一下一个 DC-7,下载地址。 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题。靶场推荐使用NAT(共享)模式,桥接模式可能会造成目标过多不…

使用QT操作Excel 表格的常用方法

VBA 简介 Microsoft Office软件通常使用VBA来扩展Windows的应用程序功能,Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言。 在VBA的参考手册中就可以看到具体函数、属性的用法,Qt操作Excel主要通过 QAxObj…

Verilog零基础入门(边看边练与测试仿真)-笔记

文章目录 第一讲第二讲第三讲第四讲第五讲 第一讲 1、testbench 没有端口,所以没括号 2、testbench 输入端 之后要变动 所以定义为reg 3、#10 :过10个时间单位 ;’timescale 1ns/10ps 即 1ns 的时间单位 10ps的时间精度 4、reg 型变量赋值的…

鼠标悬停阴影的效果被旁边div挡住的解决办法

出现的问题 需求要求鼠标悬停某个图片上有阴影效果,但阴影被旁边相邻的div挡住了,如图所示 解决方案 给悬停的这块div增加2个css属性 $(this).css(position, relative); $(this).css(z-index, 200);新的效果如图所示 一直写后端,前端的…

opencv案例06-基于opencv图像匹配的消防通道障碍物检测与深度yolo检测的对比

基于图像匹配的消防通道障碍物检测 技术背景 消防通道是指在各种险情发生时,用于消防人员实施营救和被困人员疏散的通道。消防法规定任何单位和个人不得占用、堵塞、封闭消防通道。事实上,由于消防通道通常缺乏管理,导致各种垃圾&#xff0…

Linux命令之用户管理(详解)

Linux命令之用户管理 常用基础命令修改root密码切换用户身份改变当前目录查看命令的用法查看命令之ls 用户管理用户的创建adduser创建useradd创建两种方式的区别 用户删除用户密码重置查看当前所有用户 在介绍Linux用户管理相关的命令之前,我们先介绍一些Linux的一些…