初次接触WebSocket,关于以下代码问题求解

莫小默 2015-07-21 10:08:52
后台Java代码
package common.info;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
@WebServlet("/ChatWebSocketServlet")
public class ChatWebSocketServlet extends WebSocketServlet {
//这条不用管
private static final long serialVersionUID = 1L;
//初始化聊天信息
private String GUEST_PREFIX = "用户";
//用于自动生成连接ID
private AtomicInteger connectionIds = new AtomicInteger(0);
//用于保存所有连接Inbound的集合
private final Map<String,ChatMessageInbound> connections =
new HashMap<String,ChatMessageInbound>();
//所有的聊天用户
private final List<ChatUser> users = new ArrayList<ChatUser>();
//生成新的连接Inbound,WebSocketServlet必须实现该方法
@Override
protected StreamInbound createWebSocketInbound(String subProtocol,
HttpServletRequest request) {
ChatMessageInbound cmi = new ChatMessageInbound(connectionIds.incrementAndGet());
return cmi;
}
//继承MessageInbound类实现聊天消息处理类
private final class ChatMessageInbound extends MessageInbound {
private final String nickname;//昵称
private ChatMessageInbound(int id) {
this.nickname =GUEST_PREFIX + id;
}
//创建新的连接时触发
@Override
protected void onOpen(WsOutbound outbound) {
connections.put(nickname,this);
String message = String.format("* %s %s",nickname, "加入连接");
System.out.println(message);
broadcast(message);
}
//关闭连接时触发
@Override
protected void onClose(int status) {
connections.remove(this);
String message = String.format("* %s %s",nickname, "断开连接.");
System.out.println(message);
broadcast(message);
}
//发送二进制消息时触发
@Override
protected void onBinaryMessage(ByteBuffer message) throws IOException {
throw new UnsupportedOperationException(
"发送二进制消息时触发");
}
//发送文本消息时触发
@Override
protected void onTextMessage(CharBuffer message) throws IOException {
System.out.println(message.toString());
String sendMessage = message.toString();

sendMessage = sendMessage.split("Д")[0].replaceAll(",|;|,|;","Д")+sendMessage.split("Д")[1];
String[] data = sendMessage.split("Д");
String sendNickName ="";
String sendData ="";
if(data.length>1){
sendNickName =data[0];
sendData =data[1];
}
if(sendNickName==null || sendNickName.equals("")){
//对所有人群聊
System.out.println("------all-----");
String filteredMessage = String.format("%s 对所有人 %s",nickname, message.toString());
System.out.println(filteredMessage);
broadcast(filteredMessage);
}else{
//一对一方法
System.out.println("------one-----");
String message2 = String.format(" %s对 %s说:%s",nickname,sendNickName, sendData);
System.out.println(message2);
broadcast(message2,sendNickName);
}

}
// 该方法向指定活动连接发送文本信息 (一对一发送消息)
private void broadcast(String nickname,String message2){
ChatMessageInbound connection = connections.get(nickname);
ChatMessageInbound connection1 = connections.get(this.nickname);
CharBuffer buffer = CharBuffer.wrap(message2);
CharBuffer buffer1 = CharBuffer.wrap(message2);
try {
if(connection != null){
connection.getWsOutbound().writeTextMessage(buffer);
connection1.getWsOutbound().writeTextMessage(buffer1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//该方法向所有活动连接发送文本信息
private void broadcast(String message) {
System.out.println("-------------");
Set<String> nnames = connections.keySet();
Iterator it = nnames.iterator();
while(it.hasNext()){
String names = it.next().toString();
ChatMessageInbound connection = connections.get(names);
CharBuffer buffer = CharBuffer.wrap(message);
try {
connection.getWsOutbound().writeTextMessage(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

class ChatUser{
String username;
String userid;
}



前台html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>聊天2</title>
<style type="text/css">
input#username {
width : 360px
}
input#chat {
width: 400px
}
#console-container {
width: 400px;
}
#console {
border: 1px solid #CCCCCC;
border-right-color: #999999;
border-bottom-color: #999999;
height: 180px;
overflow-y: scroll;
padding: 5px;
width: 100%;
}
#console p {
padding: 0;
margin: 0;
}
</style>
<script type="text/javascript">
var Chat = {};
Chat.socket = null;
Chat.connect = ( function(host) {
if ('WebSocket' in window) {
Chat.socket = new WebSocket(host);
} else if ('MozWebSocket' in window) {
Chat.socket = new MozWebSocket(host);
} else {
Console.log('WebSocket该浏览器没有安装');
return;
}
//建立连接触发事件
Chat.socket.onopen = function () {
Console.log('WebSocket服务器已经打开。');
//回车键触发送聊天信息
document.getElementById('chat').onkeydown = function(event) {
if (event.keyCode == 13) {
Chat.sendMessage();
}
};
//空格键触发与用户连接
document.getElementById('nickname').onkeydown = function(event) {
if (event.keyCode == 32) {
Chat.sendMessage();
}
}
};
//关闭连接触发事件
Chat.socket.onclose = function(event) {
document.getElementById('chat').onkeydown=null;
document.getElementById('nickname').onkeydown=null;
Console.log('WebSocket服务器已经关闭');
};
//接收消息触发事件
Chat.socket.onmessage = function (message) {
Console.log(message.data);
}
});
//初始化聊天对象方法,注意URL中的项目名称和Servlet名称
Chat.initialize = function() {
if (window.location.protocol == 'http:') {
Chat.connect('ws://' + window.location.host + '/erp/ChatWebSocketServlet');
} else {
Chat.connect('wss://' + window.location.host + '/erp/ChatWebSocketServlet');
}
}
//发送聊天信息方法
Chat.sendMessage = (function() {
var message = document.getElementById('chat').value;
var nickname = document.getElementById('nickname').value;
//if(message=="" || message == null ){
//alert("消息不能为空!!!");
//return ;
//}
if(nickname != ''){
message=nickname+"Д"+document.getElementById('chat').value;
}
if (message != '') {
Chat.socket.send(message);
document.getElementById('chat').value = '';
}
});
var Console = {};
//显示消息记录
Console.log = (function(message) {
var console = document.getElementById('console');
var p = document.createElement('p');
p.style.wordWrap = 'break-word';
p.innerHTML = message;
console.appendChild(p);
while (console.childNodes.length > 25) {
console.removeChild(console.firstChild);
}
console.scrollTop = console.scrollHeight;
});
Chat.initialize();
</script>
</head>
<body>
<div>
<input type="text" id="nickname" placeholder="空格键连接用户">
<p>
<input type="text" id="chat" placeholder="Enter键发送消息">
</p>
<div id="console-container">
<div id="console"></div>
</div>

</div>
</body>
</html>






...全文
168 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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