一、Socket与MQTT的区别以及它们各自的作用?
1.区别:
选择MQTT还是WebSocket取决于具体的应用需求。
如果你需要一个高效、可靠的系统来支持大量设备间的消息传递,特别是在资源有限的环境下,MQTT可能是更好的选择。(比如不知道对方什么时候发送请求,也不确定具体的数量时就需要用到MQ)
如果你的场景侧重于Web应用,需要在客户端和服务器之间进行频繁且实时的数据交换,WebSocket则更为合适。(对消息的质量要求高,能确定时间、数量时用socket)
2.Socket:
它是一种在单个TCP连接上进行全双工通信的协议,允许服务器和客户端之间进行实时的双向通信,不需要客户端向服务器发送请求。
重点:要求高、低延迟、实时数据(预、报警信息)、确定性(一个还是多个,什么时间固定发送的)
3.MQTT:
是一种轻量级、发布/订阅协议,用于传输小型数据包。
重点:数据的不定时接收、尤其是网络不佳、资源受限条件下的一个良好选择。
二、Socket上手
1.步骤
1.首先引入 `依赖`。
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>1.7.9</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.编写服务端和客户端口的代码
#服务端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.nio.charset.StandardCharsets;
public class Server {
private ServerSocket serverSocket;
public Server() {
try {
serverSocket = new ServerSocket(9005);
System.out.println("服务端启动完毕!");
} catch (IOException e) {
e.printStackTrace();
}
}
void start(){
try {
InputStream inputStream = serverSocket.accept().getInputStream();
System.out.println("与客户端建立链接了");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = bufferedReader.readLine();
System.out.println("客户端说" + line);
inputStream.close();
inputStreamReader.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server().start();
}
}
#客户端代码
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Client {
private Socket socket;
public Client() {
try {
System.out.println("正在连接服务端....");
socket = new Socket("localhost",9005);
System.out.println("连接服务端成功");
} catch (IOException e) {
e.printStackTrace();
}
}
void start(){
try {
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(outputStreamWriter);
PrintWriter pw = new PrintWriter(writer,true);
pw.println("通过沉淀,你会获得一份高薪的工作!");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Client().start();
}
}
3.原理图
![原理图](https://img-blog.csdnimg.cn/direct/dfb373da96304cad808ebaf627592df9.png#pic_center)