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实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
随机推荐
- SpringBoot使用Maven插件打包部署
[问题] 之前一直用SpringBoot做一些小项目,想打包部署在环境上,总是少依赖包jar.百度下可以通过Spring Boot Maven plugin插件,把Maven配置的依赖包都打到项目包里 ...
- Spring security在MS-SQL下的初始化脚本
-- create table users( -- username nvarchar(50) not null primary key, -- password nvarchar(50) not n ...
- WSL Windows Subsystem for Linux安装指南
见官方文档: https://msdn.microsoft.com/en-us/commandline/wsl/install_guide
- 关于Apple开发者的D-U-N-S Number
企业开发者需要这个信息,中文译名叫邓白氏编码,很多攻略给的那个申请地址已经失效,这个组织官方也有地址可以提交申请资料,不过得注册,苹果目前可用的地址是:https://developer.apple. ...
- Install OpenCV on Ubuntu or Debian
http://milq.github.io/install-OpenCV-ubuntu-debian/转注:就用第一个方法吧,第二个方法的那个sh文件执行失败,因为我价格kurento.org的源,在 ...
- hadoop配置文件详解系列(一)-core-site.xml篇
接上一个属性,这个属性就是设置阈值的. hadoop.security.groups.cache.secs 300 配置用户组映射缓存时间的,当过期时重新获取并缓存. hadoop.security. ...
- Java自学开发编程路线图(文中有资源福利)
Java 语言入门 免费视频资源<毕向东Java基础教程>:http://yun.itheima.com/course/7.html JavaEE 学习大纲 所处阶段 主讲内容 技术要点 ...
- 前端打包工具——build release介绍
前言 对于前端开发者来说,资源打包是日常过程中一个必不可少的过程:目前我们大多数时候使用grunt.gulp.webpack这三个工具来完成这个工作:但是有一个特点就是我们没创建一个项目都要对应的去编 ...
- php $_SERVER['HTTP_USER_AGENT'] 用法介绍
在PHP中HTTP_USER_AGENT是用来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息, 显示结果为: Mozilla/5.0 (Windows NT 6.1; WOW64) App ...
- 虚拟机配置Openstack常见问题汇总
之前配置了openstack,遇到一些问题,现在将问题全部汇总记录在这里. (1)问题:主机名字修改不了: 原因:没有进入root状态:或者没有正确打开文件,要打开的是/etc/hostname,结果 ...