最近公司在搞一个项目刚好需要用到WebSocket技术来实现实时数据的传输,因为之前也没接触过,所以捣鼓了好些天,最近恰巧有空就写写。有误的地方还请大牛们能及时指正。

项目背景:基于spring+spring MVC+mybatis框架的maven项目

服务端:

1、添加Jar包依赖:

<dependency>
  <groupId>javax.websocket</groupId>
  <artifactId>javax.websocket-api</artifactId>
  <version>1.1</version>
  <scope>provided</scope>
</dependency>

2、创建一个WebSocket服务端类MyWebSocketServer,并在类前添加@ServerEndpoint(value = "/websocket")注解,@ServerEndpoint(value = "/websocket")注释端点表示将 WebSocket 服务端运行在 ws://[Server 端 IP 或域名]:[Server 端口]/项目名/websocket 的访问端点

3、实现onOpen、onClose、onMessage、onError等方法

实例代码:

MyWebSocketServer 类

import java.io.IOException;
import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import net.sf.json.JSONObject; @ServerEndpoint(value = "/websocket")
public class MyWebSocketServer {
  private Logger logger = Logger.getLogger(MyWebSocketServer.class);
  private Session session;   /**
  * 连接建立后触发的方法
   */
  @OnOpen
  public void onOpen(Session session){
    this.session = session;
    logger.info("onOpen"+session.getId());
    WebSocketMapUtil.put(session.getId(),this);
  }

  /**
  * 连接关闭后触发的方法
  */
  @OnClose
  public void onClose(){
    //从map中删除
    WebSocketMapUtil.remove(session.getId());
    logger.info("====== onClose:"+session.getId()+" ======");
  }

  /**
   * 接收到客户端消息时触发的方法
   */
  @OnMessage
  public void onMessage(String params,Session session) throws Exception{
    //获取服务端到客户端的通道
    MyWebSocketServer myWebSocket = WebSocketMapUtil.get(session.getId());
    logger.info("收到来自"+session.getId()+"的消息"+params);
    String result = "收到来自"+session.getId()+"的消息"+params;
    //返回消息给Web Socket客户端(浏览器)
    myWebSocket.sendMessage(1,”成功!”,result);
  }   /**
   * 发生错误时触发的方法
  */
  @OnError
  public void onError(Session session,Throwable error){
    logger.info(session.getId()+"连接发生错误"+error.getMessage());
    error.printStackTrace();
  }   public void sendMessage(int status,String message,Object datas) throws IOException{
    JSONObject result = new JSONObject();
    result.put("status", status);
    result.put("message", message);
    result.put("datas", datas);
this.session.getBasicRemote().sendText(result.toString());
} }

WebSocketMapUtil 工具类

import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; public class WebSocketMapUtil {   public static ConcurrentMap<String, MyWebSocketServer> webSocketMap = new ConcurrentHashMap<>();   public static void put(String key, MyWebSocketServer myWebSocketServer){
  webSocketMap.put(key, myWebSocketServer);
} public static MyWebSocketServer get(String key){
return webSocketMap.get(key);
} public static void remove(String key){
webSocketMap.remove(key);
} public static Collection<MyWebSocketServer> getValues(){
return webSocketMap.values();
}
}

客户端:

1、添加Jar包依赖:

<dependency>
  <groupId>org.java-websocket</groupId>
  <artifactId>Java-WebSocket</artifactId>
  <version>1.3.8</version>
</dependency>

2、创建Web Socket客户端类MyWebSocketClient,并继承WebSocketClient

3、实现构造器,重写onOpen、onClose、onMessage、onError等方法

实例代码:

MyWebSocketClient 类

import java.net.URI;
import org.activiti.engine.impl.util.json.JSONObject;
import org.apache.log4j.Logger;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake; public class MyWebSocketClient extends WebSocketClient{   Logger logger = Logger.getLogger(MyWebSocketClient.class);   public MyWebSocketClient(URI serverUri) {
    super(serverUri);
  }   @Override
  public void onOpen(ServerHandshake arg0) {
    // TODO Auto-generated method stub
    logger.info("------ MyWebSocket onOpen ------");
  }   @Override
  public void onClose(int arg0, String arg1, boolean arg2) {
    // TODO Auto-generated method stub
    logger.info("------ MyWebSocket onClose ------");
  }   @Override
  public void onError(Exception arg0) {
    // TODO Auto-generated method stub
    logger.info("------ MyWebSocket onError ------");
  }   @Override
  public void onMessage(String arg0) {
    // TODO Auto-generated method stub
    logger.info("-------- 接收到服务端数据: " + arg0 + "--------");
  }
}

MyTest 测试类

public class MyTest{

  public static void main(String[] arg0){
    MyWebSocketClient myClient = new MyWebSocketClient("此处为websocket服务端URI");
    // 往websocket服务端发送数据
    myClient.send("此为要发送的数据内容");
  } }

用JAVA分别实现WebSocket客户端与服务端的更多相关文章

  1. java Socket通信,客户端与服务端相互发消息

    1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...

  2. 实验09——java基于TCP实现客户端与服务端通信

    TCP通信         需要先创建连接 - 并且在创建连接的过程中 需要经过三次握手        底层通过 流 发送数据 数据没有大小限制        可靠的传输机制 - 丢包重发 包的顺序的 ...

  3. 编写Java程序,应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能

    查看本章节 查看作业目录 需求说明: 应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能 实现思路: 创建 Java 项目,在项目中创建服务端类 ChatServerThre ...

  4. 编写Java程序,实现客户端向服务端上传文件的功能

    查看本章节 查看作业目录 需求说明: 实现客户端向服务端上传文件的功能 当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径.当客户在客户端输入完成后,服务端实现文件上传 实现思 ...

  5. [Java]Hessian客户端和服务端代码例子

    简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...

  6. Java实现UDP之Echo客户端和服务端

    Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  7. Java实现TCP之Echo客户端和服务端

    Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  8. Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序

    演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...

  9. java客户端与服务端交互通用处理 框架解析

    一.综述 java 客户端与服务端交互过程中,采用NIO通讯是异步的,客户端基本采用同一处理范式,来进行同异步的调用处理. 处理模型有以下几个要素: 1. NIO发送消息后返回的Future 2. 每 ...

随机推荐

  1. git 通过 SublimeMerge 处理冲突

    在使用 Git 的时候,如果是多个小伙伴开发,那么如果同时修改一个文件将出现冲突.也就是在自动合并的时候不知道使用哪个代码才对,此时就需要合并工具的协助.我找了很久发现 SublimeMerge 是界 ...

  2. 小心Powershell的位数

    我们都知道64位的 Windows 中有两个Powershell,32位的 Windows Powershell(x86)和64位的 Windows Powershell.(当然,32位的Window ...

  3. Android程序分析环境(搭建步骤略)

    1:安装JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).没有JDK的话,无法编译Java程序. 2:安装Android  SDK Androi ...

  4. JMeter Web测试计划

    在本节中,将学习如何创建测试网页的基本测试计划. 出于演示测试目的,我们将测试URL - https://www.yiibai.com/ 的网页性能. 创建JMeter测试计划 进入到JMeter安装 ...

  5. 浅谈月薪3万 iOS程序员 的职业规划与成长!(进阶篇)

    前言: 干了这么多年的iOS,虽然接触了许多七七八八的东西.技术,但是感觉本身iOS却没有什么质的飞越,可能跟自己接触的项目深度有关,于是决定在学习其他技术的同时,加强自己在iOS方面的学习,提高自己 ...

  6. pyinstaller打包py脚本Warning:lib not found等相关问题

    小爬从使用Pyinstaller打包py为exe文件以来,一直都会碰到Warning:lib not found等相关问题,诸如: 虽然大多数时候,您像我一样忽略这些warning,打包后的exe也能 ...

  7. 【一起学源码-微服务】Nexflix Eureka 源码十:服务下线及实例摘除,一个client下线到底多久才会被其他实例感知?

    前言 前情回顾 上一讲我们讲了 client端向server端发送心跳检查,也是默认每30钟发送一次,server端接收后会更新注册表的一个时间戳属性,然后一次心跳(续约)也就完成了. 本讲目录 这一 ...

  8. [工具] Git版本管理(二)(分支)

    一.分支 1.git中如何保存版本 在我们以往使用文件来进行版本控制的时候,都是将上一个版本复制一份,然后在其基础上进行修改. 但在git中,git只保存当前版本和上一个版本之间的差异,这样可以节省存 ...

  9. FPGA之乒乓操作

    1.乒乓操作原理 乒乓操作是一个主要用于数据流控制的处理技巧,典型的乒乓操作如图所示: 外部输入数据流通过“输入数据选择控制”模块送入两个数据缓冲区中,数据缓冲模块可以为任何存储模块,比较常用的存储单 ...

  10. 【题解】P5462 X龙珠

    [题解]P5462 X龙珠 赛题 #B: P5462 X龙珠 | 满分: 100分 发一个set做法 维护两个set,一个按照顺序排序,一个按照值排序. 每次从大往小取,问题就变成了判断这个最大值后面 ...