使用nettyio+socket.io搭建简单的网页聊天室

使用nettyio+socket.io搭建简单的网页聊天室

1 目录结构

这里写图片描述

2 maven 依赖配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>nettyio</groupId>
  <artifactId>nettyio</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <properties>
        <!-- log4j日志文件管理包版本 -->
        <slf4j.version>1.7.7</slf4j.version>
        <log4j.version>1.2.17</log4j.version>
  </properties>
  <dependencies>
    <dependency>
     <groupId>com.corundumstudio.socketio</groupId>
     <artifactId>netty-socketio</artifactId>
     <version>1.7.12</version>
    </dependency>
    <!-- 日志文件管理包 -->
     <!-- log start -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
    </dependency>

    <!-- 格式化对象,方便输出日志 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.1.41</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
  </dependencies>
</project>

3 后台代码实现
a) 创建消息实体 Msg
直接贴代码

    public class Msg implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -6519304261259719883L;

    private String userId;

    private String userName;

    private String receiveUserId;

    private String content;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getReceiveUserId() {
        return receiveUserId;
    }

    public void setReceiveUserId(String receiveUserId) {
        this.receiveUserId = receiveUserId;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Msg(String userId, String userName, String receiveUserId, String content) {
        super();
        this.userId = userId;
        this.userName = userName;
        this.receiveUserId = receiveUserId;
        this.content = content;
    }

    public Msg() {
        super();
    }


}

b) 创建websocket server MsgServer
代码如下

    public class MsgServer {

    public static void main(String[] args) throws InterruptedException {
        ServerContext.init();
        Configuration config = new Configuration();
        config.setHostname(ServerContext.serverIp);
        config.setPort(ServerContext.port);

        SocketIOServer server = new SocketIOServer(config);
        ChartListener listner = new ChartListener();
        listner.setServer(server);
        // chatevent为事件名称
        server.addEventListener("chatevent", Msg.class, listner);


        //启动服务
        server.start();
        Thread.sleep(Integer.MAX_VALUE);
        server.stop();
    }

}

ServerContext 是初始化ip和端口的配置类

public class ServerContext {

    public static String serverIp = "localhost";//默认是localhost
    public static int port = 9093;//默认端口

    public static void init(){
        Properties properties = new Properties();
        try {
            properties.load(ServerContext.class.getClassLoader().getResourceAsStream("system.properties"));//new FileInputStream(new File("system.properties")
            serverIp = properties.getProperty("server.ip");
            port =  Integer.valueOf(properties.getProperty("server.port"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

system.properties 配置了ip和端口

server.ip=192.168.0.207
server.port=9093

最后创建消息监听 ChartListener
代码如下

public class ChartListener implements DataListener<Msg>{

    SocketIOServer server;

    public void setServer(SocketIOServer server) {
        this.server = server;
    }

    public void onData(SocketIOClient socketIoClient, Msg msg, AckRequest askSender) throws Exception {

        // chatevent为 事件的名称, data为发送的内容
        this.server.getBroadcastOperations().sendEvent("chatevent", msg);

    }

}

4 前端代码实现

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>小张唠嗑</title><base>
<script type="text/javascript" src="js/jquery-1.8.2.js"></script>
<script type="text/javascript" src="js/socket.io-1.4.5.js"></script>
<script src="ckeditor/ckeditor.js"></script>
<style>
body {
    padding: 20px;
}
#console {
    height: 650px;
    overflow: auto;
}
.username-msg {
    color: orange;
}
.connect-msg {
    color: green;
}
.disconnect-msg {
    color: red;
}
.send-msg {
    color: #888
}
</style>
</head>
<body>
    <h1>小张陪您唠嗑</h1>
    <!-- <br /> -->
    <div id="console" class="well"></div>
    <form class="well form-inline" onsubmit="return false;">
        <input id="name"  class="input-xlarge" type="hidden" placeholder="用户名称. . . " />
        <!-- <input id="msg" class="input-xlarge" type="text" placeholder="发送内容. . . " /> -->
        <textarea id="msg" rows="10" cols="50" placeholder="发送内容. . . "></textarea>
        <button type="button" onClick="sendMessage()" class="btn">发送</button>
        <button type="button" onClick="sendDisconnect()" class="btn">下线</button>
        <button type="button" onClick="reloadThis()" class="btn">重连</button>
    </form>
</body>
<script type="text/javascript">
var editor = CKEDITOR.replace( 'msg' );
editor.on("instanceReady",function(){
    /* this.document.onkeydown=function(event){
         alert(0);
         var e = event || window.event || arguments.callee.caller.arguments[0];

         if(event.ctrlKey&&event.keyCode==13){ // enter 键
             //要做的事情
             paraent.sendMessage();
         }
    };  */
    this.document.on("keydown",function(){
        //console.log(window.frames[0]);
        var event = window.frames[0].event;
          if(event.ctrlKey&&event.keyCode==13){ // enter 键
             //要做的事情
            sendMessage();
         } 
    });
});
var socket;
connect();
//var socket = io.connect('http://192.168.0.207:9092');


function connect(){
    socket = io.connect('ws://192.168.0.207:9093');
    $("#name").val("你的小宝贝儿"+parseInt(Math.random()*100+1, 10));

    socket.on('connect',function() {
        console.log("玩玩!");
        serverOutput('<span class="connect-msg">欢迎进入小张唠嗑聊天室!</span>');
        //serverOutput('<span class="disconnect-msg">'+$("#name").val()+'已上线! </span>');
        socket.emit('chatevent', {
            userId:1,
            userName : $("#name").val(),
            receiveUserId:2,
            content : "已上线!"
        });
    });

    socket.on('chatevent', function(data) {
        output('<span class="username-msg">'+'<img  src="images/head.jpg" height="64" width="64"/>' + data.userName + ' : </span>'
                + data.content);
        //editor.setData("");
        //editor.updateElement();
    });

    socket.on('disconnect',function() {
        serverOutput('<span class="disconnect-msg">'+$("#name").val()+'已下线! </span>');

    });
}

function reloadThis(){
    socket.disconnect();
    connect();
    console.log(socket);
}

function sendDisconnect() {
    socket.emit('chatevent', {
        userId:1,
        userName : $("#name").val(),
        receiveUserId:2,
        content : "已下线!"
    });
    socket.disconnect();
}

function sendMessage() {
    var userName = $("#name").val()
    var message = editor.getData();
    $('#msg').val('');
    socket.emit('chatevent', {
        userId:1,
        userName : userName,
        receiveUserId:2,
        content : message
    });
    //editor.setData("");
}

function output(message) {
    var currentTime = "<span class='time' >" + new Date() + "</span>";
    var element = $("<div>" +" "  + message + "</div>");
    $('#console').prepend(element);
}

function serverOutput(message){
    var element = $("<div>" + message + "</div>");
    $('#console').prepend(element);
}

document.onkeydown=function(event){
    //alert(0);
    var e = event || window.event || arguments.callee.caller.arguments[0];

    if(event.ctrlKey&&event.keyCode==13){ // enter 键
        //要做的事情
        sendMessage();
    }
}; 

</script>
</html>

运行效果如下
这里写图片描述

over ,欢迎大家吐槽,另外,对netty io了解不深,希望大神指导,如何使用netty+ socket.io实现网页版的一对一聊天,小的先谢过了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值