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实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
随机推荐
- 听《津津乐道》ThinkPad专题节目有感
自2011年使用Mac以来,就没怎么想过要再换一个windows使用,可是前几天听了<津津乐道>播客节目,主播朱峰讲了ThinkPad的使用经历,这个倒是让我回想起第一次见到IBM电脑时的 ...
- java泛型应用实例 - 自定义泛型类,方法
近 短时间需要使用泛型,就研究了下,发现网上的问关于泛型的文章都是讲原理的, 很少有提到那里用泛型比较合适, 本文就泛型类和泛型方法的使用给出两 个典型应用场景. 例如一个toString的泛型方法, ...
- Webapck项目开发基本构建及配置
1.创建项目文件夹 myapp 手动创建myapp,或mkdir myapp 2.cd myapp 3.npm init (初始化项目) 4.一路回车(关于项目信息的填写,可以不写,一路回车即可) 可 ...
- 【读书笔记】C++Primer---第一章
1.标准库的头文件用尖括号<>括起来,非标准库的头文件用双引号“”括起来:
- OSG嵌入QT(QT界面使用Qt Designer编辑)
本文主要内容:使用Qt Designer编辑好QT界面后,将OSG中的ViewerWidget嵌入到QT的Widget中. 在VS中嵌入QT工具,建立QT GUIApplication后,打开自动生成 ...
- java开发区块链只需150行代码
本文目的是通过java实战开发教程理解区块链是什么.将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等.这个基本的java区块链也实现简单的工作量证明系统. ...
- EntityFramework 6.x和EntityFramework Core插入数据探讨
前言 一直以来对EF和EF Core都是单独分开来写,从未以比较的形式来讲解,如果您既用过EF 6.x也用过用EF Core是否有了解过EF和EF Core在插入数据时和返回主键有何异同呢?本篇博客是 ...
- Windows系统下 Python(Anaconda)的 Dlib库 的安装
0.引言 介绍 Windows 10 64位系统下,利用 Anaconda 开发环境,在python中安装 Dlib库 : windows下dlib的安装十分不友好,所以在这里分享下安装过程: win ...
- struts升级2.3.12到2.5.13
参考文章: http://www.ituring.com.cn/article/495914 http://blog.csdn.net/zhangchen1987/article/details/78 ...
- es6属性基础教学,30分钟包会
ES6基础智商划重点在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译.ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得高 ...