WebSocket总结

一、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 {
        	//serversocket的作用:向服务端操作系统申请服务端口、监听端口,一旦一个客户端建立链接,会立即返回一个Socket
        	//accept的作用:调用后方法"卡住",此时开始等待客户端的链接,直到一个客户端链接,此时该方法会立即返回一个Socket实例
            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.原理图

原理图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值