java socket 怎么给websocket发信息

 我来答
育知同创教育
2017-12-04 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部

1.InitServlet

该类主要是用来初始化构造将来存储用户身份信息的map仓库,利用其初始化方法Init 初始化仓库, 利用其静态方法getSocketList 获得对应的用户身份信息。

webSocket ,我认为MessageInbound 用来识别登录人的信息,用它来找到对应的人,推送消息。每次登录都会产生一个MessageInbound。

这里的 HashMap<String,MessageInbound>    :string 存储用户session的登录id,MessageInbound存储 推送需要的身份信息。以上属于个人口头话理解。

package socket;

import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.catalina.websocket.MessageInbound;

public class InitServlet extends HttpServlet {

    private static final long serialVersionUID = -3163557381361759907L;  
    
    //private static List<MessageInbound> socketList;    
    private static HashMap<String,MessageInbound> socketList;    
      
    public void init(ServletConfig config) throws ServletException {    
//        InitServlet.socketList = new ArrayList<MessageInbound>();    
        InitServlet.socketList = new HashMap<String,MessageInbound>();    
        super.init(config);    
        System.out.println("Server start============");    
    }    
        
    public static HashMap<String,MessageInbound> getSocketList() {    
        return InitServlet.socketList;    
    }    
/*    public static List<MessageInbound> getSocketList() {    
        return InitServlet.socketList;    
    }    
*/}

2.MyWebSocketServlet 

websocket用来建立连接的servlet,建立连接时,首先在session获取该登录人的userId,在调用MyMessageInbound构造函数传入userId

package socket;

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.CharBuffer;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
/**
 * 
 * @ClassName: MyWebSocketServlet 
 * @Description: 建立连接时创立 
 * @author mangues
 * @date 2015-7-19
 */
public class MyWebSocketServlet extends WebSocketServlet {
    
    public String getUser(HttpServletRequest request){ 
        String userName = (String) request.getSession().getAttribute("user");
        if(userName==null){
            return null;
        }
        return userName;  
       // return (String) request.getAttribute("user");  
    }  
    @Override
    protected StreamInbound createWebSocketInbound(String arg0,
            HttpServletRequest request) {
        System.out.println("##########");  
        return new MyMessageInbound(this.getUser(request)); 
    }

}

3.onOpen方法调用InitServlet的map身份仓库,

放入用户userId 和 对应该登录用户的websocket身份信息MessageInbound (可以用userId来寻找到推送需要的 身份MessageInbound )

onTextMessage :用来获取消息,并发送消息

package socket;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.HashMap;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;

import util.MessageUtil;

public class MyMessageInbound extends MessageInbound {

    private String name;
    public MyMessageInbound() {
        super();
    }

    public MyMessageInbound(String name) {
        super();
        this.name = name;
    }

    @Override  
    protected void onBinaryMessage(ByteBuffer arg0) throws IOException {  
        // TODO Auto-generated method stub 
          
    }  
  
    @Override  
    protected void onTextMessage(CharBuffer msg) throws IOException { 
        //用户所发消息处理后的map
        HashMap<String,String> messageMap = MessageUtil.getMessage(msg);    //处理消息类
        //上线用户集合类map
        HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList();
        
        String fromName = messageMap.get("fromName");    //消息来自人 的userId
        
  
        String toName = messageMap.get("toName");         //消息发往人的 userId
        //获取该用户
        MessageInbound messageInbound = userMsgMap.get(toName);    //在仓库中取出发往人的MessageInbound
        
        
        
        if(messageInbound!=null){     //如果发往人 存在进行操作
             WsOutbound outbound = messageInbound.getWsOutbound(); 
             
             
             String content = messageMap.get("content");  //获取消息内容
             String msgContentString = fromName + "     " + content;   //构造发送的消息
             
             //发出去内容
             CharBuffer toMsg =  CharBuffer.wrap(msgContentString.toCharArray());
            outbound.writeTextMessage(toMsg);  //
            outbound.flush();
        }
     
        
        
      /*  for (MessageInbound messageInbound : InitServlet.getSocketList()) {  
            CharBuffer buffer = CharBuffer.wrap(msg);  
            WsOutbound outbound = messageInbound.getWsOutbound();  
            outbound.writeTextMessage(buffer);  
            outbound.flush();  
        }  */
          
    }  
  
    @Override  
    protected void onClose(int status) {  
        InitServlet.getSocketList().remove(this);  
        super.onClose(status);  
    }  
  
    @Override  
    protected void onOpen(WsOutbound outbound) {  
        super.onOpen(outbound);  
        //登录的用户注册进去
        if(name!=null){
            InitServlet.getSocketList().put(name, this);  
        }
//        InitServlet.getSocketList().add(this);  
    }  
      
      
}

4.消息处理类,处理前端发来的消息

package util;

import java.nio.CharBuffer;
import java.util.HashMap;
/**
 * 
 * @ClassName: MessageUtil 
 * @Description: 消息处理类
 * @author mangues
 * @date 2015-7-19
 */
public class MessageUtil {

    public static HashMap<String,String> getMessage(CharBuffer msg) {
        HashMap<String,String> map = new HashMap<String,String>();
        String msgString  = msg.toString();
        String m[] = msgString.split(",");
        map.put("fromName", m[0]);
        map.put("toName", m[1]);
        map.put("content", m[2]);
        return map;
    }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式