javaweb:在线聊天网站

news/2024/5/10 18:50:44/文章来源:https://blog.csdn.net/name_z/article/details/50484462

前言:
最近学了一堆网页相关的内容,html,js,jquery,javaweb,servlet,websocket等东西,所以就试着集合起来写个简单的网页,于是就决定就是你了:在线聊天网站。
而且还写了3个版本。。。
版本1:全是用的jsp写,不过发现jsp把网页代码和连接后台的代码都混在一起,感觉不好(可能是自己写得渣。。。),所以后面都没用jsp
版本2:写的时候不知道websocket,聊天信息更新是用的长轮询
版本3:版本2后面的时候查到有websocket,就有了下面这个
ps.版本2、3都是html+css+js+servlet

项目名称:在线聊天网站

项目代码:http://download.csdn.net/detail/name_z/9396909
(上面资源的资源简介中的创建数据库的代码有点错误,上传了没法修改…,以下面创建数据库代码为准,就是把tbUser中的keyword改为password就好了)
里面是整个eclipse创建的项目,直接导入eclipse可以了
使用该项目需要的数据库(MySQL)创建代码:

create table tbUser
(name varchar(10) not null,password char(20) not null,primary key(name)
)CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci';
#其实还有另外一个表(存储聊天信息),不过后面写的时候忘记把聊天信息保存进数据库,所以其实可以不用管(程序里没用到),另一个表信息是:
create table tbConnection
(id int not null,orignName varchar(10) not null,targetName varchar(10) not null,content varchar(255) not null,date datetime not null,primary key(id),foreign key(orignName) references tbUser(name),foreign key(targetName) references tbUser(name)
)CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci';

用到的知识和工具

工具:

1.tomcat8.0
2.eclipse for javaee
3.jdk1.8
4.mysql

涉及知识:

1.html
2.javascript+jquery
3.css
4.java
5.servlet+listener
6.websocket
7.mysql+sql

网页功能

1.提供登陆和注册功能
2.提供已登陆用户注销功能(退出当前帐户)
3.显示在线账户的数量及名称(通过手动点击刷新按钮刷新信息)
4.与在线用户聊天
4.1.点击显示的在线账户名后,可向该用户发送信息(该用户名将显示在聊天区域)
4.2.若接收信息的用户也已经点击发送人(即发送人的名字已显示在聊天区域)时,发送的信息将直接显示在聊天区域
4.3.若没有,则将会在网页右下角有提示信息,点击提示信息或者点击该用户名字均可将其显示在聊天区域
5.用户登陆到退出(注销或长时间关闭网页)之间的所有回话信息均有保存,即你与A在进行对话,此时切换到与B进行对话,再切回A对话时,此前与A的对话依然存在
6.查询历史记录(忘记实现了,后面就没弄了。。。)

网页结构

结构:

1.网页显示:html+css+jquery
2.向服务器发送数据以及处理服务器发送的数据:jquery
3.服务器:servlet

网页:

html

login.html

login
1.点击确定登陆
2.点击注册进入注册页面

signup.html

signup
1.点击注册进行注册(注册成功后自动跳转到登陆页面)
2.点击登陆进入登陆页面

main.html

main
1.注销按钮退出当前账号,并跳转到登陆页面
2.刷新按钮刷新在线账户
3.在线账户下方为在线的账户名(按钮),点击可向其发送信息(名字显示在聊天区域–蓝色区域顶部)
4.右下角为提示信息(图中:用户dog向用户cat我发送了信息,因为此时我没有选定dog用户,所有没有直接显示在聊天区域而是变为提示信息)
main2

js+jquery:

这次基本都是用的jquery,使用jquery要先把jquery库(也就是一个叫jquery.js的文件)下载下来,然后和其他js文件一样在html页面引用即可。
js
jquery这里用到比较重要的东西也就两个:

1.jquery get/post:从服务器请求数据

参考资料:http://www.w3school.com.cn/jquery/jquery_ajax_get_post.asp
用法:

//get方法
$.get(//servlet名称"servlet",//请求成功后执行的函数,result为服务器返回的数据function(result){}
);
//post方法
$.post("servlet",//传给服务器的数据{数据名称:数据},function(result){}
);

在注册页面中的使用:
post

2.客户端websocket

参考资料:http://wenku.baidu.com/view/4e3d2d34915f804d2a16c119.html(这个真的是通俗易懂)

简单来说,就是在没有websocket以及html5的时候,服务器和客户端间,只能由客户端先发送信息给服务器,服务器再回应客户端,而不能由服务器给客户端先发送信息。
而websocket和html5可以实现这个功能,由服务器首先发送信息给客户端,html5的资料:http://www.w3school.com.cn/html5/html_5_serversentevents.asp。

websocket的原理:

大概就是服务器和客户端通过3次握手建立一条tcp连接,所以之后双方都可以通过这条通道发送信息;
通过这个容易了解到以前服务器和客户端连接是:客户端和服务器之间由于信息不对等,客户端知道服务器地址,而服务器不知道客户端地址,所以每次都只能由客户端先发送信息,服务器根据信息报中的客户端地址向其回传信息。

使用:

服务器和客户端一样都是定义了4个方法:onopen,opclose,onmessage,onerror

客户端:

//建立与服务器的连接
var webSocket = null;
if ('WebSocket' in window)//传入的地址即为需要连接的websocket地址:ws://服务器地址:端口/程序地址/实现websocket的类名webSocket = new WebSocket('ws://192.168.1.101:8080/ConnectionWeb3.0/ConnectionWebSocket');  
else if ('MozWebSocket' in window)  webSocket = new MozWebSocket(wsuri);  
else  alert("not support");  
//建立连接的事件
webSocket.onopen = function(event) {onOpen(event);
};
//接受到服务器传来的数据事件
webSocket.onmessage = function(event) {onMessage(event);
};
//event.data为服务器传来的数据
function onMessage(event)
{processConnectionMessage(event.data);
}

服务器的放到下面服务器说。。。

服务器

调用的基础类的关系图:

类图

类名介绍存储
User用户,存储用户姓名存储在session中,即每个登陆的用户都有一个对应的User对象
UserManager在线用户管理,存储在线用户的User对象存储于ServletContext中,整个网页程序只有一个UserManager
Word一条通话信息,里面有发送人、接受人、信息内容、时间存储于session中,且会被存储在数据库中
ConnectionManager管理通话信息存储在session中,每个用户都有一个ConnectionManager对象,用于存储Word
Database最底层与数据库连接的类,仅提供返回数据库连接、返回PreparedStatement两个功能存储与ServletContext的DatabaseManager中
DatabaseManager针对数据优化Database的接口,提供更方便的操作数据的方法存储在ServletContext中,整个网页程序只有一个

Servlet:

简单概括来说,servlet类就是负责处理用户传递给服务器的信息然后返回信息给用户的程序,某个角度来说,servlet就是服务器。
使用方法,就是通过继承Servlet类(目前基本是继承HttpServlet类),并重写里面的方法:
下面已SignupServlet来介绍

public class SignupServlet extends HttpServlet {public SignupServlet() {super();// TODO Auto-generated constructor stub
}
//客户端以get的方式发送请求时调用的函数protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {}
//客户端以post的方式发送请求时调用的函数protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {ServletContext context = request.getServletContext();//可通过ServletContext获得存储在里面的对象DatabaseManager dm = (DatabaseManager)context.getAttribute("DatabaseManager");PrintWriter out = response.getWriter();String name = request.getParameter("name");String password = request.getParameter("password");if(dm.addUser(name, password))//向客户端发送文本信息out.write("true");elseout.write("false");out.close();
}
//还有其他方式的请求的处理函数。。。
}

网页中的其它servlet:

servlet

Servlet介绍
LoginServlet检查该session是否已经登陆过,以及检查传过来的登陆信息是否正确
SignupServlet检查传过来的注册信息,以及存储进数据库
DestroyServlet销毁当前发出请求的session的所有内容、信息
UserMessageServlet返回用户信息给用户
ConnectionMessageServlet返回用户聊天信息给用户(用户session中ConnectionManager存储的Word),以及保存聊天信息

Servlet的配置:
servlet的生效必须在web.xml中进行配置:

 <servlet><servlet-name>SignupServlet</servlet-name><servlet-class>servlet.SignupServlet</servlet-class></servlet><servlet-mapping><servlet-name>SignupServlet</servlet-name><url-pattern>/signup_servlet</url-pattern></servlet-mapping>

servlet地址问题,前面的jquery get/post里面提到servlet名称,就是上面配置中的servlet-name里的内容

Listener:

参考资料:http://www.cnblogs.com/hellojava/archive/2012/12/26/2833840.html
参考资料中对Listener说的比较详细,就不多说了。
这个程序中只用到了ServletContextListener

public class MyServerletContextListener implements ServletContextListener {@Override//context销毁时调用的函数,也就是关闭该程序时候public void contextDestroyed(ServletContextEvent arg0) {// TODO Auto-generated method stub}@Override//context创建时候,也就是程序启动的时候public void contextInitialized(ServletContextEvent arg0) {// TODO Auto-generated method stub  ServletContext context = arg0.getServletContext();//UsersManger在线用户管理器、DatabaseManager数据库都是整个应用//程序只有一个,并且所有用户都需共享一个,因此在context创建时设置//好context.setAttribute("usersManager", new UsersManager());context.setAttribute("DatabaseManager", new DatabaseManager());}
}

在web.xml的配置:

  <listener><listener-class>listener.MyServerletContextListener</listener-class></listener>

服务器端websocket:

使用

上面客户端websocket处大概讲了websocket的原理以及客户端websocket的应用,现在来说服务器的websocket使用:

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;//这是指定websocket访问名字,不可漏
@ServerEndpoint("/ConnectionWebSocket")
public class ConnectionWebSocket{private static ArrayList<Session> sessions = new ArrayList<Session>();@SuppressWarnings("static-access")@OnMessage//收到信息时,把该信息向所有已经保存了session的用户发送信息public void onMessage(String message,Session session) throws IOException{for(Session temp:this.sessions){temp.getBasicRemote().sendText(message);}}@SuppressWarnings("static-access")@OnOpen//用户创建websocket连接时,保存用户的sessionpublic void onOpen(Session session) {// TODO Auto-generated method stubthis.sessions.add(session);}@SuppressWarnings("static-access")@OnClose//用户关闭websocket连接时,删除用户的sessionpublic void onClose(Session session) {  this.sessions.remove(session);}
}

注意:
1.上面的Session和Servlet中的Session是不同的类

websocket注意点:

背景:一开始我写的时候私有变量sessions没有设置为static,然后发现在创建多个用户后,里面存储的session也依然只有一个。。。
所以,可以知道websocket不是唯一的,它和java的socket其实原理差不多,每有一个连接就创建一个websocket,所以想要所有socket共享数据,就必须设置为static。(现在突然想起这会引起并发的竞争问题,ArrayList不支持并发操作。。。当时写额时候没想起)
所以,websocket一定要注意共享和并发的问题。

聊天机制:

每当用户创建websocket连接时,保存用户的session用于发送信息,当然用户关闭连接时,就从中删除该用户的session;
聊天时:
假设现在存储了A、B、C、D四个用户的session,这时A向D发送信息a,ConnectionWebSocket接受到信息调用onMessage方法,把信息a发送给所有存储了session的用户也就是A、B、C、D四个用户,然后各个用户接受到信息后,检查是不是自己的信息。

其他遇到的问题

中文乱码问题

如果直接传输中文的话,特别是由服务器端传输到客户端(客户端传输到服务器暂未发现问题),通常会变成乱码,因此传输前先编码,接收后再解码
客户端:

//解码
decodeURI(data)
//编码
encodeURI(data)

服务器端:

//编码
URLEncoder.encode(data, "utf-8")
//解码
URLDecoder.decode(data, "utf-8")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_742854.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础搭建PHP本地环境并安装WordPress网站(图文指导)

搭建PHP本地环境前言 以前在大学课堂上学过一点JAVA, PHP. 因为那时是零基础&#xff0c;需要自己搭建APACH, MYSQL, PHPADMIN过程挺烦的&#xff0c;本地环境都不知道是啥&#xff0c;但是做出来结果却很高兴。出来后也做过网站&#xff0c;但是很久不弄就忘记了&#xff0c;我…

javaweb:在线聊天网站(框架版)

之前写过一次在线聊天网站&#xff0c;不过那次是无框架版的&#xff0c;这次用框架构建网站&#xff0c;基本功能和上次差不多 涉及知识 java spring&#xff08;4.3.5&#xff09;&#xff1a;spring、spring MVC hibernate bootstrap jsp JavaScript&#xff0c;jquer…

利用TortoiseGit(小乌龟)将项目上传至GitHub网站

2019独角兽企业重金招聘Python工程师标准>>> 准备 1.拥有一个GitHub账户2.安装了TortoiseGit&#xff08;小乌龟&#xff09;具体过程 一、在GitHub上建立新的仓库 起好仓库名&#xff0c;填好描述&#xff0c;在Add .gitgnore中选择Java&#xff08;根据你自己需求…

一些缩短树莓派学习曲线的书籍、课程和网站

2019独角兽企业重金招聘Python工程师标准>>> 树莓派是一款小型单板计算机&#xff0c;最初用于教学和学习编程和计算机科学。但如今它有更多用处。它是一种经济的低功耗计算机&#xff0c;人们将它用于各种各样的事情 —— 从家庭娱乐到服务器应用&#xff0c;再到物…

大型分布式网站架构实战项目分析

2019独角兽企业重金招聘Python工程师标准>>> 大型分布式网站架构实战项目分析 转载于:https://my.oschina.net/u/1168056/blog/1802675

zblog mysql数据库无法连接_ZBlog博客网站错误:MySQL数据库无法连接

前言前天搭建的博客网站&#xff0c;睡醒一觉起来网站挂逼了&#xff0c;其间无任何操作。主页都进不去&#xff0c;提示“MySQL数据库无法连接”&#xff0c;无论怎么刷新重启服务器都没用。最终从中午1点搞到凌晨2点&#xff0c;皇天不负有心人终于解决了。其实问题很简单&am…

.net core Asp.net Mvc Ef 网站搭建 vs2017 1)

1&#xff09;开发环境搭建 首先下载安装vs2017 地址 &#xff1a;https://www.visualstudio.com/zh-hans/downloads/ 安装勾选几项如下图 ,注意点在单个组件时.net core 运行时一定要勾上,很多人都没勾结果新增不了.net core 项目 2&#xff09;开发 1.新增.net core mvc …

LAMP架构部署和动态网站环境的配置

实验环境&#xff1a;操作系统&#xff1a;centos 7.5服务器IP&#xff1a;192.168.10.5运行用户&#xff1a;root连接工具&#xff1a;xshell工具web环境&#xff1a;Linuxapachephpmariadb&#xff08;LAMP架构&#xff09;大型动态应用系统平台主要是针对于大流量、高并发网…

我的博客网站开发5——博文正文页

为实现页面间的统一性和开发时代码的工作量&#xff0c;我们将页面相同的布局做成母版页&#xff0c;变化的内容在内容页进行变化。如下图&#xff1a; 这样&#xff0c;我们在写博文的显示全文页面时&#xff0c;我们只需在新增页面引用母版页就可实现&#xff0c;页面相同页面…

建立个人网站需要学习哪些知识?学习的顺序是什么?

首先&#xff0c;做个人的网站&#xff0c;不是写笔记那么肯定是为了我展示给别人看。 想要把自己写的网站展示给互联网&#xff0c;就要把代码部署到服务器&#xff0c;如果按照正常的流程&#xff0c;就要首先登陆百度云&#xff0c;阿里云什么的&#xff0c;购买服务器&…

Chrome 不想让 HTTPS 网站通过 HTTP 下载文件

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> 你是否经历过访问的明明是一个 HTTPS 网站&#xff0c;但是有时候站内下载东西使用的协议却是 HTTP&#xff0c;这其实存在安全隐患&#xff0c;现在 Chrome 不想让这样的事情发生…

Google也来凑热闹-网站导航

网站导航这个已经在国内做烂掉的东西&#xff0c;最近大鳄级别的Google也来凑热闹了&#xff0d;Google网站导航&#xff0c;据他们自己说&#xff1a; 在推这款产品之初&#xff0c;我们做了大量的调研&#xff0c;。。。我们发现还有大量的另一类用户&#xff0c;我们在帮助…

网站数据安全防护的八大要诀

不管是网络还是终端&#xff0c;信息安全问题始终是人们所最为关心的问题&#xff0c;所以当人们的数据中心正走向网络的时候&#xff0c;人们的安全防护也必须紧跟这个脚步。 1、认证和口令管理 这主要是一种一次性的活动而且仅仅是作为项目的一部分而完成的。有人可能会问一…

php网站防止sql注入攻击方法

网站安全防护—该如何防止SQL注入攻击&#xff1f; 移动互联网的发展势头已经远远超过PC互联网&#xff0c;手机移动端上网&#xff0c;以及持有量远超PC电脑&#xff0c; 随着移动大数据、区块链的技术在不断的完善&#xff0c;成熟&#xff0c;日常生活中经常会听到某某网站…

网站被黑 如何做好网站安全防护

网站被攻击&#xff0c;首先牵扯到的就是网站的开发语言&#xff0c;包括了代码语言&#xff0c;以及数据库语言&#xff0c;目前大多数网站都是使用的PHP&#xff0c;JAVA&#xff0c;.net语言开发&#xff0c;数据库使用的是mysql&#xff0c;oracle等数据库&#xff0c;那么…

网站被黑 怎么检测代码含有后门

收到阿里云的短信提醒说是网站存在后门&#xff0c;webshell恶意通信行为&#xff0c;紧急的安全情况&#xff0c;我第一时间登录阿里云查看详情&#xff0c;点开云盾动态感知&#xff0c;查看了网站木马的详细路径以及webshell的特征&#xff0c;网站从来没有出现过这种情况&a…

如何防止网站数据库被攻击被篡改?

某一网站平台的客户数据库被黑客篡改了&#xff0c;篡改了会员的卡信息以及金额&#xff0c;包括zhu单也被黑客篡改&#xff0c;导致平台的损失很大&#xff0c;在后台提现的时候&#xff0c;客户才发现会员的数据有异常&#xff0c;觉得不得劲&#xff0c;查询该会员账号的所有…

企业网站服务器遭到黑客入侵? 如何做好安全防护

好多企业网站遭遇黑客攻击&#xff0c;像黑客入侵在互联网只要有数据网络&#xff0c;就能使用数据网络远程操作目标的笔记本电脑、网络服务器、企业网站&#xff0c;从而任意地读取或篡改目标的重要数据&#xff0c;又又或者使用目标系统软件上的功能模块&#xff0c;比如对手…

如何防护黑客攻击网站漏洞?

从今年3月份全世界黑客攻击网站分析局势来看&#xff0c;黑客攻击的网站中中国占有了绝大多数。那麼作为一个公司或是开发公司&#xff0c;如何防止自身的网站黑客攻击&#xff0c;从企业网站建设之初&#xff0c;就应当搞好这种安全对策&#xff0c;当你的网站保证以下几个方面…