websocket通信实现java模拟一个client与webclient通信

汜慕魂落 汜慕魂落     2022-10-11     156

关键词:

发文原由:

熟悉socket通信的同学,对于socket模拟server与client,实现相互通信,

或者使用websocket与java模拟的websocket服务器通信(比如一个聊天室),对于这些都比较熟悉了。但是可能会有下面这种情况,

java项目(比如storm流式处理)会在处理数据时候产生一些信息,比如监控某车间、风场,发电厂的机器数据,一旦出现异常需要即时推送异常信息到UI端/Web端,实时显示出来。这时候以上两种较为熟知的通信就会不太方便。我也是查了好多资料,得到下面这种方法:

web项目启动一个websocket的的server和一个web端的client。然后另外也用websocket(这是很少人采用的一种方式)写一个java端的client。我们把这个client放在产生实际项目中产生数据的地方,通过client与server的连接,把异常消息推送到server,由server广播给web端实时显示。

环境:

tomcat 7

maven项目

IDE是IDEA2017

项目功能描述:

启动项目,会启动一个web端的websocket-client和一个java模拟的websocket-server。

项目中另外还有一个Main类,单独启动,会模拟启动一个java端的websocket-client。

java-client可以发消息,通过server即时将消息推送到web端。

  先看web端的js代码,非常简单:

<script type="text/javascript">
    var socket = new WebSocket("ws:localhost:8080/websocket/chat")
    var name = "web"
    socket.onopen = function () {
        socket.send("webinit" + "-" + name);
    }
    socket.onmessage = function (messageMeta) {
        var message = messageMeta.data
        document.getElementById("show").innerHTML +=  "<br>"+message
    }
</script>
…………………………………………
<div id="show">初始的一句话</div>

js使用websocket与服务端建立链接,这里指定了web的name是"web",onopen的时候发送一条消息给服务端,用来告诉服务端当前web的name,后续会用到这个name。

onmessage用来接收服务器发来的消息。追加到web页面。

 

  再看服务端代码,也很好理解:

首先看一下截图,代码非常少,采用注解的方式,下图中红色笔迹1用来标识当前websocket的名字。

当有连接接入server的时候,会执行connect()方法。把当前ChatAn对象加入到connections集合中。接着执行3处的方法。会根据接收到的消息进行相应的处理。下面看“3”处的代码:

@OnMessage
public void receiveMessage(String message) throws IOException {
    ChatAn chatAn = new ChatAn();
    System.out.println(message);
    if (message.startsWith("webinit")) {
        //web-client建立连接的时候自动发的第一天消息 用来命名连接userName  message格式为 webinit-web
        this.userName = message.split("-")[1];
        sendMessage(this, "连接建立");//这句话用来反馈web与server建立连接的
    } else if (message.startsWith("javaclient")) {
        //接收来自java-client的消息 每个连接无需命名username connectionID
        for (int i = 0; i < connections.size(); i++) {
            if (connections.get(i).userName.equals("web")) {//
                chatAn = connections.get(i);
                break;
            }
        }
        sendMessage(chatAn, message.substring("javaclient".length(), message.length()));
    }
}

startsWith("webinit")是当web端连接的时候执行,只会执行一次。

startsWith("javaclient")是java端连接的时候执行。在这里会遍历connections找到web的连接,然后调用sendMessage传参数,发消息。

 

  最后是重点了,看java怎么用websocket模拟client,有两个类:

  第一个:client.java
package socket1;
import javax.websocket.*;
@ClientEndpoint()
public class client {
    @OnOpen
    public void onOpen(Session session) {}
    @OnMessage
    public void onMessage(String message) {
        System.out.println("Client onMessage: " + message);
    }
    @OnClose
    public void onClose() {}
}
第二个Main.java,非常简单,重点看方法:

package socket1;
import javax.websocket.ContainerProvider;
import javax.websocket.DeploymentException;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
public class Main {
    private static String uri = "ws://localhost:8080/websocket/chat";
    private static Session session;
    private void start() {
        WebSocketContainer container = null;
        try {
            container = ContainerProvider.getWebSocketContainer();
        } catch (Exception ex) {
            System.out.println("error" + ex);
        }
        try {
            URI r = URI.create(uri);
            session = container.connectToServer(client.class, r);
        } catch (DeploymentException | IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Main client = new Main();
        client.start();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = "";
        try {
            do {
                input = br.readLine();
                if (!input.equals("exit"))
                    client.session.getBasicRemote().sendText("javaclient"+input);
            } while (!input.equals("exit"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

效果演示

动图中的数据是我自己运用到实际的项目产生的数据。是把java客户端嵌在了实际项目中。运行我的源码也可以得到类似的效果,

web端可以实时地不停地接收来自java客户端的数据。

动图

 

github项目地址:

https://github.com/simuhunluo/socket5

 

欢迎关注微信公众号“IT客“ ,投稿邮箱 itkeyy@163.com

![](http://ww1.sinaimg.cn/large/006M5LK3ly1g5r7cupix3j30go0gon1i.jpg)

 

java基于websocket实时通信的实现—goeasy

JAVAwebsocket实时消息推送在这里我记录一下之前如何实现服务器端与客户端实时通信:实现步骤如下:1.        获取GoEasy appkey.在goeasy官网上注册一个账号,并新建一个app. APP创建好后系统会为... 查看详情

java是如何实现客服在线聊天功能的?

...候,需要考虑客户端和服务端之间的通信协议。可以使用WebSocket协议,这是一种全双工通信协议,支持客户端和服务端之间的实时通信。Java提供了多个WebSocket实现,比如Tyrus、Jetty和Netty。实现服务端:在服务端实现在线聊天功... 查看详情

springboot2系列教程(十六)|整合websocket实现广播

前言如题,今天介绍的是SpringBoot整合WebSocket实现广播消息。什么是WebSocket?WebSocket为浏览器和服务器提供了双工异步通信的功能,即浏览器可以向服务器发送信息,反之也成立。WebSocket是通过一个socket来实现双工异步通信能力... 查看详情

javaspringboot整合websocket

【Java】SpringBoot整合WebSocketWebSocket简介WebSocket是一种协议,用于实现客户端和服务器之间的双向通信。它可以在单个TCP连接上提供全双工通信,避免了HTTP协议中的请求-响应模式,从而实现更高效的数据交换。WebSocket协议最初由HT... 查看详情

websocket实现实时通信(代码片段)

WebSocket是一种数据通信协议,也是用于客户端和服务端数据通信,类似于我们常见的http既然有http,为啥还要WebSockethttp通信是单向的请求+响应没有请求也就没有响应初次接触WebSocket的人,都会问同样的问题ÿ... 查看详情

websocket实践——java实现websocket的两种方式

什么是WebSocket?   随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服... 查看详情

如何在 iOS 应用程序中通过 websockets 实现和通信?

】如何在iOS应用程序中通过websockets实现和通信?【英文标题】:HowtoimplementandcommunicateviawebsocketsinaniOS-app?【发布时间】:2011-12-0712:04:58【问题描述】:我想创建一个包含UIWebview的简单应用程序。现在我想通过websockets与该页面进... 查看详情

websocket的简单实现

参考技术AWebSocket协议是基于TCP的一种新的网络协议。浏览器通信通常是基于HTTP协议,为什么还需要另一个协议?因为http只能由客户端发起,不能由服务端发起。而WebSocket浏览器和服务器只需要完成一次握手,两者之间就直接可... 查看详情

websocket基于tomcat实现

参考技术AWebSocket是一种支持双向通讯网络通信协议。意思就是服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息属于服务器推送技术的一种。模拟一个用户分别通过H5,PC端,小程序登录系统,后登录的应... 查看详情

利用websocket使网页和服务器通信

WebSocketprotocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。具体说明请查阅相关资料,下面我来演示一种简单的页面与服务器通信的简单样例。新建个web工程(基于tomcat-7版本(6以下的版本未实现webSocket... 查看详情

Websocket 通信与 Netty 环境

】Websocket通信与Netty环境【英文标题】:WebsocketcommunicationversusNettyEnvironment【发布时间】:2020-03-1908:36:21【问题描述】:我需要实现两个Java环境之间的通信。接收方是SpringBoot响应式应用,处理通信的sn-p如下(bean的配置我就略过... 查看详情

java/spring 和 c++/qt 应用程序与 websockets 之间的通信

】java/spring和c++/qt应用程序与websockets之间的通信【英文标题】:Comunicationbetweenjava/springandc++/qtapplicationswithwebsockets【发布时间】:2020-04-0918:15:04【问题描述】:我正在尝试使用带有java/web应用程序的spring实现websockets,以允许它与... 查看详情

springboot整合websocket实现客户端与服务端通信(代码片段)

定义?WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议。此WebSocketAPI可在用户的浏览器和服务器之间进行双向通信。用户可以向服务器发送消息并接收事件驱动的响应,而无需轮询服务器。它可以让... 查看详情

简易服务端之servlet实现websocket消息通信(代码片段)

...内容,介绍一下大学时期经常用到的Servlet是如何实现WebSocket连接与通信的,编写Servlet不需要搭建复杂的框架,沿用大学期间学习的Web项目经验即可,适用于大学生开发毕业设计或者课程作业等场景。话不多说ÿ... 查看详情

简易服务端之servlet实现websocket消息通信(代码片段)

...内容,介绍一下大学时期经常用到的Servlet是如何实现WebSocket连接与通信的,编写Ser 查看详情

用java和websocket实现实时通讯

说到websocket大家一定不会陌生,WebSocket是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成,当浏览器和服务器握手成功后,浏览器和服务器之间就形成了一条快速通道。两... 查看详情

javawebsocket的实现以及springwebsocket

开始学习WebSocket,准备用它来实现一个在页面实时输出log4j的日志以及控制台的日志。首先知道一些基础信息:java7开始支持WebSocket,并且只是做了定义,并未实现tomcat7及以上,jetty9.1及以上实现了WebSocket,其他容器没有研究sprin... 查看详情

使用html5的websocket实现服务端和客户端数据通信(有演示和源码)

WebSocket协议是基于TCP的一种新的网络协议。WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信。WebSocket最大特点就是,服务器可以主动... 查看详情