java web 在线聊天的基本实现
随着互联网的发展,http的协议有些时候不能满足需求,比如在现聊天的实现.如果使用http协议必须轮训,或者使用长链接.必须要一个request,这样后台才能发送信息到前端.
后台不能主动找客户端通信.而且每次请求heard都带有很多的信息.这样也很占用宽带.这是websocket.
因为主要是为了学习,所以前台很粗糙.没有css.
1.后台实现
后台一共有两个类 一个是个imessage类,就是一个信息的bean.另一个类是socket,这个类主要是处理信息的发送.
Message.java如下:
package com.socket;
public class Message {
private String id;
private String msg;
private String from;
private String to;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
socket.Java代码如下:
package com.socket; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint; import com.google.gson.Gson; @ServerEndpoint("/websocket")
public class Socket {
public static Map<String, Session> sessionMap = new HashMap<String, Session>();
private Session session; @OnOpen
public void startSocket(Session session) {
this.session = session;
System.out.println("链接成功");
if (sessionMap.size() == 0) {
return ;
}
Set userIds = sessionMap.keySet();
StringBuffer sBuffer = new StringBuffer();
for (Object str : userIds) {
sBuffer.append(str.toString() + ":");
}
Gson gson = new Gson();
try {
Message message = new Message();
message.setFrom("系统");
message.setMsg(sBuffer.toString());
session.getBasicRemote().sendText(gson.toJson(message),true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @OnMessage
public void getMessgae(Session session, String str, boolean last) {
if (session.isOpen()) {
try {
System.out.println(str);
Gson gson = new Gson();
Message msg = gson.fromJson(str, Message.class);
Message toMessage = msg;
toMessage.setFrom(msg.getId());
toMessage.setTo(msg.getTo()); if (msg.getMsg().equals("newUser")) {
if (sessionMap.containsKey(msg.getId())) {
sessionMap.remove(msg.getId());
}
sessionMap.put(msg.getId(), session);
} else {
Session toSession = sessionMap.get(msg.getTo());
if (toSession != null && toSession.isOpen()) {
toSession.getBasicRemote().sendText(gson.toJson(toMessage).toString(), last);
} else {
toMessage.setMsg("用户不存在");
toMessage.setFrom("系统");
session.getBasicRemote().sendText(gson.toJson(toMessage).toString(), last);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } else {
System.out.println("session is closed");
}
}
}
2 前端代码
前台主要使用的是Jquery库来操作一些dom. 后台开启的是 8889端口,所以前端要调用 ws://localhost:8889/webChat/websocket,如果自己实现请改自己的端口
js和html如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test WebSocket</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" >
$(function() {
var url = "ws://localhost:8889/webChat/websocket";
var ws = "";
var message ={"id":"","msg":"","form":"","to":""};
function connection() {
ws = new WebSocket(url);
console.log("connection.......");
ws.onmessage = function (e){
var json = eval('(' + e.data.toString() + ')');
showMessage(json.from +":"+ json.msg);
}
ws.onclose = function() {
showMessage("close");
}
ws.onerror = function (e){
showMessage("error");
}
ws.onopen = function() {
showMessage("链接成功")
message.id = $(".identity").val();
message.msg = "newUser";
console.log(JSON.stringify(message));
ws.send(JSON.stringify(message));
message.msg = ""; }
} $(".start-conn-btn").click(function() {
connection();
});
$(".send-btn").click(function() {//send message
message.to = $(".to-user").val();
message.msg = $(".msg-context").val();
$(".msg-context").val("");
ws.send(JSON.stringify(message));
showMessage( "我:" + message.msg );
message.msg = ""; }); function showMessage(msg) {
$(".show-message").append( msg + "<br/>"); } }); </script>
</head>
<body>
<div class="container">
<div calss="item">
<span>ID:</span>
<input type="text" class="identity">
<button class="start-conn-btn" >链接</button>
<span>toUser:</span>
<input type="text" class="to-user">
</div>
<div class="show-message"> </div>
<div calss="item">
<span>内容:</span>
<textarea class="msg-context"></textarea>
</div>
<div><button class="send-btn">send</button></div>
</div>
</body> </html>
以上的这些就是简单的实现一个在线web聊天.
java web 在线聊天的基本实现的更多相关文章
- 基于Java的在线聊天室
概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...
- 基于 NodeJs 打造 Web 在线聊天室
Socket.IO 简介与基础环境搭建 任务时间:10min ~ 20min 关于 Socket.IO Socket.IO 可以实现在浏览器和服务器之间实时双向通信,本节课程将详细介绍 Socket. ...
- 实践:Backbone作前端,Django+Tastypie作后端的简单Web在线聊天室
一.界面设计: 二.数据模型设计 id 每个发言都有一个独立的id由tastypie自动生成 content 发言的内容 username 发言者 date 发言时间 三.前端制作 这里没有用到Bac ...
- java web 在线编辑Excel -- x-spreadsheet
--- x-spreadsheet --- 文档 https://hondrytravis.com/x-spreadsheet-doc/ <%@ page language="java ...
- web 在线聊天的基本实现
参考:https://www.cnblogs.com/guoke-jsp/p/6047496.html
- atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php
atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 .打开浏览服务器文件夹java .net php 1. 环境:::项目java web,需要打开浏览服 ...
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...
- java Socket实现简单在线聊天(三)
在上一篇,利用线程使服务端实现了能够接收多客户端请求的功能,这里便需要客户端接收多客户端消息的同时还能把消息转发到每个连接的客户端,并且客户端要能在内容显示区域显示出来,从而实现简单的在线群聊. 在实 ...
- java Socket实现简单在线聊天(二)
接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
随机推荐
- java并发包分析之———Atomic类型
一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic是指不能分割成若干部分的意思.如果一段代码被认为是Atomic,则表示这段代码在执行过 ...
- java死锁小例子
package cn.com.io.threadDemo.ThreadSyn; /** * 通过两个属性值创建死锁 * 本程序通过两个线程各自锁定一个属性值,这样两个线程都无法结束,造成死锁 * @a ...
- 微软云消息队列 Azure service bus queue
前言 第一次使用消息队列,遇到了一些问题:同一个消息有多次出列.是一个消息只入列一次,还是多次?还是因为出列问题,出列了多次? Microsoft Azure service bus queue Az ...
- Opencv3.1+python2.7的CentOS7安装
http://blog.csdn.NET/daunxx/article/details/50506625 转载注释:有些包名和系统包名并不匹配,yum install 找不到的时候,可以yum sea ...
- SOFA 源码分析— 事件总线
前言 大部分框架都是事件订阅功能,即观察者模式,或者叫事件机制.通过订阅某个事件,当触发事件时,回调某个方法.该功能非常的好用,而 SOFA 内部也设计了这个功能,并且内部大量使用了该功能.来看看是如 ...
- 重载new和delete来检测内存泄漏
重载new和delete来检测内存泄漏 1. 简述 内存泄漏属于资源泄漏的一种,百度百科将内存泄漏分为四种:常发性内存泄漏.偶发性内存泄漏.一次性内存泄漏和隐式内存泄漏. 常发性指:内存泄漏的代 ...
- PHP多进程消费队列
引言 最近开发一个小功能,用到了队列mcq,启动一个进程消费队列数据,后边发现一个进程处理不过来了,又加了一个进程,过了段时间又处理不过来了...... 这种方式每次都要修改crontab,如果进程挂 ...
- 如何高效的编写与同步博客 (.NET Core 小工具实现)
一.前言 写博客,可以带给我们很多好处,比如可以让我们结识更多志同道合的人:在写博客过程中去查技术资料或者实践可以让我们对知识的掌握和理解更加深刻:通过博客分享能帮助他人收获分享的快乐等等.写博客真的 ...
- Unix系统的常用信号
编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号).不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信 ...
- 对于spring中事务@Transactional注解的理解
现在spring的配置都喜欢用注解,这边就说下@Transactional 一.如何开启@Transactional支持 要使用@Transactional,spring的配置文件applicatio ...