redisz 做消息传递
来源:互联网 发布:日本刘姓 知乎 编辑:程序博客网 时间:2024/06/04 19:17
之前做消息传递,被我们老师吓傻了 什么推 什么拉 什么ajax,其实还是有必要理解 ,他们的大概原理应该也差不多吧,小伙伴们可以去了接
后来 我用了websocket 这个是html 5 里面的东西 ,但觉还是挺好用的,之后我会给出 源代码,
后来接触了jms ,感觉 还行,jms 现在还没有升入的接触 ,这一部分,以后再补是上
现在应为数据库的优化 接触了 redis
发现的确是一个好东东,
这是学习得教程
http://www.runoob.com/redis/redis-pub-sub.html
我用redis 坐一个信息的传递通道,发现更简单
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
//查看服务是否运行
System.out.println("Server is running: "+jedis.ping());
jedis.set("name", "ok");
System.out.println(jedis.get("name"));
jedis.publish("one", "baby love you");
JedisPubSub jedisPubSub =new JedisPubSub() {
@Override
public void onUnsubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
// System.out.println();
}
@Override
public void onSubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPUnsubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPSubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPMessage(String arg0, String arg1, String arg2) {
// TODO Auto-generated method stub
}
@Override
public void onMessage(String arg0, String arg1) {
// TODO Auto-generated method stub
System.out.println(arg0);
System.out.println(arg1);
}
};
jedis.subscribe(jedisPubSub, "one");
}
----------------------------------------------------
在cmd 里面开一个client
------------------------------
这是websocket 代码 发现更 redis 差不多
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> chat </title>
<script type="text/javascript">
// 创建WebSocket对象
var webSocket = new WebSocket("ws://127.0.0.1:80/SSH/chat");
var sendMsg = function()
{
var inputElement = document.getElementById('msg');
var name=document.getElementById('username');
var input=name.value+":"+inputElement.value;
// 发送消息
webSocket.send(input);
// 清空单行文本框
inputElement.value= "";
}
var send = function(event)
{
if (event.keyCode == 13)
{
sendMsg();
}
};
webSocket.onopen = function()
{
// 为onmessage事件绑定监听器,接收消息
webSocket.onmessage= function(event)
{
var show = document.getElementById('show')
// 接收、并显示消息
show.innerHTML += event.data + "<br/>";
show.scrollTop = show.scrollHeight;
}
document.getElementById('msg').onkeydown = send;
document.getElementById('sendBn').onclick = sendMsg;
};
webSocket.onclose = function ()
{
document.getElementById('msg').onkeydown = null;
document.getElementById('sendBn').onclick = null;
Console.log('WebSocket已经被关闭。');
};
</script>
<style>
.div{ margin:0 anto; width:400px; height:100px;}
.span{text-align:center; }
/* css注释:为了观察效果设置宽度 边框 高度等样式 */
</style>
</head>
<body>
<div style="width:600px;height:240px;overflow-y:auto;border:1px solid #333;" id="show"></div>
<input type="text" size="80" id="msg" name="msg" placeholder="输入聊天内容"/>
<input id="username" type="hidden" value='<s:property value="#session.user.name"/>'/> <!-- 隐藏数据 -->
<input type="button" value="发送" id="sendBn" name="sendBn"/>
<br>
<s:form action="webpassage">
<s:submit value="webpassage"></s:submit>
</s:form>
</body>
</html>
------------------
后台
代码
package org.com.ssh.hibernate.Chat;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;
import javax.websocket.*;
import javax.websocket.server.*;
//聊天 websock
@ServerEndpoint(value = "/chat")
public class ChatEntpoint
{
private static final String GUEST_PREFIX = "";
private static final AtomicInteger connectionIds = new AtomicInteger(0);
// 定义一个集合,用于保存所有接入的WebSocket客户端
private static final Set<ChatEntpoint> clientSet =
new CopyOnWriteArraySet<>();
// 定义一个成员变量,记录WebSocket客户端的聊天昵称
private String nickname="";
// 定义一个成员变量,记录与WebSocket之间的会话
private Session session;
public ChatEntpoint()
{
nickname = GUEST_PREFIX;
}
// 当客户端连接进来时自动激发该方法
@OnOpen
public void start(Session session)
{
this.session = session;
// 将WebSocket客户端会话添加到集合中
clientSet.add(this);
String message = String.format("【%s】"
,"有人上访");
// 发送消息
broadcast(message);
}
// 当客户端断开连接时自动激发该方法
@OnClose
public void end()
{
clientSet.remove(this);
String message = String.format("【%s】"
,"有人下乡去了!");
// 发送消息
broadcast(message);
}
// 每当收到客户端消息时自动激发该方法
@OnMessage
public void incoming(String message)
{
// String message =String.format("【%s 】 \n %s", "echo","hellow");
// System.out.println(message);
String info=filter(message);
nickname=info.substring(0,filter(message).indexOf(":"));
String mess=info.substring(filter(message).indexOf(":")+1);
String filteredMessage = String.format("【%s 】 \n \t %s", nickname, mess);
// 发送消息
broadcast(filteredMessage);
}
// 当客户端通信出现错误时,激发该方法
@OnError
public void onError(Throwable t) throws Throwable
{
System.out.println("WebSocket服务端错误 " + t);
}
// 实现广播消息的工具方法
private static void broadcast(String msg)
{
// 遍历服务器关联的所有客户端
for (ChatEntpoint client : clientSet)
{
try
{
synchronized (client)
{
// 发送消息
client.session.getBasicRemote().sendText(msg);
}
}
catch (IOException e)
{
System.out.println("聊天错误,向客户端 "
+ client + " 发送消息出现错误。");
clientSet.remove(client);
try
{
client.session.close();
}
catch (IOException e1){}
String message = String.format("【%s %s】",
client.nickname, "有人已经被断开了连接。");
broadcast(message);
}
}
}
// 定义一个工具方法,用于对字符串中的HTML字符标签进行转义
private static String filter(String message)
{
if (message == null)
return null;
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(content.length + 50);
for (int i = 0; i < content.length; i++)
{
// 控制对尖括号等特殊字符进行转义
switch (content[i])
{
case '<':
result.append("<");
break;
case '>':
result.append(">");
break;
case '&':
result.append("&");
break;
case '"':
result.append(""");
break;
default:
result.append(content[i]);
}
}
return (result.toString());
}
}
- redisz 做消息传递
- 消息传递
- 消息传递
- 消息传递
- 消息传递
- 消息传递
- 消息传递
- MFC消息详解 消息传递
- 运用JMS传递消息
- 基本概念:消息传递
- EXE之间传递消息
- EXE之间传递消息
- Window消息传递机制
- XML消息传递简介
- mfc 消息传递
- Window消息传递机制
- windows消息传递
- VC消息传递机制
- 1078 最小生成树
- $.extend() 和 $.fn.extend() 使用
- Selenium2+python自动化44-元素定位参数化(find_element)
- 数据库创建外键的两种方式
- VGScene 4.05 破解过程
- redisz 做消息传递
- ARM7 的启动
- Windows 配置Apache虚拟机
- vc++ TCP/IP网络编程中recv的含义
- C# 网络编程(一)
- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined ;At least one of these enviro
- 前端面试大全(一)
- tools下找不到draw9patch.bat
- NAO机器人系统下模块生成和python模块调用