项目对应的实例代码可以通过【点击下载】获得, 相应的后台jar包,前台socket.io.js 在工具下载中获得
项目开发工具Eclipse, JDK1.7, Maven
项目结构图
1. 服务端源码, 在控制台下启动DemoSocketServer.java即可
2. 使用浏览器访问目录client下的index.html即可连接到后台,进行消息的发送
3. 项目为maven项目, NettySocketIO对应的jar包配置信息皆包含在pom.xml中

本实例使用NettySocketIO实现类似聊天室的功能, 用户A打开网页后,可以在界面上发送一条信息, B打开网页后, 也可以在界面上发送一条信息, 后台实现了消息的群发功能,即A发送消息后,B可以接收相应的消息,B发送消息后,A也能接收消息
见下图,张三与李四通过html页面实现即时聊天功能,基于NettySocketIO此实例,可以开发出在线客服功能

1. Java后台的代码实现
NettySocketIO使用的通讯框架为Netty, 所以必须引入Netty的jar包; 同时NettySocketIO也有自己相应的jar包为
netty-socketio.jar
SocketIOServer使用本地ip,绑定端口9999,在9999是进行监听,
有客户端连接后,addConnectListener被调用;
客户端断连后,addDisconnectListener会被调用;
客户端发送chatevent事件后,CharteventListener会被调用,同时chatevent事件对应的消息内容会被转换为ChatObject
注意一下: NettySocketIO前后台交互的数据格式为JSON
public class DemoSocketServer {
public static void main(String[] args) throws InterruptedException {
Configuration config = new Configuration();
config.setHostname("localhost");
config.setPort(9999);
SocketIOServer server = new SocketIOServer(config);
//连接
server.addConnectListener(new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
System.out.println("客户端连接成功!");
}
});
//断连
server.addDisconnectListener(new DisconnectListener() {
@Override
public void onDisconnect(SocketIOClient arg0) {
// TODO Auto-generated method stub
arg0.sendEvent("chatevent", "断开前的最后一次通话"); //断开事件中不能发送信息
System.out.println("客户端断开!");
}
});
//发送聊天消息
CharteventListener listner = new CharteventListener();
listner.setServer(server);
server.addEventListener("chatevent", ChatObject.class, listner);
/**************************************************************
可以添加其它监听消息
**************************************************************/
//启动服务
server.start();
Thread.sleep(Integer.MAX_VALUE);
server.stop();
}
}public class ChatObject {
private String userName;
private String message;
public ChatObject() {
}
public ChatObject(String userName, String message) {
super();
this.userName = userName;
this.message = message;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}public class CharteventListener implements DataListener<ChatObject>{
SocketIOServer server;
public void setServer(SocketIOServer server) {
this.server = server;
}
public void onData(SocketIOClient client, ChatObject data, AckRequest ackSender) throws Exception {
System.out.println("ThreadName:" + Thread.currentThread().getName());
//chatevent为 事件的名称,data为发送的内容
this.server.getBroadcastOperations().sendEvent("chatevent", data); //群发
//client.sendEvent("chatevent", data); //单个发送
}
}2. html+js前台
前台必须引入socket.io.js, 这是NettySocketIO所需要的js前台库;
html中使用了Jquery技术,对应的jquery.js也需要引用;
var socket = io.connect('http://localhost:9999'); ----连接后台服务并返回socket对象
socket.emit('chatevent', {userName: userName, message: message}); ----向后台发送chatevent事件并传递数据
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>NettySocket客户端</title>
<script type="text/javascript" src="jquery.min.js" ></script>
<script type="text/javascript" src="socket.io.js"></script>
<style>
body {
padding:20px;
}
#console {
height: 300px;
overflow: auto;
}
.username-msg {color:orange;}
.connect-msg {color:green;}
.disconnect-msg {color:red;}
.send-msg {color:#888}
</style>
</head>
<body>
<h1>Netty-socketio示例</h1>
<br/>
<div id="console" class="well">
</div>
<form class="well form-inline" onsubmit="return false;">
用户:<input id="name" class="input-xlarge" type="text" placeholder="用户名称..."/>
内容:<input id="msg" class="input-xlarge" type="text" placeholder="发送内容..."/>
<button type="button" onClick="sendMessage()" class="btn">Send</button>
<button type="button" onClick="sendDisconnect()" class="btn">Disconnect</button>
</form>
</body>
<script type="text/javascript">
var socket = io.connect('http://localhost:9999');
socket.on('connect', function() {
output('<span class="connect-msg">成功连接到服务端!</span>');
});
socket.on('chatevent', function(data) {
output('<span class="username-msg">' + data.userName + ':</span> ' + data.message);
});
socket.on('disconnect', function() {
output('<span class="disconnect-msg">The client has disconnected!</span>');
});
function sendDisconnect() {
socket.disconnect();
}
function sendMessage() {
var userName = $("#name").val()
var message = $('#msg').val();
$('#msg').val('');
socket.emit('chatevent', {userName: userName, message: message});
}
function output(message) {
var time = '';
var oDate = new Date(); //实例一个时间对象;
time += oDate.getFullYear() + '-'; //获取系统的年;
time += (oDate.getMonth()+1) + '-'; //获取系统月份,由于月份是从0开始计算,所以要加1
time += oDate.getDate() + ' '; // 获取系统日,
time += oDate.getHours() + ':'; //获取系统时,
time += oDate.getMinutes() + ':'; //分
time += oDate.getSeconds(); //秒
var currentTime = "<span class='time'>" + time + "</span>";
var element = $("<div>" + currentTime + " " + message + "</div>");
$('#console').prepend(element);
}
</script>
</html>
下载Demo