【websocket】为啥就是握手不成功呢?没看出问题来啊

一叶箛星墜涳城丶 2014-06-22 10:40:19
tomcat服务器端:
处理websocket连接
package websocket;

import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;

public class WebSocketMessageServlet extends WebSocketServlet{

@Override
protected StreamInbound createWebSocketInbound(String arg0,
HttpServletRequest request) {
// TODO Auto-generated method stub
String username= (String)request.getSession().getAttribute("user_nickname");
System.out.println(username);
return new WebSocketMessageInboundPool(username);
}
}


处理websocket请求
package websocket;

import java.io.IOException;
import java.nio.CharBuffer;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;

public class WebSocketMessageInboundPool extends MessageInbound{

private final String user_nickname;
private static final Map<String,WebSocketMessageInboundPool > Connections = new HashMap<String,WebSocketMessageInboundPool>();

public WebSocketMessageInboundPool(String username){
this.user_nickname=username;
}

protected void onOpen(WsOutbound outbound) {
// TODO Auto-generated method stub
addMessageInbound(this);
super.onOpen(outbound);
}

protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
// TODO Auto-generated method stub
// 向所有已连接的客户端发送文本消息
try {
//向特定的用户发送数据
WebSocketMessageInboundPool inbound = Connections.get(user_nickname);
if(inbound != null){
ByteBuffer bb = ByteBuffer.wrap(arg0.array());
WsOutbound wb = inbound.getWsOutbound();
wb.writeBinaryMessage(bb);
wb.flush();
}
}
catch (IOException e) {
e.printStackTrace();
}
}

protected void onTextMessage(CharBuffer arg0) throws IOException {
// TODO Auto-generated method stub
try {
//向特定的用户发送数据
WebSocketMessageInboundPool inbound = Connections.get(user_nickname);
if(inbound != null){
CharBuffer cb = CharBuffer.wrap(arg0);
WsOutbound wb = inbound.getWsOutbound();
wb.writeTextMessage(cb);
wb.flush();
}
}
catch (IOException e) {
e.printStackTrace();
}
}

protected void onClose(int status) {
// TODO Auto-generated method stub
removeMessageInbound(this);
super.onClose(status);
}

//向连接池中添加连接
public static void addMessageInbound(WebSocketMessageInboundPool inbound){
//添加连接
Connections.put(inbound.user_nickname, inbound);
}
public static void removeMessageInbound(WebSocketMessageInboundPool inbound){
//移除连接
Connections.remove(inbound.user_nickname);
}
}



xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>

<servlet>
<servlet-name>WebSocketMessageServlet</servlet-name>
<servlet-class>websocket.WebSocketMessageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WebSocketMessageServlet</servlet-name>
<url-pattern>/web</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>



ws:ws = new WebSocket("ws://192.168.3.51/S2012150143/web");

tomcat中WEB-INF下lib中的jar包都删了

死活握手不成功!!!!!!
...全文
923 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_24423021 2014-12-24
  • 打赏
  • 举报
回复
可以吧你的jsp代码给我吗
  • 打赏
  • 举报
回复
和服务器版本有关系,这个tomcat服务器可能版本太低。
姜小白- 2014-06-22
  • 打赏
  • 举报
回复
Tomcat7、Java、WebSocket的服务器推送聊天室 这个Servlet跟普通的Servlet有些不同,继承的WebSocketServlet类,并且要重写createWebSocketInbound方法。 估计是必须要重写吧。
  • 打赏
  • 举报
回复
public class WebSocketMessageServlet extends WebSocketServlet{

protected StreamInbound createWebSocketInbound(String arg0) {
System.out.println("$$$$$$$$");
return new WebSocketMessageInboundPool("1");
}


这样写就能握手,太奇怪了,明明要重载父类抽象方法才是正确的。

我在浏览器上F12看了一下,错误是这样说的


姜小白- 2014-06-22
  • 打赏
  • 举报
回复
没搞过 WebSocketServlet,楼主可否打断点试试看呢?先看消息是否成功发送出去,然后看是否可以接收到。 如果发送出去,但接收不到,那说明中间的通信通道的配置连接估计有问题了。
  • 打赏
  • 举报
回复
木有人吗?...
  • 打赏
  • 举报
回复
引用 4 楼 magi1201 的回复:
Tomcat7、Java、WebSocket的服务器推送聊天室 这个Servlet跟普通的Servlet有些不同,继承的WebSocketServlet类,并且要重写createWebSocketInbound方法。 估计是必须要重写吧。
我重写试过了,握手失败。 不重写,就能成功,不知道为啥

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧