在使用java作为后台测试微信小程序时,发现:

1.后台中ServerHttpRequest request中的session是空的,前端通过wx.connectSocket传递的data也没看到。

2.可以从前端网后台传递信息,但是后台往前端发送时会报出如下错误

有没有大神能告知下解决方案呢?

Java后台实现WebSocket时一共尝试了两种方案,一种是java+spring,一种是纯spring的,而且两者都会出现上面的情况,同时

其中:

springMVC时报如下错误:

Exception in thread "Thread-21" java.lang.IllegalStateException: The remote endpoint was in state [STREAM_WRITING] which is an invalid state for called method

at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1225)

at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textPartialStart(WsRemoteEndpointImplBase.java:1182)

at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:222)

at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:49)

at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.sendTextMessage(StandardWebSocketSession.java:197)

at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:104)

at cn.zhonya.WXTalkDome.webSocket.MyWebSocketHandler$1.run(MyWebSocketHandler.java:139)

at java.lang.Thread.run(Thread.java:745)

java+spring时会报如下错误:

java.lang.IllegalStateException: The remote endpoint was in state [WRITER_WRITING] which is an invalid state for called method

at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1225)

at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:1187)

at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:190)

at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)

at cn.zhonya.WXTalkDome.webSocket.MyWebSocket.sendMessage(MyWebSocket.java:107)

at cn.zhonya.WXTalkDome.webSocket.MyWebSocket.onMessage(MyWebSocket.java:80)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80)

at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:399)

at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:106)

at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:500)

at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:295)

at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:131)

at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:69)

at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)

at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1419)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:44)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)

java+spring的socket代码如下:

@ServerEndpoint(value = "/websocket2.do",configurator = SpringConfigurator.class)

public class MyWebSocket {

private static int onlineCount = 0;

public MyWebSocket(){

}

@Autowired

private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();

private static Logger logger = Logger.getLogger(MyWebSocket.class);

private Session session;

/**

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

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

*/

@OnOpen

public void onOpen(Session session, @PathParam("user") String user,@PathParam("uid") String uid){

this.session = session;

// session.getAttributes();

logger.info("——————————————");

logger.info("——————————————");

logger.info("——————————————");

logger.info("——————————————");

JSONObject s = new JSONObject(session);

String str= session.getQueryString();

String [] strs = str.split("&");

int slen = strs.length;

for(String quey:strs){

String [] q = quey.split("=");

System.out.println("sing:"+q[0]+" value:"+q[1]);

}

logger.info("webSocketSet————————:"+s.toString());

logger.info("——————————————");

logger.info("——————————————");

logger.info("——————————————");

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

addOnlineCount();//在线人数加1

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

}

/**

* 连接关闭调用的方法

*/

@OnClose

public void onClose(){

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

subOnlineCount();

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

}

@OnMessage

public void onMessage(String message,Session session){

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

//群发消息

for(MyWebSocket item:webSocketSet){

try{

if(item.session == session){

// item.sendMessage("

我说:"+message+" 当前在线人数:"+getOnlineCount()+"

");

item.sendMessage(message);

}else{

item.sendMessage("

"+message+" 当前在线人数:"+getOnlineCount()+"

");

}

}catch (IOException e){

e.printStackTrace();

continue;

}

}

}

@OnError

public void onError(Session session,Throwable error){

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

error.printStackTrace();

}

/**

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

* @param message

*/

private void sendMessage(String message) throws IOException {

//保存到数据库

// Content content = new Content();

// content.setContent(message);

// content.setCreateDate(StringUtilZ.getTimestampOfNow("yyyy-MM-dd HH:mm:ss"));

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

}

public static synchronized int getOnlineCount(){

return onlineCount;

}

public static synchronized void addOnlineCount() {

MyWebSocket.onlineCount++;

}

private static synchronized void subOnlineCount(){

MyWebSocket.onlineCount--;

}

}

springmvc自身的那个文件比较多就不多贴了,暂时贴下那个139行上下的内容

public void broadcast(final TextMessage message)throws IOException {

Iterator> it = userSocketSessionMap

.entrySet().iterator();

//多线程群发

while(it.hasNext()){

final Map.Entry entry = it.next();

if(entry.getValue().isOpen()){

new Thread(new Runnable() {

public void run() {

try{

if(entry.getValue().isOpen()){

entry.getValue().sendMessage(message);

}

} catch (IOException e){

e.printStackTrace();

}

}

}).start();

}

}

}

这两种方法在普通WebSocket中都没问题,换到微信小程序就只能接受客户端消息,没办法将消息从服务器传到客户端。怀疑是不是那个session的问题啊,在小程序中使用获取到的session就是空的了。

小程序websocket java_微信小程序websocket java获取不到data相关推荐

  1. 微信小程序语音识别java_微信小程序实现语音识别功能

    原标题:微信小程序实现语音识别功能 使用小程序实现语音识别功能,由于语音识别可以直接使用各厂家的API接口,并且小程序为腾讯所有,因此考虑到可能的低延时,采用了腾讯提供的免费API接口,准确讲是腾讯语 ...

  2. 【微信小程序控制硬件⑧ 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!(附带Demo)

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  3. 微信小程序开发学习笔记001--认识微信小程序,第一个微信小程序

    第一天,认识微信小程序,第一个微信小程序 1.什么是微信小程序? 是h5网页嘛?不是 微信张小龙说: 小程序是一种不需要下载安装即可使用的应用, 它实现了应用"触手可及"的梦想,用 ...

  4. php小程序地图处理,微信小程序 地图map详解及简单实例

    微信小程序 地图map 微信小程序map 地图属性名类型默认值说明longitudeNumber中心经度 latitudeNumber中心纬度 scaleNumber1缩放级别 markersArra ...

  5. 一个C#程序员学习微信小程序的笔记

    一个C#程序员学习微信小程序的笔记 客户端打开小程序的时候,就将代码包下载到本地进行解析,首先找到了根目录的 app.json ,知道了小程序的所有页面. 在这个Index页面就是我们的首页,客户端在 ...

  6. 友盟分享小程序_iOS分享微信小程序

    最近项目中遇到了APP分享微信小程序,记录下来问题,希望能帮助到需要的人 项目中的分享集成的是第三方的友盟,我看了下微信官方的sdk和友盟的小程序分享差不多,于是,就先罗列下友盟的分享 1.首先在微信 ...

  7. 小程序 php cookie,微信小程序使用Cookie

    微信小程序使用Cookie 微信小程序不支持Cookie,因此,需要借助小程序的数据缓存来实现Cookie. 环境: mpvue + fly.js 登录成功后,在处理登录验证的method里,加入以下 ...

  8. wechat-app-mall — 微信小程序商城,微信小程序微店

    简介: wechat-app-mall - 微信小程序商城,微信小程序微店 网盘下载地址: http://kekewangLuo.cc/5Y95XKVEXkL0 图片:

  9. 我的第一个小程序(Discuz! + 微信小程序)

    关于这个小程序 Github : https://github.com/DowneyL/di...' 这个小程序是公司针对一个自家产品的需求,而这个产品就是 Discuz (我知道没啥人用了,就不要吐 ...

最新文章

  1. Centos用yum安装X Winodw
  2. 算法实践1_线性回归
  3. HTML的标签描述18
  4. RDKit | 基于RDKit探索ChEMBL数据库中合成药物历史
  5. 滴滴开源支撑业务代码重构工具Rdebug
  6. 关于MySQL线程池,这也许是目前最全面的实用帖!(转载)
  7. python深度神经网络量化_深度神经网络数据集大小
  8. C语言学习笔记---指向函数的指针
  9. php自动生产静态页
  10. db2 查看表结构_数据库结构文档的生成利器
  11. 从键盘输入5个学生每科分数,把分数保存到一个数组中,最后输出分数大于60分的成绩
  12. sun java认证真题,sun scjp考试心得_java认证
  13. twaver html5 2d demo,TWaver 2D+GIS+3D的试用和在线Demo
  14. vscode 初始化HTML结构
  15. 落魄前端,整理给自己的前端知识体系复习大纲(上篇,2w字)
  16. tp6 导入excel文件
  17. ubuntu占用空间清理
  18. pic16F877A音乐盒c语言,基于PIC16F877A单片机的混沌信号发生器的设计
  19. H.264码流结构及JM8.6中码流的产生步骤
  20. Java8时间校正器

热门文章

  1. SoundPool 音频播放 详解 示例
  2. MDT2012部署系列之10 Win7镜像捕获与系统安装
  3. 如何退出Activity?如何安全退出已调用多个Activity的Application?
  4. 华为交换机端口绑定mac防arp欺骗
  5. 喜讯不断,BCH又迎来两个代币发行方案
  6. mysql-interview
  7. Strange Towers of Hanoi (POJ1958)
  8. 接班 RT 系统?Windows 10 云服务版首次亮相
  9. 32.突然弹出很多IE窗口怎么办:
  10. Redis的数据类型以及每种数据类型的使用场景