Java后端实现websocket与微信小程序端连接简单例子

简介: Java后端实现websocket与微信小程序端连接简单例子http://www.bieryun.com/963.html 直接附代码 前端代码:

Java后端实现websocket与微信小程序端连接简单例子http://www.bieryun.com/963.html


直接附代码
前端代码:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPE HTML>

<html>

<head>

<base href="<%=basePath%>">

<title>My WebSocket</title>

</head>

 

<body>

Welcome<br/>

<input id="text" type="text" /><button onclick="send()">Send</button>    <button onclick="closeWebSocket()">Close</button>

<div id="message">

</div>

</body>

 

<script type="text/javascript">

var websocket = null;

 

//判断当前浏览器是否支持WebSocket

if('WebSocket' in window){

websocket = new WebSocket("ws://localhost:8080/myWebSocket/websocket");

}

else{

alert('Not support websocket')

}

 

//连接发生错误的回调方法

websocket.onerror = function(){

setMessageInnerHTML("error");

};

 

//连接成功建立的回调方法

websocket.onopen = function(event){

setMessageInnerHTML("open");

}

 

//接收到消息的回调方法

websocket.onmessage = function(event){

setMessageInnerHTML(event.data);

}

 

//连接关闭的回调方法

websocket.onclose = function(){

setMessageInnerHTML("close");

}

 

//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。

window.onbeforeunload = function(){

websocket.close();

}

 

//将消息显示在网页上

function setMessageInnerHTML(innerHTML){

document.getElementById('message').innerHTML += innerHTML + '<br/>';

}

 

//关闭连接

function closeWebSocket(){

websocket.close();

}

 

//发送消息

function send(){

var message = document.getElementById('text').value;

websocket.send(message);

}

</script>

</html>

后端代码:

import java.io.IOException;

import java.util.concurrent.CopyOnWriteArraySet;

 

import javax.websocket.OnClose;

import javax.websocket.OnError;

import javax.websocket.OnMessage;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.ServerEndpoint;

 

//该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。类似Servlet的注解mapping。无需在web.xml中配置。

@ServerEndpoint("/websocket")

public class MyWebSocket {

//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。

private static int onlineCount = 0;

 

//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识

private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();

 

//与某个客户端的连接会话,需要通过它来给客户端发送数据

private Session session;

 

/**

* 连接建立成功调用的方法

* @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据

*/

@OnOpen

public void onOpen(Session session){

this.session = session;

webSocketSet.add(this);     //加入set中

addOnlineCount();           //在线数加1

System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());

}

 

/**

* 连接关闭调用的方法

*/

@OnClose

public void onClose(){

webSocketSet.remove(this);  //从set中删除

subOnlineCount();           //在线数减1

System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());

}

 

/**

* 收到客户端消息后调用的方法

* @param message 客户端发送过来的消息

* @param session 可选的参数

*/

@OnMessage

public void onMessage(String message, Session session) {

System.out.println("来自客户端的消息:" + message);

 

//群发消息

for(MyWebSocket item: webSocketSet){

try {

item.sendMessage(message);

} catch (IOException e) {

e.printStackTrace();

continue;

}

}

}

 

/**

* 发生错误时调用

* @param session

* @param error

*/

@OnError

public void onError(Session session, Throwable error){

System.out.println("发生错误");

error.printStackTrace();

}

 

/**

* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。

* @param message

* @throws IOException

*/

public void sendMessage(String message) throws IOException{

this.session.getBasicRemote().sendText(message);

//this.session.getAsyncRemote().sendText(message);

}

 

public static synchronized int getOnlineCount() {

return onlineCount;

}

 

public static synchronized void addOnlineCount() {

MyWebSocket.onlineCount++;

}

 

public static synchronized void subOnlineCount() {

MyWebSocket.onlineCount--;

}

}

以上是网上的前端及后端的代码(原文地址:http://www.cnblogs.com/xdp-gacl/p/5193279.html?utm_source=tuicool&utm_medium=referral),jdk版本要求是在jdk1.7.0以上,tomcat版本也需要在tomcat7.0版本以上。另外有个需要注意的点就是websocket的api包要用tomcat自带的(websocket-api.jar),一开始本人采用的是非tomcat自带的javax.websocket-api-1.0.jar包,在配置了正确的环境之后总是连接不上,会报错:Error during WebSocket handshake: Unexpected response code: 404。

正确的效果图如下:

进入页面http://localhost:8080/myWebSocket/index.jsp

输入内容,点击send

微信小程序端发起请求:

请求代码:

 

connectWebSocket:function(){
console.log("创建webSocket连接");
wx.connectSocket({
url:'ws://localhost:8080/myWebSocket/websocket',
// url:'http://eservicesit.prlife.com.cn:7001',
data:{
x: '',
y: ''
},
header:{
'content-type': 'application/json'
},
method:"GET",
success: function(res){
console.log("创建连接成功");
//do something
},
fail:function(res){
console.log("创建连接失败,原因因::"+res.errMsg);
},
complete:function(){
console.log("创建连接complete");
}
})

}控制台输出:

相关文章
|
11天前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
30 5
|
8天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
37 3
|
9天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
24 3
|
8天前
|
小程序 前端开发 算法
|
9天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
13 1
|
9天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
25 1
|
15天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
28天前
|
NoSQL 安全 Java
Java后端基础自测
Java后端基础自测
58 12
|
28天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
32 5
|
28天前
|
SQL 存储 Java
Java中使用ClickHouseDriver连接和基本操作
通过上述步骤,你可以轻松地在Java应用中集成ClickHouse数据库,执行基本的CRUD操作。需要注意的是,实际开发中应当根据实际情况调整数据库连接配置(如URL中的主机、端口、数据库名等),并根据应用需求选择合适的异常处理策略,确保代码的健壮性和资源的有效管理。此外,对于复杂查询和大批量数据处理,建议充分利用ClickHouse的特性(如分布式处理、列式存储优化等),以进一步提升性能。
42 2
下一篇
无影云桌面