当前位置: 代码迷 >> Java Web开发 >> 【websocket】为啥就是握手不成功呢?没看出有关问题来
  详细解决方案

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

热度:250   发布时间:2016-04-16 22:15:27.0
【websocket】为啥就是握手不成功呢?没看出问题来啊
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包都删了

死活握手不成功!!!!!!

------解决方案--------------------
和服务器版本有关系,这个tomcat服务器可能版本太低。
  相关解决方案