socket系统化入门
1.简单socket完成消息发送与接收
服务端:
package com.wfd360.com.socket; import java.io.*;
import java.net.ServerSocket;
import java.net.Socket; /**
* @Copyright (C)
* @Author: LI DONG PING
* @Date: 2019-09-01 15:14
* @Description:
*/
public class ServerSocketDemo {
/**
* ServerSocket 的构造方法如下所示。
* ServerSocket():无参构造方法。
* ServerSocket(int port):创建绑定到特定端口的服务器套接字。
* ServerSocket(int port,int backlog):使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口。
* ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、监听 backlog 和要绑定到本地的 IP 地址创建服务器。
* <p>
* ===================================================================================================================
* ServerSocket 的常用方法如下所示。
* Server accept():监听并接收到此套接字的连接。
* void bind(SocketAddress endpoint):将 ServerSocket 绑定到指定地址(IP 地址和端口号)。
* void close():关闭此套接字。
* InetAddress getInetAddress():返回此服务器套接字的本地地址。
* int getLocalPort():返回此套接字监听的端口。
* SocketAddress getLocalSoclcetAddress():返回此套接字绑定的端口的地址,如果尚未绑定则返回 null。
* int getReceiveBufferSize():获取此 ServerSocket 的 SO_RCVBUF 选项的值,该值是从 ServerSocket 接收的套接字的建议缓冲区大小。
*
* @param args 服务端设计步骤:
* 1.创建socket服务端
* 2.监听客户端
* 3.获取输入流
* 4.输出
*/
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket server = null;
BufferedReader reader = null;
BufferedWriter writer = null;
try {
//1.建立socket服务器
serverSocket = new ServerSocket(1001);
System.out.println("服务端创建成功----");
while (true) {
//2.监听客户端连接
server = serverSocket.accept();
//3.读取客户端数据
reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
String s = reader.readLine();
System.out.println("服务端收到数据:" + s);
//4.响应客户端
writer = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
writer.write("已经收到数据[" + s + "]\n");
//清除缓存
writer.flush();
} } catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭资源
if (writer != null) {
writer.close();
}
if (reader != null) {
reader.close();
}
if (server != null) {
server.close();
}
if (serverSocket != null) {
serverSocket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
} }
客户端:
package com.wfd360.com.socket; import java.io.*;
import java.net.Socket; /**
* @Copyright
* @Author: LI DONG PING
* @Date: 2019-09-01 15:50
* @Description:
*/
public class ClientSocketDemo {
/**
* 客户端设计逻辑:
* 1.创建socket通信,设置IP和端口
* 2.建立IO输出流,向服务端发送数据
* 3.建立IO输入流,读取服务端应答的数据
*
* @param args
*/
public static void main(String[] args) {
Socket socket = null;
BufferedWriter writer = null;
BufferedReader reader = null; try {
//1.创建socket通信
socket = new Socket("localhost", 1001);
//2.建立IO输出流,向服务端发送数据
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//注意这里必须加\n,因为是按照行读取
writer.write("短信发送2\n");
writer.flush();
//3.建立IO输入流,读取服务端应答的数据
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = reader.readLine();
System.out.println("客户端收到数据:" + s); } catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.socket中的常用io操作
常用类:https://www.cnblogs.com/newAndHui/p/11514269.html
案例:
package com.wfd360.com.io; import org.junit.Test; import java.io.*;
import java.util.ArrayList;
import java.util.List; /**
* @Copyright (C)
* @Author: LI DONG PING
* @Date: 2019-09-12 11:15
* @Description:
*/
public class FileDemo {
/**
* 需求:
* 将a.txt 复制到 b.txt
*
* @param args
*/
public static void main(String[] args) throws Exception {
} @Test
public void test2() throws Exception {
// String filePath="E:\\test\\day18_数据结构.docx";
String filePath="E:\\test\\a.txt";
String filePathNew="E:\\test\\b.txt";
//1.读取本地文件a
File file = new File(filePath);
DataInputStream dataInputStream = new DataInputStream(new FileInputStream(file));
//读取文件名
// String fileName = dataInputStream.readUTF();
//读取文件大小
// long fileSize = dataInputStream.readLong();
// System.out.println("fileName="+fileName+",fileSize="+fileSize);
//准备写入文件对象
File fileNew = new File(filePathNew);
// fileNew.createNewFile();
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(fileNew)); //按照字节读取文件
byte[] aByte = new byte[128];
System.out.println("length="+aByte.length);
int read = dataInputStream.read(aByte, 0, aByte.length);
while (read!=-1){
//当前文件内容
String s = new String(aByte,"gbk");
System.out.println("read="+read+"s="+s);
//写入文件
dataOutputStream.write(aByte,0,read);
dataOutputStream.flush();
read = dataInputStream.read(aByte, 0, aByte.length);
} //2.写入到本地文件b
} /**
* 需求:
* 将a.txt 复制到 b.txt
* 使用:FileInputStream,FileOutputStream
*
* @throws Exception
*/
@Test
public void test1() throws Exception {
//1:读取a.txt中的内容
//1.1.建立文件
File file = new File("D:\\test\\a.txt");
//1.2.读取文件内容 字节流
FileInputStream fileInputStream = new FileInputStream(file);
//1.3.转变为处理流 gb2312
BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream, "gbk"));
//1.4.按照行读取数据
List<String> content = new ArrayList<String>();
String line = reader.readLine();
while (line != null) {
System.out.println("line=" + line);
content.add(line);
//读取下一行
line = reader.readLine();
} //2:写入到b.txt中
//2.1.创建文件
File fileB = new File("D:\\test\\b.txt");
boolean newFile = fileB.createNewFile();
System.out.println("newFile=" + newFile);
//2.2.创建写入文件字节流
FileOutputStream fileOutputStream = new FileOutputStream(fileB);
//2.3.转变为处理流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fileOutputStream, "gbk"));
for (String s : content) {
writer.write(s);
}
writer.flush();
writer.close();
}
}
3.socket中java对象传送
java对象
package com.wfd360.com.socketJava.model; import java.io.Serializable; /**
* @Copyright (C)
* @Author: LI DONG PING
* @Date: 2019-09-12 17:48
* @Description:
*/
public class User implements Serializable {
private String name;
private Integer age; public User() {
} public User(String name, Integer age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
服务端:
package com.wfd360.com.socketJava; import com.wfd360.com.socketJava.model.User; import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* @Copyright (C)
* @Author: LI DONG PING
* @Date: 2019-09-01 15:14
* @Description:
*/
public class ServerSocketDemo {
/**
* @param args 服务端设计步骤:
* 1.创建socket服务端
* 2.监听客户端
* 3.获取输入流
* 4.输出
*/
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket server = null;
ObjectInputStream objectInputStream = null;
ObjectOutputStream objectOutputStream = null;
try {
//1.建立socket服务器
serverSocket = new ServerSocket(1002);
System.out.println("服务端创建成功----");
while (true) {
//2.监听客户端连接
server = serverSocket.accept();
//3.读取客户端数据
objectInputStream = new ObjectInputStream(server.getInputStream());
User user = (User) objectInputStream.readObject();
System.out.println("服务端收到数据:" + user);
//4.响应客户端
objectOutputStream = new ObjectOutputStream(server.getOutputStream());
user.setName("我来做服务端");
objectOutputStream.writeObject(user);
//清除缓存
objectOutputStream.flush();
} } catch (Exception e) {
e.printStackTrace();
} finally {
try {
//关闭资源
if (objectOutputStream != null) {
objectOutputStream.close();
}
if (objectInputStream != null) {
objectInputStream.close();
}
if (server != null) {
server.close();
}
if (serverSocket != null) {
serverSocket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
} }
客户端:
package com.wfd360.com.socketJava; import com.wfd360.com.socketJava.model.User; import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket; /**
* @Copyright (C)
* @Author: LI DONG PING
* @Date: 2019-09-01 15:50
* @Description:
*/
public class ClientSocketDemo {
/**
* 客户端设计逻辑:
* 1.创建socket通信,设置IP和端口
* 2.建立IO输出流,向服务端发送数据
* 3.建立IO输入流,读取服务端应答的数据
*
* @param args
*/
public static void main(String[] args) {
Socket socket = null;
ObjectOutputStream writer = null;
ObjectInputStream reader = null; try {
//1.创建socket通信
socket = new Socket("localhost", 1002);
//2.建立IO输出流,向服务端发送数据
writer = new ObjectOutputStream(socket.getOutputStream());
writer.writeObject(new User("无忌", 19));
writer.flush();
//3.建立IO输入流,读取服务端应答的数据
reader = new ObjectInputStream(socket.getInputStream());
User o = (User) reader.readObject();
System.out.println("==>" + o);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
4.多线程下的socket
多线程处理类
package com.wfd360.com.socketThread.thread; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket; public class HandleServerThread extends Thread {
private Socket socket; public HandleServerThread(){ }
public HandleServerThread(Socket socket){
this.socket=socket;
} @Override
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = reader.readLine();
System.out.println("收到连接的客户端:ip="+socket.getInetAddress()+" port:"+socket.getPort()+" s="+s);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("服务端收到的数据为[" + s + "]\n");
writer.flush();
writer.close();
reader.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端:
package com.wfd360.com.socketThread; import com.wfd360.com.socketThread.thread.HandleServerThread; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; /**
* @Copyright (C)
* @Author: LI DONG PING
* @Date: 2019-09-01 15:14
* @Description:
*/
public class ServerSocketDemo {
static int port = 1103; /**
* 服务端开启多线程
*
* @param args
*/
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(port);
int i=1;
System.out.println("服务端已启动----"+i);
while (true) {
System.out.println("等待客户端连接---"+i);
Socket socket = server.accept();
System.out.println("已连接---"+i);
HandleServerThread thread = new HandleServerThread(socket);
thread.start();
i++;
}
}
}
客户端:
package com.wfd360.com.socketThread; import java.io.*;
import java.net.Socket; /**
* @Copyright (C)
* @Author: LI DONG PING
* @Date: 2019-09-01 15:50
* @Description:
*/
public class ClientSocketDemo {
static String host = "192.168.0.103";
static Integer port = 1103; /**
* 客户端设计逻辑:
* 1.创建socket通信,设置IP和端口
* 2.建立IO输出流,向服务端发送数据
* 3.建立IO输入流,读取服务端应答的数据
*
* @param args
*/
public static void main(String[] args) {
Socket socket = null;
BufferedWriter writer = null;
BufferedReader reader = null;
try { while (true) {
//1.创建socket通信
socket = new Socket(host, port);
//2.建立IO输出流,向服务端发送数据
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//读取控制台输入的数据
System.out.print("请输入要发送的数据(结束请输入exit):");
String sysIn = new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.println("sysIn=" + sysIn);
if ("exit".equals(sysIn)) {
break;
}
//注意这里必须加\n,因为是按照行读取
writer.write("向服务端发送数据:" + sysIn + "\n");
writer.flush();
//3.建立IO输入流,读取服务端应答的数据
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = reader.readLine();
System.out.println("客户端收到数据:" + s);
} } catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
5.socket下的多线程文件传输
多线程处理类
package com.wfd360.com.socketFile.thread; import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.Socket; public class HandleServerThread extends Thread {
private Socket socket; public HandleServerThread() { } public HandleServerThread(Socket socket) {
this.socket = socket;
} /**
* 将文件保存到本地
*/
@Override
public void run() {
try {
//需要写入的文件
File file = new File("E:\\test\\c.txt");
file.createNewFile(); //处理流 输入
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
String fileName = dataInputStream.readUTF();
long fileSize = dataInputStream.readLong();
System.out.println("fileName=" + fileName + ",fileSize=" + fileSize);
//处理流 输出
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(file)); //采用字节数组读取文件内容
byte[] bytes = new byte[128];
int readSize = dataInputStream.read(bytes, 0, bytes.length);
System.out.println("readSize=" + readSize);
while (readSize != -1) {
//写入本地文件
dataOutputStream.write(bytes, 0, readSize);
dataOutputStream.flush();
readSize = dataInputStream.read(bytes, 0, bytes.length);
System.out.println("readSize=" + readSize);
}
System.out.println("========文件上传完成==========");
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端
package com.wfd360.com.socketFile; import com.wfd360.com.socketFile.thread.HandleServerThread; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; /**
* @Copyright (C) 四川千行你我科技有限公司
* @Author: LI DONG PING
* @Date: 2019-09-01 15:14
* @Description:
*/
public class ServerSocketDemo {
static int port = 1103; /**
* 服务端开启多线程
*
* @param args
*/
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(port);
int i=1;
System.out.println("服务端已启动----"+i);
while (true) {
System.out.println("等待客户端连接---"+i);
Socket socket = server.accept();
System.out.println("已连接---"+i);
HandleServerThread thread = new HandleServerThread(socket);
thread.start();
i++;
}
}
}
客户端
package com.wfd360.com.socketFile; import java.io.*;
import java.net.Socket; /**
* @Copyright (C) 四川千行你我科技有限公司
* @Author: LI DONG PING
* @Date: 2019-09-01 15:50
* @Description:
*/
public class ClientSocketDemo {
static String host = "192.168.0.103";
static Integer port = 1103; /**
* 客户端设计逻辑:
* 1.创建socket通信,设置IP和端口
* 2.建立IO输出流,向服务端发送数据
* 3.建立IO输入流,读取服务端应答的数据
*
* @param args
*/
public static void main(String[] args) throws Exception {
Socket socket = new Socket(host, port);
//准备上传文件
File file = new File("E:\\test\\a.txt");
DataInputStream dataInputStream = new DataInputStream(new FileInputStream(file));
//准备输出 处理流
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(file.getName());
dataOutputStream.flush();
dataOutputStream.writeLong(file.length());
dataOutputStream.flush();
//准备以字节的形式输出
byte[] bytes = new byte[128];
int readSize = dataInputStream.read(bytes, 0, bytes.length);
while (readSize != -1) {
System.out.println("readSize=" + readSize);
dataOutputStream.write(bytes, 0, readSize);
dataOutputStream.flush();
readSize = dataInputStream.read(bytes, 0, bytes.length);
}
System.out.println("-----完成-------");
dataInputStream.close();
//当关闭的时候,服务端才会停止监听
dataOutputStream.close();
}
}
6.UDP的socket
服务端
package com.wfd360.com.socketUDP; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException; public class UDPServer {
/**
* 一、DatagramPacket类:
*
* 如果把DatagramSocket比作创建的港口码头,那么DatagramPacket就是发送和接收数据的集装箱。
* 构造函数:一个用来接收数据,一个用来发送数据
* public DatagramPacket(byte[] buf,int length) //接收数据
* 构造 DatagramPacket 用来接收长度为 ilength 的包。
* public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
* 构造数据报文包用来把长度为 ilength 的包传送到指定宿主的指定的端口号。
* getAddress()
* 返回接收或发送此数据报文的机器的 IP 地址。
* getData()
* 返回接收的数据或发送出的数据。
* getLength()
* 返回发送出的或接收到的数据的长度。
* getPort()
* 返回接收或发送该数据报文的远程主机端口号。
*
* 二、DatagramSocket类
*
* 此类表示用来发送和接收数据报包的套接字。 数据报套接字是包投递服务的发送或接收点。
* DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
* DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
*
* receive(DatagramPacket p)
* 从此套接字接收数据报包。
* void send(DatagramPacket p)
* 从此套接字发送数据报包。
* bind(SocketAddress addr)
* 将此 DatagramSocket 绑定到特定的地址和端口。
* void close()
* 关闭此数据报套接字。
* void connect(InetAddress address, int port)
* 将套接字连接到此套接字的远程地址。
* void connect(SocketAddress addr)
* 将此套接字连接到远程套接字地址(IP 地址 + 端口号)。
* void disconnect()
* 断开套接字的连接。
* getInetAddress()
* 返回此套接字连接的地址。
* InetAddress getLocalAddress()
* 获取套接字绑定的本地地址。
*
* 三、InetAddress类
* InetAddress用于表示计算机IP地址的一个类,而在日常应用中的IP地址用"192.168.0.1",
* "WWW.it315.org"等字符串格式表示的。
* getByName方法
* getHostAddress方法
* @param args
*/
public static void main(String[] args) throws Exception {
int port=1001;
String host="192.168.0.103"; //1.创建服务端 DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
DatagramSocket datagramSocket = new DatagramSocket(port);
System.out.println("服务已开启-----");
//2.接收数据
byte[] bytes=new byte[128];
DatagramPacket datagramPacket =new DatagramPacket(bytes,0,bytes.length) ;
System.out.println("-----等待接收数据");
datagramSocket.receive(datagramPacket);
InetAddress address = datagramPacket.getAddress();
int port1 = datagramPacket.getPort();
int length = datagramPacket.getLength();
byte[] data = datagramPacket.getData();
String s = new String(data);
String format = String.format("address=%s,port=%s,length=%s,data=%s", address, port1, length, s);
System.out.println(format);
//3.发送数据包
String sendData="发送数据-"+s;
byte[] bytes1 = sendData.getBytes();
InetAddress byName = InetAddress.getByName(host);
DatagramPacket datagramPacketSend =new DatagramPacket(bytes1,0,bytes1.length,byName,1002) ;
datagramSocket.send(datagramPacketSend);
}
}
客户端
package com.wfd360.com.socketUDP; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException; public class UDPClient {
public static void main(String[] args) throws Exception {
int port=1002;
String host="192.168.0.103"; //1.创建服务端 DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
DatagramSocket datagramSocket = new DatagramSocket(port); //3.发送数据包
String sendData="你好吗?";
byte[] bytes1 = sendData.getBytes();
InetAddress byName = InetAddress.getByName(host);
DatagramPacket datagramPacketSend =new DatagramPacket(bytes1,0,bytes1.length,byName,1001) ;
datagramSocket.send(datagramPacketSend);
//2.接收数据
byte[] bytes=new byte[128];
DatagramPacket datagramPacket =new DatagramPacket(bytes,0,bytes.length) ;
System.out.println("-----等待接收数据");
datagramSocket.receive(datagramPacket);
InetAddress address = datagramPacket.getAddress();
int port1 = datagramPacket.getPort();
int length = datagramPacket.getLength();
byte[] data = datagramPacket.getData();
String s = new String(data);
String format = String.format("address=%s,port=%s,length=%s,data=%s", address, port1, length, s);
System.out.println(format); }
}
完美!
socket系统化入门的更多相关文章
- socket.io入门整理教程
socket.io入门整理 发布于 5 年前 作者 dtrex 124983 次浏览 最后一次编辑是 1 年前 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写 ...
- 最基础的Python的socket编程入门教程
最基础的Python的socket编程入门教程 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在 ...
- Socket.io 入门 - Renyi的博客
Socket.io Vue 中使用 NPM 安装 npm install vue-socket.io --save npm install --save socket.io-client 引用 详情 ...
- Java Socket NIO入门
Java Socket.SocketServer的读写.连接事件监听,都是阻塞式的.Java提供了另外一种非阻塞式读写.连接事件监听方式——NIO.本文简单的介绍一个NIO Socket入门例子,原理 ...
- Node.js、Express、Socket.io 入门
前言 周末断断续续的写了第一个socket.io Demo.初次接触socket.io是从其官网看到的,看着get started做了一遍,根据官网的Demo能提供简单的服务端和客户端通讯. 这个De ...
- socket通信入门
以一个基本的python程序为例解释 源代码如下: #!/usr/bin/env python #指出代码用什么程序去运行它.首先会到env设置里查找python的安装路径,再调用对应路径下的解释器 ...
- socket.io 入门教程
转载自:http://deadhorse.me/nodejs/2011/12/29/socket.io_induction.html socket.io socket.io是一个以实现跨浏览器.跨平台 ...
- 转载:socket.io 入门
原文链接:http://cnodejs.org/topic/50a1fcc7637ffa4155b5a264 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单 ...
- Java Socket(1): 入门
前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那 ...
随机推荐
- graalvm native image 试用
graalvm 提供的native 模式,可以加速应用的启动,不同可以让应用不再依赖jvm 运行时环境,但是 也有一些限制 参考 https://github.com/oracle/graal/blo ...
- 洛谷P1531 I Hate It题解
题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...
- 【Gamma】事后分析
目录 [Gamma]事后分析 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 照片 [Gamma]事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清 ...
- 实现简单的AOP前置后置增强
AOP操作是我们日常开发经常使用到的操作,例如都会用到的spring事务管理.今天我们通过一个demo实现对一个类的某一个方法进行前置和后置的增强. //被增强类 public class PetSt ...
- 基于ELK 7.50搭建elastalert 监控报警和权限控制
ELK+监控报警全步骤 需求: 公司要求对出在windows服务器上的日志进行日志分析并根据关键字进行报警,并配置kibana权限控制.下面为详细步骤 环境: centos 7.6 elk版本7.50 ...
- HTML5微信jssdk录音播放语音的方法
HTML5微信jssdk录音播放语音的方法需要注意的2个问题1 就是一定要判断1秒内 录音都不算 ps:太短不能录音 2 录音超过1分钟 会发现正在录音突然消失 所以要写wx.onVoiceRecor ...
- Cannot find class in classpath解决方法
1)Build Path出问题了 build path出问题了 ,java工程名前会有一个红色的感叹号,重新build一下 工程名上右键——>Build Path ——>Configure ...
- vertica审计日志
最近时段的所有请求: select * from dc_requests_issued order by time desc limit 10; 默认在磁盘上保留50MB: dbadmin=> ...
- zk脑裂
一.为什么zookeeper要部署基数台服务器?二.zookeeper脑裂(Split-Brain)问题2.1.什么是脑裂?2.2.什么原因导致的?2.2.zookeeper是如何解决的?一.为什么z ...
- SQL分类之DCL:管理用户、授权
DCL:管理用户.授权 SQL分类: DDL:操作数据库和表 DML:增删改表中的数据 DQL:查询表中的数据 DCL:管理用户.授权 DBA:数据库管理员 DCL:管理用户.授权 1.管理用户 1. ...