netty-socketio实现im群聊

1、pom

 <dependency>
            <groupId>com.corundumstudio.socketio</groupId>
            <artifactId>netty-socketio</artifactId>
            <version>1.7.18</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.12.0</version>
        </dependency>

2、启动

package com.corundumstudio.socketio.demo;

import com.corundumstudio.socketio.listener.*;
import com.corundumstudio.socketio.*;
import com.corundumstudio.socketio.store.RedissonStoreFactory;
import com.corundumstudio.socketio.store.StoreFactory;
import org.redisson.Redisson;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.util.Calendar;
import java.util.UUID;

public class ChatLauncher {

    public static void main(String[] args) throws InterruptedException {

        Config redis = new Config();
        redis.useSingleServer().setAddress("redis://192.168.32.136:26379").setPassword("123456");
        final RedissonClient redisson = Redisson.create(redis);
        Configuration config = new Configuration();
        config.setPort(9092);
        StoreFactory storeFactory = new RedissonStoreFactory(redisson);
        //session存储在redis
        config.setStoreFactory(storeFactory);
        final SocketIOServer server = new SocketIOServer(config);


        server.addConnectListener(new ConnectListener() {
            @Override
            public void onConnect(SocketIOClient socketIOClient) {
                //用户连接
                //id为连用户id
                String userId = socketIOClient.getHandshakeData().getSingleUrlParam("id");
                //保存uuid  key 用户id  value SocketIOClient的UUID
                RBucket<UUID> id = redisson.getBucket(userId);
                UUID uuid = socketIOClient.getSessionId();
                id.set(uuid);
                //保存uuid和用户id的映射 key为uuid  value 为用户id
                RBucket<String> userIdBucket = redisson.getBucket(uuid.toString());
                userIdBucket.set(userId);
            }
        });

        server.addDisconnectListener(new DisconnectListener() {
            @Override
            public void onDisconnect(SocketIOClient socketIOClient) {
                //用户断开连接连接 清除缓存保存的用户信息
                String extNum = socketIOClient.getHandshakeData().getSingleUrlParam("id");
                RBucket<UUID> id = redisson.getBucket(extNum);
                String uuid = id.get().toString();
                RBucket<String> userId = redisson.getBucket(uuid);
                userId.delete();
                id.delete();

            }
        });

        server.addEventListener("chatevent", ChatObject.class, new DataListener<ChatObject>() {
            @Override
            public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) {
                //userName  把消息发给谁
                String userName = data.getUserName();
                // from是谁发的消息
                String from = (String) redisson.getBucket(client.getSessionId().toString()).get();

                RBucket<UUID> id = redisson.getBucket(userName);
                //获取接收消息的SocketIOClient
                SocketIOClient to = server.getClient(id.get());
                ChatObject chatObject = new ChatObject();
                chatObject.setMessage(data.getMessage());
                chatObject.setUserName(from);
                //发送消息 给消息接收者
                to.sendEvent("chatevent", chatObject);
            }
        });

        server.addEventListener("createRoom", ChatObject.class, new DataListener<ChatObject>() {
            @Override
            public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) {
                //创建群聊 生成群名称
                String roomName = "room:" + client.getHandshakeData().getSingleUrlParam("id");
                client.joinRoom(roomName);
            }
        });


        server.addEventListener("joinRoom", ChatObject.class, new DataListener<ChatObject>() {
            @Override
            public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) {
                //群名称
                String roomName = data.getRoomName();
                client.joinRoom(roomName);
                // from是谁发的消息
                String from = (String) redisson.getBucket(client.getSessionId().toString()).get();
                ChatObject chatObject = new ChatObject();
                chatObject.setMessage("加入群聊:"+roomName);
                chatObject.setUserName(from);
//                server.getRoomOperations(roomName).sendEvent("joinRoom", chatObject);

                server.getRoomOperations(roomName).sendEvent("joinRoom", chatObject, client, new BroadcastAckCallback(Boolean.class));

            }
        });


        server.start();

        Thread.sleep(Integer.MAX_VALUE);

        server.stop();
    }

}

 

3、消息实体

package com.corundumstudio.socketio.demo;

import java.io.Serializable;

public class ChatObject implements Serializable {

    private String userName;
    private String message;

    private String roomName;

    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 String getRoomName() {
        return roomName;
    }

    public void setRoomName(String roomName) {
        this.roomName = roomName;
    }
}

 

4、客户端1

<!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="http://code.jquery.com/jquery-1.10.1.min.js"></script>

	<script>
         //发送消息给用户id是2的
         var userName = 2;
        //用户id 是1的连接
		var socket =  io.connect('http://localhost:9092?id=1');

		socket.on('connect', function() {
			output('<span class="connect-msg">Client has connected to the server!</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>');
		});
		
		socket.on('joinRoom', function(data) {
			output('<span class="username-msg">' + data.userName + ':</span> ' + data.message);
		});

                function sendDisconnect() {
                        socket.disconnect();
                }

		function sendMessage() {
                        var message = $('#msg').val();
                        $('#msg').val('');

                        var jsonObject = {userName: userName,
                                          message: message};
                        socket.emit('chatevent', jsonObject);
		}
		
		function createRoom() {
                        
                       
                        socket.emit('createRoom', null);
		}

		function output(message) {
                        var currentTime = "<span class='time'>" +  moment().format('HH:mm:ss.SSS') + "</span>";
                        var element = $("<div>" + currentTime + " " + message + "</div>");
			$('#console').prepend(element);
		}
		
			function joinRoom() {
                       var roomName = $('#roomName').val();
                        $('#roomName').val('');

                        var jsonObject = {roomName: roomName,
                                          message: ''};
                        socket.emit('joinRoom', jsonObject); 
		}


        $(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..."/>
		   
		       <input id="roomName" class="input-xlarge" type="text" placeholder="room name"/>
           <button type="button" onClick="sendMessage()" class="btn" id="send">Send</button>
           <button type="button" onClick="sendDisconnect()" class="btn">Disconnect</button>
		   
		    <button type="button" onClick="createRoom()" class="btn">createRoom</button>
			
			<button type="button" onClick="joinRoom()" class="btn">joinRoom</button>
        </form>



</body>

</html>

5、客户端2

<!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="http://code.jquery.com/jquery-1.10.1.min.js"></script>

	<script>

                 //发送消息给用户id是1的
         var userName = 1;
        //用户id 是2的连接

		var socket =  io.connect('ws://localhost:9092?id=2');

		socket.on('connect', function() {
			output('<span class="connect-msg">Client has connected to the server!</span>');
		});

		socket.on('chatevent', function(data) {
			output('<span class="username-msg">' + data.userName + ':</span> ' + data.message);
		});
		
		socket.on('joinRoom', 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 message = $('#msg').val();
                        $('#msg').val('');

                        var jsonObject = {userName: userName,
                                          message: message};
                        socket.emit('chatevent', jsonObject);
		}
		
		function createRoom() {
                        
                       
                        socket.emit('createRoom', null);
		}
		
			function joinRoom() {
                       var roomName = $('#roomName').val();
                        $('#roomName').val('');

                        var jsonObject = {roomName: roomName,
                                          message: ''};
                        socket.emit('joinRoom', jsonObject); 
		}

		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..."/>
		   
		    <input id="roomName" class="input-xlarge" type="text" placeholder="room name"/>
			
           <button type="button" onClick="sendMessage()" class="btn" id="send">Send</button>
           <button type="button" onClick="sendDisconnect()" class="btn">Disconnect</button>
		   <button type="button" onClick="createRoom()" class="btn">createRoom</button>
		   <button type="button" onClick="joinRoom(roomName)" class="btn">joinRoom</button>
        </form>



</body>

</html>

 

Netty-socketio是一个用于构建实时通信应用程序的开源框架。它基于Netty框架,通过使用WebSocket协议来实现异步、高性能的网络通信。Netty-socketio具有以下特点: 1. 强大的异步处理能力:Netty-socketio采用事件驱动的方式处理客户端请求,能够高效地处理大量并发连接。 2. 完善的消息传递机制:Netty-socketio提供了灵活的消息传递方式,支持广播、点对点、房间等不同的消息发送方式,满足不同场景下的通信需求。 3. 多协议支持:Netty-socketio不仅支持WebSocket协议,还支持其他常用的协议,如TCP、HTTP等,便于与现有的系统集成。 4. 可扩展性强:Netty-socketio提供了丰富的拓展接口,用户可以根据自己的需求定制和扩展框架的功能。 5. 易于使用:Netty-socketio提供了简洁的API和丰富的文档,可以快速上手使用,并提供了相应的示例代码,方便开发者学习和理解。 对于客服应用来说,Netty-socketio作为一个实时通信框架,可以用于构建在线客服聊天系统。通过使用Netty-socketio,我们可以实现客户与客服人员之间的实时消息传递,支持文字、图片、文件等多种类型的消息。客户可以通过网页或移动端应用与客服人员进行沟通,实时解决问题,提升用户体验。 Netty-socketio提供了强大的异步处理能力和全双工通信机制,能够处理大量并发连接,并保持连接的稳定性和可靠性。同时,它的多协议支持和可扩展性强的特点,使得我们可以根据自己的业务需求进行定制和拓展,满足不同客服场景下的通信需求。 总之,Netty-socketio作为一个强大的实时通信框架,为客服应用提供了一种高效、稳定的解决方案,帮助企业构建更好的客服系统,并提升客户的满意度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

非ban必选

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

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

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

打赏作者

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

抵扣说明:

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

余额充值