`
cakin24
  • 浏览: 1388339 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

使用WebSocket实现多人实时聊天

阅读更多
一 应用
本应用使用WebSocket实现多人实时聊天
 
二 代码
客户端代码
<!DOCTYPE html>
<html>
<head>
	<meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title> 使用WebSocket通信 </title>
	<script type="text/javascript">
		// 创建Web Socket对象
		var webSocket = new WebSocket("ws://127.0.0.1:30000");
		webSocket.onopen = function()
		{
			// 为onmessage事件绑定监听器,接收消息
			webSocket.onmessage= function(event)
			{
				// 接收、并显示消息
				document.getElementById('show').innerHTML 
					+= event.data + "<br/>";
			}
		};
		var sendMsg = function(val)
		{
			var inputElement = document.getElementById('msg');
			// 发送消息
			webSocket.send(inputElement.value);
			// 清空单行文本框
			inputElement.value = "";
		}
	</script>
</head>
<body>
<div style="width:600px;height:240px;
	overflow-y:auto;border:1px solid #333;" id="show"></div>
<input type="text" size="80" id="msg" name="msg"/>
<input type="button" value="发送" onclick="sendMsg();"/>
</body>
</html>
 
服务器代码
import java.io.*;
import java.net.*;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.regex.*;
import java.util.*;
import sun.misc.BASE64Encoder;
/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
 * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author Yeeku.H.Lee kongyeeku@163.com
 * @version 1.0
 */
public class ChatServer
{
	// 记录所有的客户端Soccket
	public static List<Socket> clientSockets
		= new ArrayList<Socket>();
	public ChatServer()throws IOException
	{
		// 创建ServerSocket,准备接受客户端连接
		ServerSocket ss = new ServerSocket(30000);
		while(true)
		{
			// 接收到客户端连接
			Socket socket = ss.accept();
			// 将客户端Socket添加到clientSockets集合中
			clientSockets.add(socket);
			// 启动线程
			new ServerThread(socket).start();
		}
	}
	public static void main(String[] args)
		throws Exception
	{
		new ChatServer();
	}
}
class ServerThread extends Thread
{
	private Socket socket;
	public ServerThread(Socket socket)
	{
		this.socket = socket;
	}
	public void run()
	{
		try
		{
			// 得到Socket对应的输入流
			InputStream in = socket.getInputStream();
			// 得到Socket对应的输出流
			OutputStream out = socket.getOutputStream();
			byte[] buff = new byte[1024];
			String req = "";
			// 读取数据,此时建立与WebSocket的"握手"。
			int count = in.read(buff);
			// 如果读取的数据长度大于0
			if(count > 0)
			{
				// 将读取的数据转化为字符串
				req = new String(buff , 0 , count);
				System.out.println("握手请求:" + req);
				// 获取WebSocket的key
				String secKey = getSecWebSocketKey(req);
				System.out.println("secKey = " + secKey);
				String response = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: "
					+ "websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "
						+ getSecWebSocketAccept(secKey) + "\r\n\r\n";
				System.out.println("secAccept = " + getSecWebSocketAccept(secKey));
				out.write(response.getBytes());
			}
			int hasRead = 0;
			// 不断读取WebSocket发送过来的数据
			while((hasRead = in.read(buff)) > 0)
			{
				System.out.println("接收的字节数:" + hasRead);
				/*
					因为WebSocket发送过来的数据遵循了一定的协议格式,
					其中第3个~第6个字节是数据掩码。
					从第7个字节开始才是真正的有效数据。
					因此程序使用第3个~第6个字节对后面的数据进行了处理
				*/
				for (int i = 0 ; i < hasRead - 6 ; i++ )
				{
					buff[i + 6] = (byte) (buff[i % 4 + 2] ^ buff[i + 6]);
				}
				// 获得从浏览器发送过来的数据
				String pushMsg = new String(buff
					, 6 , hasRead - 6 , "UTF-8");
				// 遍历Socket集合,依次向每个Socket发送数据
				for (Iterator<Socket> it = ChatServer.clientSockets.iterator()
					; it.hasNext() ;)
				{
					try
					{
						Socket s = it.next();
						// 发送数据时,第一个字节必须与读到的第一个字节相同
						byte[] pushHead = new byte[2];
						pushHead[0] = buff[0];
						// 发送数据时,第二个字节记录发送数据的长度
						pushHead[1] = (byte) pushMsg.getBytes("UTF-8").length;
						// 发送前两个字节
						s.getOutputStream().write(pushHead);
						// 发送有效数据
						s.getOutputStream().write(pushMsg.getBytes("UTF-8"));
					}
					catch (SocketException ex)
					{
						// 如果捕捉到异常,表明该Socket已经关闭
						// 将该Socket从Socket集合中删除
						it.remove();
					}
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				// 关闭Socket
				socket.close();
			}
			catch (IOException ex)
			{
				ex.printStackTrace();
			}
		}
	}
	// 获取WebSocket请求的SecKey
	private String getSecWebSocketKey(String req)
	{
		//构建正则表达式,获取Sec-WebSocket-Key: 后面的内容
		Pattern p = Pattern.compile("^(Sec-WebSocket-Key:).+",
				Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
		Matcher m = p.matcher(req);
		if (m.find())
		{
			// 提取Sec-WebSocket-Key
			String foundstring = m.group();
			return foundstring.split(":")[1].trim();
		}
		else
		{
			return null;
		}
	}
	// 根据WebSocket请求的SecKey计算SecAccept
	private String getSecWebSocketAccept(String key)
		throws Exception
	{
		String guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
		key += guid;
		MessageDigest md = MessageDigest.getInstance("SHA-1");
		md.update(key.getBytes("ISO-8859-1") , 0 , key.length());
		byte[] sha1Hash = md.digest();
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(sha1Hash);
	}
}
 
 
三 运行结果

 
  • 大小: 71 KB
1
1
分享到:
评论

相关推荐

    基于vue和websocket的多人在线聊天室

    在本文中,我们将探讨如何构建一个基于Vue.js和WebSocket的多人在线聊天室。Vue.js是一个流行的前端JavaScript框架,用于构建用户界面,而WebSocket则是一种在客户端和服务器之间提供全双工、低延迟通信的协议。结合...

    java利用websocket实现多人聊天室(springmvc框架)

    在本文中,我们将深入探讨如何使用Java和Spring MVC框架实现一个基于WebSocket的多人聊天室。WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许实时双向通信,非常适合用于在线聊天应用。 首先,我们...

    基于websocket的多人多聊天室服务器

    总之,基于WebSocket的多人多聊天室服务器利用OpenResty的高效特性,结合Lua脚本和HTML前端,可以实现低延迟、高实时性的聊天体验。通过合理的服务器配置和安全策略,我们可以构建一个可靠的在线社交平台,满足大量...

    Springboot+websocket 实现多人聊天室/单人聊天

    这是一个简单使用websocket实现多人聊天室,单人聊天室的demo,里面使用的是最原始的websocket的方法,附有客户端界面可以直接跑起来发送消息看效果。 该项目对应刚刚接触websocket技术是比较有用的。 2019-10-11的...

    webChat使用websocket实现网页多人聊天

    总结,"webChat"项目是一个基于WebSocket实现的网页多人聊天应用,通过WebSocket的全双工特性,实现了高效、实时的聊天功能。了解并掌握WebSocket的基本原理和API,以及如何在客户端和服务器端进行相应的编程,是...

    使用WebSocket+SpringBoot搭建简易的多人聊天室

    使用WebSocket+SpringBoot搭建简易的多人聊天室 由浅入深,配合博客入门教程文章食用,风味独特。 使用WebSocket+SpringBoot搭建简易的多人聊天室 由浅入深,配合博客入门教程文章食用,风味独特。 使用WebSocket+...

    spring boot整合WebSocket实现多人聊天室的实例

    在本实例中,我们将探讨如何使用Spring Boot整合WebSocket和STOMP协议来实现一个多人聊天室。 首先,我们需要在Spring Boot项目中添加WebSocket的相关依赖。这通常包括`spring-websocket`和`spring-messaging`。在`...

    websocket实现多人聊天

    为了实现多人聊天,我们需要维护一个用户列表和消息队列。每当有新的消息到来时,我们遍历所有连接的客户端,将消息推送出去。在`ChatServer`的`onMessage`方法中,可以这样做: ```java @OnMessage public void ...

    WebSocket精简多人聊天

    - 在服务器端,为了实现多人聊天功能,我们需要维护一个客户端连接的会话列表。每当有新的连接建立或关闭,都需要更新这个列表。 - 当接收到一条新消息时,遍历会话列表,通过`Session.getBasicRemote().sendText...

    springboot+websocket+Stomp+RabbitMq 实现多人聊天室

    在本文中,我们将深入探讨如何使用Spring Boot、WebSocket、STOMP协议和RabbitMQ来构建一个功能完善的多人聊天室系统。这些技术的结合为实时通信提供了高效且可靠的解决方案。 首先,Spring Boot是Java开发Web应用...

    nodejs+websocket实现简单的多人聊天

    为了测试这个应用,你可以将HTML文件放在本地服务器上,如使用`http-server`,然后在多个浏览器窗口中打开该页面,体验多人聊天的功能。 这个示例只是一个基础的WebSocket聊天应用,实际项目中可能需要考虑更多的...

    java 基于websocket实现的视频聊天

    Java基于WebSocket实现的视频聊天是一种实时通信(Real-Time Communication, RTC)的应用,它利用了WebSocket这一先进的网络协议来实现高效、双向的数据传输。WebSocket协议是HTML5的一个重要特性,为客户端与服务器...

    springboot+websocket聊天室(多人聊天,单人聊天)

    在本文中,我们将深入探讨如何使用Spring Boot和WebSocket技术构建一个功能完备的聊天室应用,支持多人聊天和单人私聊。Spring Boot以其简洁的配置和强大的功能在Java开发领域广受欢迎,而WebSocket则提供了全双工的...

    FastApi、Websocket、多人聊天室

    为了实现多人聊天室,我们需要一个前端界面来与后端的WebSocket服务器交互。可以使用JavaScript库如`socket.io`或纯JavaScript编写WebSocket客户端。下面是一个简单的HTML页面,使用JavaScript发送和接收WebSocket...

    Golang(Gin框架)+websocket 实现的多人聊天室+代码+详细文档

    为了实现多人聊天功能,我们需要一个数据存储方案。在这个项目中,使用了MySQL数据库来存储用户信息和聊天记录。MySQL是流行的开源关系型数据库,支持事务处理,具有高可用性和高性能,非常适合存储结构化数据。 在...

    websocket单个,多人聊天

    WebSocket 单个及多人聊天是一种基于 WebSocket 协议的实时通信技术,它允许客户端与服务器之间建立长连接,实现双向通信。WebSocket 提供了比传统 HTTP 协议更高效、低延迟的通信方式,尤其适合在线聊天、实时游戏...

    基于springboot+websocket开发实现多人聊天室的项目源码(java期末大作业)

    基于springboot+websocket开发实现多人聊天室的项目源码(java期末大作业)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。包含:项目源码、数据库脚本等...

    websocket 多人聊天室 网页版

    `onMessage`方法用于接收客户端发送的消息,并可以调用`Session`对象的`getBasicRemote()`方法向所有连接的客户端广播消息,实现多人聊天功能。 客户端的实现通常通过JavaScript进行,使用WebSocket对象与服务器...

Global site tag (gtag.js) - Google Analytics