web socket实现聊天室

本文介绍如何使用Java和WebSocket技术创建一个聊天室。WebSocket允许客户端与服务器保持持久连接,不同于HTTP的请求-响应模式。示例代码包括服务端的普通类实现和客户端的事件监听,如onopen、onclose、onmessage和onerror。此外,还推荐了两篇关于WebSocket聊天室实现的优质博客文章。
摘要由CSDN通过智能技术生成

web socket,我的理解就是他通过一种新的协议可以保持客户端与服务器一直的连接,http是请求后断开,等待对方相应,web socket是请求后继续连接,直到我再次请求断开。以java,jsp为例做了一个小demo。

首先是服务端代码,没有用servlet而是用了一个普通类:

package wang;

import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

//该标签表示了websocket的路径,后面大括号里的可以用来传递参数
@ServerEndpoint("/webscoket/{userName}")
public class WebScoketTest {
	//用来存放连接,也可以只存放session,但如果只存放session的话就无法保存用户名等信息了
	private static final Set<WebScoketTest> connections = new CopyOnWriteArraySet<>();
	//用户名
	private String userName;
	//websocket连接,可以通过session向另一端传递信息
	private Session session ;
	
	/**
	 * 用来传递信息,当客户端向服务端发送信息的时候该方法会被调用
	 * author: wcy 2015年7月28日
	 * @param message
	 * @param session
	 * @throws IOException
	 * @throws InterruptedException
	 */
	@OnMessage
	public void onMessage(String message, Session session) throws IOException, InterruptedException{
		message = message.replaceAll("[\\n\\r]","<br/>" );
		for(WebScoketTest client : connections){
			synchronized (client) {
				//向在连接池中的所有连接
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个包不完整,到这里可下载完整的文档,程序代码,数据库脚本等http://download.csdn.net/source/1140485 一个用于Web游戏中的即时聊天代码 使用内存进行消息投递 支持私聊和供聊 支持统计在线人数 可开多个房间 注意:有人反映这个不能直接使用,在这里特做一下说明 =============================================== 这个程序是从游戏中拿出来的,并不是一个独立的应用程序 发上去的部分是不能直接运行的,发出来的目的只是想给有这方面兴趣的朋友做个参考,因为我自己才做这块的时候确实走了不少弯路 里面有类设计图,类设计图是用powerdesign 12.5设计的 可以通过类设计图看服务端的设计 客户端是一个demo html文件 要运行还需要配数据库,还需要微软的企业库开发包 不了解企业库的可以去这里看看 http://www.codeplex.com/entlib 你也可以修改一下代码让程序不需要访问数据库 访问数据库主要是加载房间信息,你可以在代码里弄几个模拟的房间信息 聊天消息的中专是不依赖数据库的 ====================================== 再次补充说明 这个代码的开发环境为:vs2008+sqlserver2005+微软企业库+net fwk3.5 其实用vs2005+2.0框架也可以,虽然使用的是3.5的框架,但是并没有使用3.5框架的新特性 经检查发现里面确实没有类设计图,也没有服务器端的源代码 现在传上去的这部分只是一个demo,包含客户端和编译过的服务器端代码 非常的抱歉,我将不上源代码和相关设计文件 =========================================================== 目录结构说明 ChatDemo-包含客户端和编译过的服务器端 ChatDemo/ChatDemo.HttpHandler-客户端http处理器(客户端和服务器端的交互就靠这些文件了) ChatDemo/ChatWebDemo-客户端的实现代码 ChatDemo/ChatWebDemo/ServerManager.aspx-此文件可控制服务器的启动和关闭(客户端和服务器端是存在于同一台电脑上测试的,所以在一个工程里) ChatDemo/ChatWebDemo/SelectChatRoom.aspx-可选择进入哪一个聊天室 ChatDemo/ChatWebDemo/Chat.aspx-聊天客户端界面 DinosaurEmpery-包含服务器端的源代码和相关设计文档-数据库文档等 DinosaurEmpery/src-服务端源代码 DinosaurEmpery/using-程序中用引用到到第3方dll(微软企业库)
Web Socket 是一种用于实现浏览器与服务器全双工通信的协议,支持双向实时通信。在 Java实现 Web Socket 聊天可以使用 Java API for WebSocket(JSR-356)实现。 以下是一个简单的 Web Socket 聊天室的示例: 1. 创建一个聊天处理程序 ChatHandler,继承自 javax.websocket.Endpoint 和 javax.websocket.MessageHandler.Partial 接口: ``` import java.io.IOException; import java.nio.ByteBuffer; import javax.websocket.Endpoint; import javax.websocket.EndpointConfig; import javax.websocket.MessageHandler; import javax.websocket.Session; public class ChatHandler extends Endpoint implements MessageHandler.Partial<String> { private Session session; @Override public void onOpen(Session session, EndpointConfig config) { this.session = session; session.addMessageHandler(this); } @Override public void onMessage(String message, boolean last) { try { // 发送消息给所有连接的客户端 for (Session s : session.getOpenSessions()) { if (s.isOpen()) { s.getBasicRemote().sendText(message, last); } } } catch (IOException e) { e.printStackTrace(); } } @Override public void onMessage(ByteBuffer message, boolean last) { throw new UnsupportedOperationException("Binary messages not supported."); } } ``` 2. 创建一个 WebSocket 端点 ChatEndpoint,继承自 javax.websocket.server.ServerEndpoint: ``` import javax.websocket.server.ServerEndpoint; @ServerEndpoint(value = "/chat", encoders = {MessageEncoder.class}, decoders = {MessageDecoder.class}) public class ChatEndpoint { // 该注解会自动创建 ChatHandler 实例,并将其添加到 WebSocket 会话中 } ``` 3. 创建一个消息编码器 MessageEncoder 和一个消息解码器 MessageDecoder,用于在客户端与服务器之间转换消息: ``` import javax.json.Json; import javax.json.JsonObject; import javax.websocket.EncodeException; import javax.websocket.Encoder; import javax.websocket.EndpointConfig; public class MessageEncoder implements Encoder.Text<Message> { @Override public String encode(Message message) throws EncodeException { JsonObject jsonObject = Json.createObjectBuilder() .add("sender", message.getSender()) .add("content", message.getContent()) .build(); return jsonObject.toString(); } @Override public void init(EndpointConfig config) {} @Override public void destroy() {} } ``` ``` import java.io.StringReader; import javax.json.Json; import javax.json.JsonObject; import javax.websocket.DecodeException; import javax.websocket.Decoder; import javax.websocket.EndpointConfig; public class MessageDecoder implements Decoder.Text<Message> { @Override public Message decode(String s) throws DecodeException { JsonObject jsonObject = Json.createReader(new StringReader(s)).readObject(); return new Message(jsonObject.getString("sender"), jsonObject.getString("content")); } @Override public boolean willDecode(String s) { try { Json.createReader(new StringReader(s)).readObject(); return true; } catch (Exception e) { return false; } } @Override public void init(EndpointConfig config) {} @Override public void destroy() {} } ``` 4. 创建一个消息类 Message,用于表示聊天消息: ``` public class Message { private String sender; private String content; public Message(String sender, String content) { this.sender = sender; this.content = content; } public String getSender() { return sender; } public void setSender(String sender) { this.sender = sender; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } ``` 5. 在 HTML 页面中使用 JavaScript 创建 WebSocket 连接并发送和接收消息: ``` <script> var websocket = new WebSocket("ws://localhost:8080/chat"); websocket.onopen = function(event) { console.log("WebSocket connected."); }; websocket.onmessage = function(event) { var message = JSON.parse(event.data); console.log("Received message: " + message.content); }; function sendMessage() { var message = document.getElementById("messageInput").value; websocket.send(JSON.stringify({sender: "user", content: message})); console.log("Sent message: " + message); } </script> ``` 6. 将 ChatEndpoint、ChatHandler、MessageEncoder、MessageDecoder 和 Message 类打包成一个 WAR 文件,并部署到 Tomcat 或 Jetty 中。 这样就可以在浏览器中访问 HTML 页面,通过 WebSocket 实现实时聊天了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值