1、客户端给服务端发送带有ack请求的消息,服务端收到消息后发送ack响应消息给客户端
var userName = 'user' + Math.floor((Math.random()*1000)+1);
function sendMessage() {
var message = $('#msg').val();
$('#msg').val('');
var jsonObject = {userName: userName,message: message};
//发送需要ack响应的消息
socket.emit('ackevent1', jsonObject, function(arg1, arg2) {
alert("从服务器发来的确认消息1:" + arg1 + ", 确认消息2:" + arg2);
});
}
2、服务端接收消息,发送ack响应消息给客户端
server.addEventListener("ackevent1", ChatObject.class, new DataListener<ChatObject>() {
@Override
public void onData(final SocketIOClient client, ChatObject data, final AckRequest ackRequest) {
// 检查是否是客户端发来的ack 请求确认消息
if (ackRequest.isAckRequested()) {
// 发送ack响应消息给客户端
ackRequest.sendAckData("服务器响应ack响应消息1", "服务器响应ack响应消息2");
}
}
});
3、流程如下

4、服务端发送带有ack请求的消息给客户端,客户端收到消息后发送ack响应消息给服务器
// 服务器发送 ackevent2 带有ack请求的数据的消息给客户端
ChatObject ackChatObjectData = new ChatObject(data.getUserName(), "服务器发送带有ack请求的消息给客户端");
client.sendEvent("ackevent2", new AckCallback<String>(String.class) {
@Override
public void onSuccess(String result) {
System.out.println("从客户端响应回来的ack消息: " + client.getSessionId() + " data: " + result);
}
}, ackChatObjectData);
5、客户端接收到带有ack请求的消息,并发送ack响应数据给服务端
socket.on('ackevent2', function(data, ackServerCallback) {
output('<span class="username-msg">' + data.userName + ':</span> ' + data.message);
if (ackServerCallback) {
ackServerCallback('服务器发送给客户端的ackevent2消息确认收到');
}
});
6、流程如下

7、服务端代码
pom
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>1.7.7</version>
</dependency>
聊天代码java
package com.corundumstudio.socketio.demo;
import com.corundumstudio.socketio.AckCallback;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.VoidAckCallback;
import com.corundumstudio.socketio.listener.DataListener;
public class AckChatLauncher {
public static void main(String[] args) throws InterruptedException {
Configuration config = new Configuration();
config.setHostname("localhost");
config.setPort(9092);
final SocketIOServer server = new SocketIOServer(config);
server.addEventListener("ackevent1", ChatObject.class, new DataListener<ChatObject>() {
@Override
public void onData(final SocketIOClient client, ChatObject data, final AckRequest ackRequest) {
// 检查是否是客户端发来的ack 请求确认消息
if (ackRequest.isAckRequested()) {
// 发送ack响应消息给客户端
ackRequest.sendAckData("服务器响应ack响应消息1", "服务器响应ack响应消息2");
}
// 服务器发送 ackevent2 带有ack请求的数据的消息给客户端
ChatObject ackChatObjectData = new ChatObject(data.getUserName(), "服务器发送带有ack请求的消息给客户端");
client.sendEvent("ackevent2", new AckCallback<String>(String.class) {
@Override
public void onSuccess(String result) {
System.out.println("从客户端响应回来的ack消息: " + client.getSessionId() + " data: " + result);
}
}, ackChatObjectData);
}
});
server.start();
Thread.sleep(Integer.MAX_VALUE);
server.stop();
}
}
8、客户端代码
ack-index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Demo Chat</title>
<link href="bootstrap.css" rel="stylesheet">
<style>
body {
padding:20px;
}
#console {
height: 400px;
overflow: auto;
}
.username-msg {color:orange;}
.connect-msg {color:green;}
.disconnect-msg {color:red;}
.send-msg {color:#888}
</style>
<script src="js/socket.io/socket.io.js"></script>
<script src="js/moment.min.js"></script>
<script src="js/jquery-1.7.2.min.js"></script>
<script>
var userName = 'user' + Math.floor((Math.random()*1000)+1);
var socket = io.connect('http://localhost:9092', { transports: ["websocket"] });
socket.on('connect', function() {
output('<span class="connect-msg">Client has connected to the server!</span>');
});
socket.on('disconnect', function() {
output('<span class="disconnect-msg">The client has disconnected!</span>');
});
socket.on('ackevent2', function(data, ackServerCallback) {
output('<span class="username-msg">' + data.userName + ':</span> ' + data.message);
if (ackServerCallback) {
ackServerCallback('服务器发送给客户端的ackevent2消息确认收到');
}
});
function sendDisconnect() {
socket.disconnect();
}
function sendMessage() {
var message = $('#msg').val();
$('#msg').val('');
var jsonObject = {userName: userName,message: message};
//发送需要ack响应的消息
socket.emit('ackevent1', jsonObject, function(arg1, arg2) {
alert("从服务器发来的确认消息1:" + arg1 + ", 确认消息2:" + arg2);
});
}
function output(message) {
var currentTime = "<span class='time'>" + moment().format('HH:mm:ss.SSS') + "</span>";
var element = $("<div>" + currentTime + " " + message + "</div>");
$('#console').prepend(element);
}
$(document).keydown(function(e){
if(e.keyCode == 13) {
$('#send').click();
}
});
</script>
</head>
<body>
<h1>Netty-socketio Demo Chat</h1>
<br/>
<div id="console" class="well">
</div>
<form class="well form-inline" onsubmit="return false;">
<input id="msg" class="input-xlarge" type="text" placeholder="Type something..."/>
<button type="button" onClick="sendMessage()" class="btn" id="send">Send</button>
<button type="button" onClick="sendDisconnect()" class="btn">Disconnect</button>
</form>
</body>
</html>
9、代码地址
链接:https://pan.baidu.com/s/12aNQCq4SQAxT6lxYYrtFjw
提取码:8nb7
本文详细介绍了在Netty-SocketIO框架下,客户端和服务端如何进行ACK(确认)消息的交互。首先,阐述了客户端发送带有ACK请求到服务端,服务端响应ACK的过程;接着,讨论了服务端主动发送ACK请求,客户端回应的场景。同时,提供了服务端和客户端的代码示例,包括pom配置和HTML文件,以及代码的分享链接。
1270

被折叠的 条评论
为什么被折叠?



