一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶(hù)推送消息)

Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶(hù)推送消息)

2020-08-29 12:10sun_t89 Java教程

本篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶(hù)推送消息),具有一定的參考價(jià)值,有興趣的可以了解一下。

網(wǎng)上好多例子都是群發(fā)的,本文實(shí)現(xiàn)一對(duì)一的發(fā)送,給指定客戶(hù)端進(jìn)行消息推送

1、本文使用到netty-socketio開(kāi)源庫(kù),以及mysql,所以首先在pom.xml中添加相應(yīng)的依賴(lài)庫(kù)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
    <groupid>com.corundumstudio.socketio</groupid>
    <artifactid>netty-socketio</artifactid>
    <version>1.7.11</version>
</dependency>
<dependency>
    <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-data-jpa</artifactid>
</dependency>
<dependency>
  <groupid>mysql</groupid>
  <artifactid>mysql-connector-java</artifactid>
</dependency>

2、修改application.properties, 添加端口及主機(jī)數(shù)據(jù)庫(kù)連接等相關(guān)配置,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
wss.server.port=8081
wss.server.host=localhost
 
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/springlearn
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverclassname = com.mysql.jdbc.driver
 
# specify the dbms
spring.jpa.database = mysql
# show or not log for each sql query
spring.jpa.show-sql = true
# hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.improvednamingstrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.mysql5dialect

3、修改application文件,添加nettysocket的相關(guān)配置信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.xiaofangtech.sunt;
 
import org.springframework.beans.factory.annotation.value;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.context.annotation.bean;
 
import com.corundumstudio.socketio.authorizationlistener;
import com.corundumstudio.socketio.configuration;
import com.corundumstudio.socketio.handshakedata;
import com.corundumstudio.socketio.socketioserver;
import com.corundumstudio.socketio.annotation.springannotationscanner;
 
@springbootapplication
public class nettysocketspringapplication {
 
  @value("${wss.server.host}")
  private string host;
 
  @value("${wss.server.port}")
  private integer port;
   
  @bean
  public socketioserver socketioserver() 
  {
    configuration config = new configuration();
    config.sethostname(host);
    config.setport(port);
     
    //該處可以用來(lái)進(jìn)行身份驗(yàn)證
    config.setauthorizationlistener(new authorizationlistener() {
      @override
      public boolean isauthorized(handshakedata data) {
        //http://localhost:8081?username=test&password=test
        //例如果使用上面的鏈接進(jìn)行connect,可以使用如下代碼獲取用戶(hù)密碼信息,本文不做身份驗(yàn)證
//       string username = data.getsingleurlparam("username");
//       string password = data.getsingleurlparam("password");
        return true;
      }
    });
     
    final socketioserver server = new socketioserver(config);
    return server;
  }
   
  @bean
  public springannotationscanner springannotationscanner(socketioserver socketserver) {
    return new springannotationscanner(socketserver);
  }
   
  public static void main(string[] args) {
    springapplication.run(nettysocketspringapplication.class, args);
  }
}

4、添加消息結(jié)構(gòu)類(lèi)messageinfo.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.xiaofangtech.sunt.message;
 
public class messageinfo {
  //源客戶(hù)端id
  private string sourceclientid;
  //目標(biāo)客戶(hù)端id
  private string targetclientid;
  //消息類(lèi)型
  private string msgtype;
  //消息內(nèi)容
  private string msgcontent;
   
  public string getsourceclientid() {
    return sourceclientid;
  }
  public void setsourceclientid(string sourceclientid) {
    this.sourceclientid = sourceclientid;
  }
  public string gettargetclientid() {
    return targetclientid;
  }
  public void settargetclientid(string targetclientid) {
    this.targetclientid = targetclientid;
  }
  public string getmsgtype() {
    return msgtype;
  }
  public void setmsgtype(string msgtype) {
    this.msgtype = msgtype;
  }
  public string getmsgcontent() {
    return msgcontent;
  }
  public void setmsgcontent(string msgcontent) {
    this.msgcontent = msgcontent;
  }
}

5、添加客戶(hù)端信息,用來(lái)存放客戶(hù)端的sessionid

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.xiaofangtech.sunt.bean;
 
import java.util.date;
 
import javax.persistence.entity;
import javax.persistence.id;
import javax.persistence.table;
import javax.validation.constraints.notnull;
 
@entity
@table(name="t_clientinfo")
public class clientinfo {
  @id
  @notnull
  private string clientid;
  private short connected;
  private long mostsignbits;
  private long leastsignbits;
  private date lastconnecteddate;
  public string getclientid() {
    return clientid;
  }
  public void setclientid(string clientid) {
    this.clientid = clientid;
  }
  public short getconnected() {
    return connected;
  }
  public void setconnected(short connected) {
    this.connected = connected;
  }
  public long getmostsignbits() {
    return mostsignbits;
  }
  public void setmostsignbits(long mostsignbits) {
    this.mostsignbits = mostsignbits;
  }
  public long getleastsignbits() {
    return leastsignbits;
  }
  public void setleastsignbits(long leastsignbits) {
    this.leastsignbits = leastsignbits;
  }
  public date getlastconnecteddate() {
    return lastconnecteddate;
  }
  public void setlastconnecteddate(date lastconnecteddate) {
    this.lastconnecteddate = lastconnecteddate;
  }
   
}

6、添加查詢(xún)數(shù)據(jù)庫(kù)接口clientinforepository.java

?
1
2
3
4
5
6
7
8
9
package com.xiaofangtech.sunt.repository;
 
import org.springframework.data.repository.crudrepository;
 
import com.xiaofangtech.sunt.bean.clientinfo;
 
public interface clientinforepository extends crudrepository<clientinfo, string>{
  clientinfo findclientbyclientid(string clientid);
}

7、添加消息處理類(lèi)messageeventhandler.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.xiaofangtech.sunt.message;
 
import java.util.date;
import java.util.uuid;
 
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.component;
 
import com.corundumstudio.socketio.ackrequest;
import com.corundumstudio.socketio.socketioclient;
import com.corundumstudio.socketio.socketioserver;
import com.corundumstudio.socketio.annotation.onconnect;
import com.corundumstudio.socketio.annotation.ondisconnect;
import com.corundumstudio.socketio.annotation.onevent;
import com.xiaofangtech.sunt.bean.clientinfo;
import com.xiaofangtech.sunt.repository.clientinforepository;
 
@component
public class messageeventhandler 
{
  private final socketioserver server;
   
  @autowired
  private clientinforepository clientinforepository;
   
  @autowired
  public messageeventhandler(socketioserver server) 
  {
    this.server = server;
  }
  //添加connect事件,當(dāng)客戶(hù)端發(fā)起連接時(shí)調(diào)用,本文中將clientid與sessionid存入數(shù)據(jù)庫(kù)
  //方便后面發(fā)送消息時(shí)查找到對(duì)應(yīng)的目標(biāo)client,
  @onconnect
  public void onconnect(socketioclient client)
  {
    string clientid = client.gethandshakedata().getsingleurlparam("clientid");
    clientinfo clientinfo = clientinforepository.findclientbyclientid(clientid);
    if (clientinfo != null)
    {
      date nowtime = new date(system.currenttimemillis());
      clientinfo.setconnected((short)1);
      clientinfo.setmostsignbits(client.getsessionid().getmostsignificantbits());
      clientinfo.setleastsignbits(client.getsessionid().getleastsignificantbits());
      clientinfo.setlastconnecteddate(nowtime);
      clientinforepository.save(clientinfo);
    }
  }
   
  //添加@ondisconnect事件,客戶(hù)端斷開(kāi)連接時(shí)調(diào)用,刷新客戶(hù)端信息
  @ondisconnect
  public void ondisconnect(socketioclient client)
  {
    string clientid = client.gethandshakedata().getsingleurlparam("clientid");
    clientinfo clientinfo = clientinforepository.findclientbyclientid(clientid);
    if (clientinfo != null)
    {
      clientinfo.setconnected((short)0);
      clientinfo.setmostsignbits(null);
      clientinfo.setleastsignbits(null);
      clientinforepository.save(clientinfo);
    }
  }
   
  //消息接收入口,當(dāng)接收到消息后,查找發(fā)送目標(biāo)客戶(hù)端,并且向該客戶(hù)端發(fā)送消息,且給自己發(fā)送消息
  @onevent(value = "messageevent")
  public void onevent(socketioclient client, ackrequest request, messageinfo data) 
  {
    string targetclientid = data.gettargetclientid();
    clientinfo clientinfo = clientinforepository.findclientbyclientid(targetclientid);
    if (clientinfo != null && clientinfo.getconnected() != 0)
    {
      uuid uuid = new uuid(clientinfo.getmostsignbits(), clientinfo.getleastsignbits());
      system.out.println(uuid.tostring());
      messageinfo senddata = new messageinfo();
      senddata.setsourceclientid(data.getsourceclientid());
      senddata.settargetclientid(data.gettargetclientid());
      senddata.setmsgtype("chat");
      senddata.setmsgcontent(data.getmsgcontent());
      client.sendevent("messageevent", senddata);
      server.getclient(uuid).sendevent("messageevent", senddata);
    }
     
  }
}

8、添加serverrunner.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.xiaofangtech.sunt.message;
 
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.commandlinerunner;
import org.springframework.stereotype.component;
 
import com.corundumstudio.socketio.socketioserver;
 
@component
public class serverrunner implements commandlinerunner {
  private final socketioserver server;
 
  @autowired
  public serverrunner(socketioserver server) {
    this.server = server;
  }
 
  @override
  public void run(string... args) throws exception {
    server.start();
  }
}

9、工程結(jié)構(gòu)

Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶(hù)推送消息)

10、運(yùn)行測(cè)試

1) 添加基礎(chǔ)數(shù)據(jù),數(shù)據(jù)庫(kù)中預(yù)置3個(gè)客戶(hù)端testclient1,testclient2,testclient3

Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶(hù)推送消息)

2) 創(chuàng)建客戶(hù)端文件index.html,index2.html,index3.html分別代表testclient1 testclient2 testclient3三個(gè)用戶(hù)

本文直接修改的https://github.com/mrniko/netty-socketio-demo/tree/master/client 中的index.html文件

其中clientid為發(fā)送者id, targetclientid為目標(biāo)方id,本文簡(jiǎn)單的將發(fā)送方和接收方寫(xiě)死在html文件中

使用 以下代碼進(jìn)行連接

?
1
io.connect('http://localhost:8081?clientid='+clientid);

index.html 文件內(nèi)容如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<!doctype html>
<html>
<head>
 
    <meta charset="utf-8" />
 
    <title>demo chat</title>
 
    <link href="bootstrap.css" rel="external nofollow" 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>
 
    var clientid = 'testclient1';
    var targetclientid= 'testclient2';
     
    var socket = io.connect('http://localhost:8081?clientid='+clientid);
 
    socket.on('connect', function() {
      output('<span class="connect-msg">client has connected to the server!</span>');
    });
 
    socket.on('messageevent', function(data) {
      output('<span class="username-msg">' + data.sourceclientid + ':</span> ' + data.msgcontent);
    });
 
    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 = {sourceclientid: clientid,
                     targetclientid: targetclientid,
                     msgtype: 'chat',
                     msgcontent: message};
            socket.emit('messageevent', 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..."/>
      <button type="button" onclick="sendmessage()" class="btn" id="send">send</button>
      <button type="button" onclick="senddisconnect()" class="btn">disconnect</button>
    </form> 
</body> 
</html>

3、本例測(cè)試時(shí)

testclient1 發(fā)送消息給 testclient2

testclient2 發(fā)送消息給 testclient1

testclient3發(fā)送消息給testclient1

運(yùn)行結(jié)果如下

Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶(hù)推送消息)

Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶(hù)推送消息)Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶(hù)推送消息)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/sun_t89/article/details/52060946

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 公妇乱淫在线播放免费观看 | 欧美一级xxxx俄罗斯一级 | 67194在线免费观看 | 欧美另类videos另类粗暴 | 美女用屁股把人吞进肚子 | 国产欧美在线播放 | 好大用力深一点女公交车 | 亚洲国产精品嫩草影院永久 | 久久夜色噜噜噜亚洲AV0000 | 本土自拍| 国产成人精品免费午夜 | 天天综合天天综合 | 99国产情在线视频 | 亚欧毛片基地国产毛片基地 | 金牛网155755水心论坛黄大父母 | ass性强迫rape | 极品美女aⅴ高清在线观看 极品ts赵恩静和直男激战啪啪 | 无码AV免费精品一区二区三区 | 精品国产国产综合精品 | 爱情岛论坛亚洲自拍 | 亚洲色图图 | 1024国产精品视频观看 | 国产香蕉国产精品偷在线观看 | 韩国三级2020| 暖暖在线日本 | 欧洲第一区第二区第三区 | 亚洲国产AV一区二区三区四区 | 日本成年片高清在线观看 | a在线观看欧美在线观看 | 色综合欧美色综合七久久 | 免费观看伦理片 | 男生操女生漫画 | 国产日韩欧美精品在线 | 天天做天天玩天天爽天天 | 亚洲国产高清视频 | 日韩欧免费一区二区三区 | 久九九精品免费视频 | 欧美在线一 | 91精品91久久久久久 | 日韩一区三区 | 强迫高h |