Websocket 1对n通信|8月更文挑战

466 阅读2分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

Websocket 一对多通信

在一对一的基础上(点击此处跳转Websocket 一对一通信)

  1. 消息代理前缀,发送消息的前缀如果是 /topic ,就会把消息转发给消息代理,再把消息广播给所有客户端
    private String name;		// 消息来源
    private String content;		// 消息内容
  1. 重写HTML
<script>
        var stompClient;
        $(function () {		// 点击连接按钮
            $('#connect').click(function () {
                connect();
            })				// 点击断开连接按钮
            $('#disconnect').click(function () {
                stompClient.disconnect();
                setConnect(false);
            })				// 点击发送内容按钮
            $('#send').click(function () {
                stompClient.send('/hello',{},JSON.stringify({
                    'name':$('#username').val(),
                    'content':$('#content').val()
                }))
            })
        })
        function connect() {
            if (!$('#username').val()) {// 判断是否添加用户名
                return;
            }
            var socketjs = new SockJS("/chat");
            stompClient = Stomp.over(socketjs);
            stompClient.connect({},function (frame) {
                setConnect(true);
                stompClient.subscribe('/topic/greeting',function (greeting) { 
                    var msgBody = JSON.parse(greeting.body);
                    $('#chat').append('<div>'+msgBody.name+' : '+ msgBody.content +'</div>')
                })
            })
        }
        function setConnect(connected) {	// 按钮状态设置
            $('#connect').prop('disabled',connected);
            $('#disconnect').prop('disabled',!connected);
            $('#send').prop('disabled',!connected);
        }
    </script>

服务器远程调用

  1. 创建serviceprovider&consumer (Spring Boot DevTools & Spring Web)
  2. entity 创建 MsgBea public class MsgBean implements Serializable
    private Integer id;
    private String content;
    private String statusId;//特征ID

  1. controller
@GetMapping("getMsgInfo")
    public MsgBean getMsgInfo(){

        MsgBean msgBean =new MsgBean();
        msgBean.setId(1001);
        msgBean.setContent("这里是服务提供方1 创建的msgbean *****从9090端口发出");
        msgBean.setStatusId(UUID.randomUUID().toString());	//随机UUID
        return msgBean;
    }
  1. application:9090
  2. consumer MsgService
    //远程调用 9090端口的服务器
    // 需要用到RestTemplate
    //	1.核心配置文件中配置RestTemplate
    //	2. 使用RestTemplate
  1. config SpringConfig
    //配置restTemplate
    @Autowired
    RestTemplate restTemplate;

    @Autowired
    DiscoveryClient discoveryClient;
  1. 调用9090,返回即可 restTemplate.getForObject("http://127.0.0.1:9090/getMsgInfo",MsgBean.class);
  2. controller
@GetMapping("getRemoteMsgByService")
    public MsgBean getRemoteMsgByService(){
        MsgBean msg=msgService.getRemoteService();
            return msg;
    }

Serviceprovider cluster

  1. pom & maven
  2. application Spring名称统一
  3. provider
server.port=9090
#spring 应用名称
spring.application.name=serviceprovider-server

#注册eureka客户端
eureka.client.service-url.instance.prefer-ip-address=true
#指定客户端的ip地址
eureka.client.service-url.instance.ip-address=127.0.0.1

eureka.instance.instance-id=serviceprovider-server1-9090

#作为客户端指定注册中心的位置
#eureka.client.service-url.defaultZone=http://127.0.0.1:8891/eureka/
eureka.client.service-url.defaultZone=http://127.0.0.1:8891/eureka/,http://127.0.0.1:8892/eureka/,http://127.0.0.1:8893/eureka/
  1. provider2
server.port=9091
#spring 应用名称
spring.application.name=serviceprovider-server

#注册eureka客户端
eureka.client.service-url.instance.prefer-ip-address=true
#指定客户端的ip地址
eureka.client.service-url.instance.ip-address=127.0.0.1

eureka.instance.instance-id=serviceprovider-server1-9091

#作为客户端指定注册中心的位置
#eureka.client.service-url.defaultZone=http://127.0.0.1:8891/eureka/
eureka.client.service-url.defaultZone=http://127.0.0.1:8891/eureka/,http://127.0.0.1:8892/eureka/,http://127.0.0.1:8893/eureka/
  1. provider3
server.port=9092
#spring 应用名称
spring.application.name=serviceprovider-server

#注册eureka客户端
eureka.client.service-url.instance.prefer-ip-address=true
#指定客户端的ip地址
eureka.client.service-url.instance.ip-address=127.0.0.1

eureka.instance.instance-id=serviceprovider-server1-9092

#作为客户端指定注册中心的位置
#eureka.client.service-url.defaultZone=http://127.0.0.1:8891/eureka/
eureka.client.service-url.defaultZone=http://127.0.0.1:8891/eureka/,http://127.0.0.1:8892/eureka/,http://127.0.0.1:8893/eureka/
  1. 同步controller & entity
  2. CTRL C & CTRL V
@RestController
public class HelloController {
    @GetMapping("getMsgInfo")
    public MsgBean getMsgInfo(){

        MsgBean msgBean =new MsgBean();
        msgBean.setId(181203616);
        msgBean.setContent("这里是服务提供方1 创建的msgbean *****从9090端口发出");
        msgBean.setStatusId(UUID.randomUUID().toString());
        return msgBean;
    }
}
public class MsgBean implements Serializable {

    private Integer id;
    private String content;
    private String statusId;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getStatusId() {
        return statusId;
    }

    public void setStatusId(String statusId) {
        this.statusId = statusId;
    }

    @Override
    public String toString() {
        return "MsgBean{" +
                "id=" + id +
                ", content='" + content + '\'' +
                ", statusId='" + statusId + '\'' +
                '}';
    }
}