netty-socketio之ack消息

本文详细介绍了在Netty-SocketIO框架下,客户端和服务端如何进行ACK(确认)消息的交互。首先,阐述了客户端发送带有ACK请求到服务端,服务端响应ACK的过程;接着,讨论了服务端主动发送ACK请求,客户端回应的场景。同时,提供了服务端和客户端的代码示例,包括pom配置和HTML文件,以及代码的分享链接。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非ban必选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值