java websocket 库_websocket

[java]代码库package com.smartAnji.control.utils;

import java.io.IOException;

/**

* WebSocketService

*/

@ServerEndpoint(value = "/websocket", configurator = GetHttpSessionConfigurator.class)

public class WebSocketService {

// concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识

private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();

// websocket自带了session,与某个客户端的连接会话,需要通过它来给客户端发送数据

private Session session;

private HttpSession httpSession; // HttpSession协议,jsp的session

// 通信流程 : pageName(httpsession) session(webSocketSet)

private String pageName; // 用户名(网页名)

private static List pageList = new ArrayList(); // 在线用户列表(静态)

// pageName和session绑定的路由表,由pageName找到相应的session

private static Map onlineUsers = new HashMap();

/**

* 连接建立成功调用的方法

*

* @param session

* 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据

* @throws IOException

*/

@OnOpen

public void onOpen(Session session, EndpointConfig config) throws IOException {

this.session = session;

this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());

this.pageName = (String) this.httpSession.getAttribute("user"); // 获取当前用户

if (pageName != null) {

onlineUsers.put(pageName, this.session);

pageList.add(pageName); // 加入pagelist中

webSocketSet.add(this); // 加入webSocketSet中

System.out.println(pageName + " ----> 新连接加入!当前在线人数为 " + pageList.size());

}

}

/**

* 连接关闭调用的方法

*/

@OnClose

public void onClose() {

if (onlineUsers.containsKey(pageName)) {

webSocketSet.remove(this); // 从set中删除

pageList.remove(pageName); // 从在线列表移除这个用户

onlineUsers.remove(pageName); // 从路由表删除

System.out.println(pageName + "移除成功");

System.out.println(pageName + "关闭!当前在线人数为" + pageList.size());

}

}

/**

* 发生错误时调用

*

* @param session

* @param error

*/

@OnError

public void onError(Session session, Throwable error) {

System.out.println("发生错误");

error.printStackTrace();

}

/**

* 收到客户端消息后调用的方法

*

* @param message

* 客户端发出的消息

* @throws IOException

*/

@OnMessage

public void onMessage(String message) throws IOException {

HashMap messageMap = MessageUtil.getMessage(message); // 处理消息类

String fromName = messageMap.get("fromName"); // 消息来自人 的userId

String toName = messageMap.get("toName"); // 消息发往人的 userId

String mapContent = messageMap.get("content");

String type = messageMap.get("type");

if (MessageUtil.MESSAGE.equals(type)) {

if ("all".equals(toName)) {

String content = MessageUtil.sendContent(MessageUtil.MESSAGE, mapContent);

System.out.println("++++++++++++++++++++"+content);

broadcastAll(content);

} else {

try {

singleChat(fromName, toName, mapContent);

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

/**

* 广播消息的方法

*

* @param message

* @throws IOException

*/

private static void broadcastAll(String message) throws IOException {

// 群发消息

for (WebSocketService item : webSocketSet) {

try {

item.session.getBasicRemote().sendText(message);

} catch (IOException e) {

e.printStackTrace();

continue;

}

}

}

/**

* 对特定用户发送消息的方法

*

* @param fromName

* @param toName

* @param mapContent

* @throws IOException

*/

private void singleChat(String fromName, String toName, String mapContent) throws IOException {

String contentTemp = MessageUtil.sendContent(MessageUtil.MESSAGE, mapContent);

for (String pageName : pageList) {

if ("navPage".equals(pageName) || "overPage".equals(pageName)) {

session = onlineUsers.get(pageName);

session.getBasicRemote().sendText(contentTemp);

} else {

System.out.println("客户端未打开!");

}

}

// if (pageList.contains(toName)) {

// session = onlineUsers.get(toName);

// session.getBasicRemote().sendText(contentTemp);

// } else {

// System.out.println("客户端未打开!");

// }

}

}

694748ed64b9390909c0d88230893790.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Java WebSocket和SSL WebSocket与HTTPS连接,你需要做以下几步: 1. 生成SSL证书 你需要为你的服务器生成一个SSL证书来启用SSL。你可以使用Java的keytool工具来生成自签名的SSL证书: ``` keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -validity 3650 ``` 2. 配置SSL连接 你需要在你的服务器端点配置SSL连接。这是一个示例代码,你可以根据你的需要进行修改: ``` SSLContext sslContext = SSLContext.getInstance("TLS"); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(new FileInputStream(new File("keystore.jks")), "password".toCharArray()); keyManagerFactory.init(keyStore, "password".toCharArray()); sslContext.init(keyManagerFactory.getKeyManagers(), null, null); HttpServer server = HttpServer.create(new InetSocketAddress(443), 0); server.setHttpsConfigurator(new HttpsConfigurator(sslContext) { public void configure(HttpsParameters params) { SSLContext context = getSSLContext(); SSLEngine engine = context.createSSLEngine(); params.setNeedClientAuth(false); params.setCipherSuites(engine.getEnabledCipherSuites()); params.setProtocols(engine.getEnabledProtocols()); params.setSSLParameters(context.getDefaultSSLParameters()); } }); ``` 3. 创建SSL WebSocket服务器 你可以使用Jetty或Tyrus等Java WebSocket来创建SSL WebSocket服务器。这里以Tyrus为例: ``` SSLContext sslContext = SSLContext.getInstance("TLS"); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(new FileInputStream(new File("keystore.jks")), "password".toCharArray()); keyManagerFactory.init(keyStore, "password".toCharArray()); sslContext.init(keyManagerFactory.getKeyManagers(), null, null); Server server = new Server("localhost", 443, "/", null, ChatEndpoint.class, new HashMap<String, Object>(), sslContext); server.start(); ``` 这些步骤应该可以帮助你配置Java WebSocket和SSL WebSocket与HTTPS连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值