最近因为项目需要所以得使用 websocket 来进行服务器与客户端的通信。使用java 来实现服务端,Android 实现客户端。

刚开始服务端使用 @ServerEndPoint 注解来实现 Websocket 服务端,但是 Android 使用的是 autobahn 实现的客户端,所以一直连接不上,报错为:WebSockets protocol violation 。

后面我把服务端改为使用 @WebServlet 注解,并继承 WebSocketServlet 类来实现,然后就成功连接了。

这是修改之前的:

import org.apache.commons.fileupload.FileItem;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@ServerEndpoint(value = "/socketServerTest")
public class SocketServer {private int maxFileSize = 1024 * 1024 * 10;private  String userId;private Session session;public static Map<String,SocketServer> clients=new ConcurrentHashMap<>();//连接时执行@OnOpenpublic void onOpen(  Session session){System.out.println("新连接:"+userId);this.userId="test";userId="test";this.session=session;//把本连接加入到clients中clients.put(userId,this);}//关闭时执行@OnClosepublic void onClose(){System.out.println("连接关闭");}//收到消息时执行@OnMessagepublic void OnMessage(String message,Session session) throws IOException, EncodeException {session.getBasicRemote().sendText("收到用户:"+userId+"的消息:"+message);if(message.startsWith("response:")){String substring = message.substring(9);//如果app选择接受则发送文件if(substring.equals("accept")){FileItem fileItem = SendFileServlet.fileMap.get(userId);sendFileToUser(this.userId,fileItem);}else {System.out.println("用户拒绝接受文件");}}System.out.println("消息:"+message);}//连接错误时执行@OnErrorpublic void onError(Session session,Throwable error){System.out.println("错误:"+error);}//给用户发送文件public void sendFileToUser(String userId, FileItem fileItem) throws IOException, EncodeException {SocketServer socketServer = clients.get(userId);if(socketServer!=null) {byte[] fileStream = new byte[maxFileSize];fileItem.getOutputStream().write(fileStream);socketServer.session.getBasicRemote().sendBinary(ByteBuffer.wrap(fileStream));}else {System.out.println("该用户未连接");}}public void askAcceptFile(String userId,FileItem fileItem) throws IOException {SocketServer socketServer= clients.get(userId);if(socketServer!=null){byte[] bytes = fileItem.get();socketServer.session.getBasicRemote().sendText("ask,"+"file:");socketServer.session.getBasicRemote().getSendStream().write(bytes);}else {System.out.println("该用户未连接");}}
}

修改之后的:

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.Set;@WebServlet("/socket") //服务名称
public class AnSocketServer extends WebSocketServlet {/****/private static final long serialVersionUID = -1058445282919079067L;protected StreamInbound createWebSocketInbound(String s,HttpServletRequest request) {return new ChatMessageInbound();}@Overrideprotected StreamInbound createWebSocketInbound(String s) {return new ChatMessageInbound();}class ChatMessageInbound extends MessageInbound {public ChatMessageInbound(){}@Overrideprotected void onOpen(WsOutbound outbound) {super.onOpen(outbound);System.out.println("!!!!!123123123");}@Overrideprotected void onClose(int status) {super.onClose(status);System.out.println("断开连接");}@Overrideprotected void onBinaryMessage(ByteBuffer buffer) throws IOException {// TODO Auto-generated method stub  }@Overrideprotected void onTextMessage(CharBuffer buffer) throws IOException {String msg = buffer.toString();  //接受客户端消息}@Overridepublic int getReadTimeout() {return 0;}}
}

经过思考,我认为是使用的协议不一致导致的。

java服务端与Android客户端使用 websocket 通信相关推荐

  1. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  2. android java websocket client_websocket服务端,android客户端示例

    服务端库依赖详见章末 #####spring websocket服务端代码(会话过程) public class HandshakeInterceptor extends HttpSessionHan ...

  3. 深度学习-服务端训练+android客户端物体识别实战(caffe入门教程+mobilenet+ncnn+android)

    文章目录 背景 物体识别简介 自动驾驶 淘宝京东使用物体识别技术 公司业务需求 深度学习简介 深度学习的位置 深度学习概念 深度学习优势 深度学习基础知识 感知机 激活函数 多层感知机 卷积神经网络 ...

  4. 深度学习-服务端训练+android客户端物体识别实战(caffe+mobilenet+ncnn+android)

    文章目录 背景 物体识别简介 自动驾驶 淘宝京东使用物体识别技术 公司业务需求 深度学习简介 深度学习的位置 深度学习概念 深度学习优势 深度学习基础知识 感知机 激活函数 多层感知机 卷积神经网络 ...

  5. android mqtt服务器搭建,Mqtt从服务端到Android客户端搭建(mqtt服务端搭建)

    一.简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议. 此处不再引入官方文字描述,以个人开发认识浅谈一下 本文分为两部分: 1. M ...

  6. android端与服务端差别,Android客户端和服务器端编程

    我正在尝试运行我在网上找到的服务器端和客户端示例. 这是服务器: public class ServerActivity extends Activity { private TextView ser ...

  7. android应用测试与调试实战_实战 | Java 服务端和 Android 端手工测试覆盖率统计的实现...

    本文为霍格沃兹测试学院优秀学员关于后端和 App 端手工测试覆盖率的学习笔记.测试开发进阶学习,文末加群. 一.前言 代码测试覆盖率工具流行了这么多年,已经有很多成熟方案比如 Jacoco,我司近一段 ...

  8. Android服务的通信方式,android客户端与服务器通信的HTTP通信

    如下,给出HTTP通信的主要代码: 一.post方式通信 主要分为以下几步: 1.新建Httppost对象: 2.为Httppost设置参数和编码格式: 3.新建HttpClient对象: 4.新建H ...

  9. Flex通信-Java服务端通信实例

    Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用 HttpService:通过http请求 ...

最新文章

  1. iOS - APP任意push新页面那些事
  2. mysql raiserror_RAISERROR在SQL Server数据库中的用法
  3. linux常用工具命令
  4. 深度学习神经网络:改善与优化的方法
  5. JIT编译器,内联和转义分析
  6. [转载].NET平台微服务项目汇集
  7. 2009 CCTV体坛风云人物颁奖盛典,精彩语录
  8. linux java 输出_Java远程连接linux的方法,执行命令并输出结果
  9. 知识图谱最新研究综述
  10. egret php交互,JavaScript_Egret引擎开发指南之视觉编程,显示对象和显示列表 “显示 - phpStudy...
  11. aptana php 调试,AptanaStudio3+PHP程序远程调试的方法和步骤
  12. MacBook Pro的touchbar疯狂闪烁 通过写程序不断点亮touchbar,从而避免其闪烁
  13. 显示空闲链表和隐式空闲链表_使用空闲资源添加Espresso UI测试
  14. 使用PHP生成PDF文档
  15. 从表征到行动---意向性的自然主义进路(续二)
  16. PyTorch中的torch.clamp()实现矩阵裁剪
  17. 服务器主板能配固态硬盘吗,这下不用再担心老主板不能用新固态硬盘了!
  18. JAVA基础之题目练习
  19. 关于人工智能算法岗位的一点思考
  20. 2017.0311.数字电路与系统-数据选择器分配器的理解

热门文章

  1. 符号_王者荣耀龙符号名字怎么弄 打龙符号名字代码复制大全
  2. 2023年鞋服配饰行业如何玩转全域经营?
  3. 【丁丁历险记】配置 frp 实现内网穿透
  4. linux系统管理与服务器配置高志君课后答案_Linux系统管理与服务器配置(基于CentOS 7)...
  5. javascript 学习 —— BOM和DOM编程学习
  6. 大量Linux资源下载地址
  7. 北师大网络教育线计算机试题六,北师大网络教育-网络部分综合作业
  8. Go 语言 map的使用
  9. 不得不转发的极品糗事
  10. win10桌面创建我的电脑/回收站/网络/控制面板