我在做离线消息,当socket连接时走onOpen方法时,我查数据库是否有我的离线消息,如果有我以此构建消息实体,然后发送给当前session,代码如下
/**
* 连接打开时的回调
* @param session
*/
public void onOpen(Session session, EndpointConfig config) {
changeSessionId(session);
String wsid = session.getId();
String strs = session.getQueryString();//获取请求参数
System.out.println(strs);
String username = strs.split("=")[1];
username = username.substring(0,username.length()-3);//截取用户名
int id = Integer.valueOf(strs.split("=")[2]); //截取id
try {
username = URLDecoder.decode(username,"utf-8"); //转码
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
this.username = username;
this.id = id;
this.session = session;
//维护当前session
WsHandler handler = createHandler(session, config);
// handler.setRoomProvider(roomProvider);
// handler.setSession(session);
session.addMessageHandler(handler);
sessions.put(wsid, session);
handlers.put(username, handler);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//查看是否有离线消息
List<ChatMessage> list = chatMessageDao.getUnRead(id,username);
if(list!=null && list.size()>0){
for(ChatMessage c : list){
if(1 == c.getType()){ //单聊
SendMessage sendMessage = new SendMessage();
sendMessage.setUsername(c.getUsername());
sendMessage.setAvatar(c.getAvatar());
sendMessage.setId(c.getFrom().toString());
sendMessage.setType("friend");
sendMessage.setContent(c.getContent());
// if(to.get("username").equals(username)){
// sendMessage.setMine(true);
// }else{
// sendMessage.setMine(false);
// }
sendMessage.setFromid(c.getFrom().toString());
sendMessage.setTimestamp(Long.valueOf(c.getTimestamp()));
String strJson =Json.toJson(sendMessage);
System.out.println("好友消息:"+strJson);
session.getAsyncRemote().sendText(strJson);
}else if(2 == c.getType()){ //群聊
System.out.println("send group message...");
//构建转发消息实体
SendMessage sendMessage = new SendMessage();
sendMessage.setUsername(c.getUsername());
sendMessage.setAvatar(c.getAvatar());
sendMessage.setId(c.getFrom().toString());
sendMessage.setType("group");
sendMessage.setContent(c.getContent());
sendMessage.setFromid(null);
// if(to.get("username").equals(username)){
// sendMessage.setMine(true);
// }else{
// sendMessage.setMine(false);
// }
// sendMessage.setFromid(mine.get("id"));
sendMessage.setTimestamp(Long.valueOf(c.getTimestamp()));
String strJson =Json.toJson(sendMessage);
// String strJson = sendMessage.toJson();
System.out.println(strJson);
// session.getAsyncRemote().sendText(strJson);
try {
session.getBasicRemote().sendText(strJson);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// session.getAsyncRemote().sendText(arg0);
}
System.out.println(username+"上线了...");
System.out.println("当前在线:"+handlers);
}
但是抛了这个异常:
五月 05, 2017 9:06:40 上午 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
严重: Error reading request, ignored
java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1177)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:1140)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendStringByCompletion(WsRemoteEndpointImplBase.java:213)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendStringByFuture(WsRemoteEndpointImplBase.java:201)
at org.apache.tomcat.websocket.WsRemoteEndpointAsync.sendText(WsRemoteEndpointAsync.java:53)
at com.mychat.socket.NutSocket.onOpen(NutSocket.java:97)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:127)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:703)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
有时候是好的,但有时候就抛这个异常,百度的呢是说onMessage什么的返回值什么鬼的,但是好像跟那么没啥关系呀