【网络】Tomcat+Websocket通信尝试

5 篇文章 0 订阅

直接上代码

chat.html

 

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>点对点聊天</title>
	<link type="text/css" rel="stylesheet" href="style.css" />
</head>

<body>
	<div id="to">发送给:[<span class="users">所有人</span>]</div>
	<div id='container'>
		<div id="left_panel">
			<div id="left_top">
				<!-- <div class="mes from_me">FROM ME</div>
				<div class="mes to_me">TO ME</div> -->
			</div>
			
			<div id="left_bottom" contentEditable="true"></div>
		</div>
		<div id="right_panel">
			<div id="right_top">
				
			</div>
			<div id="right_bottom">
				<input type="text" id="user_name" placeholder="User Name" maxlength="10" required/>
				<input type="button" id="login" value="登录" onclick="login()"/>
			</div>
		</div>
		
	</div>
	<script>
		var userName;
		var toUser="";
		var websocket=null;
		function choose(arg){
			toUser=arg.innerHTML;
			document.getElementById("to").innerHTML='发送给:[<span class="users">'+toUser+'</span>]';
			if(toUser==='所有人')toUser='';
		}
		function login(){
			if(!document.getElementById("user_name").checkValidity())return ;
			userName = document.getElementById("user_name").value;
			if(userName=="")return;
			ws();
		}
		function ws(){
			if('WebSocket' in window){
				websocket = new WebSocket("ws://"+location.host+"/Test/chat?id="+userName);
				//连接成功建立的回调方法
				websocket.onopen = function(event){
					console.log("websocket open");
					var opt = document.getElementById("right_bottom");
					opt.innerHTML='<input type="button" id="login" value="发送" onclick="send()" style="margin-top:50px" />';
				}
				//连接发生错误的回调方法
				websocket.onerror = function(){
					 console.log("websocket error");
					 alert("登录失败");
				};
				//连接关闭的回调方法
				websocket.onclose = function(){
					console.log("websocket close");
					var opt = document.getElementById("right_bottom");
					opt.innerHTML='<input type="text" id="user_name" placeholder="User Name" maxlength="10" required/><input type="button" id="login" onclick]="login()" value="登录"/>';
				};
				//接收到消息的回调方法
				websocket.onmessage = function(e){
					var json = JSON.parse(e.data);
					if((typeof json.to) == 'undefined'){
						var html = '<div class="users" onclick="choose(this)">所有人</div>';
						for(var k in json){
							html+='<div class="users" onclick="choose(this)">'+json[k]+'</div>';
						}
						document.getElementById("right_top").innerHTML=html;
					}else{
						var record = document.getElementById("left_top");
						var html = '<div class="mes to_me">'+json.from+' : '+json.content+'</div>';
						record.innerHTML+=html;
					}
				};
			}else alert("Not Support!");
		}
		window.onbeforeunload = function(){
			if(null!=websocket)
				websocket.close();
		};
		function send(){
			var input = document.getElementById("left_bottom");
			var mes={
				from:userName,
				to:toUser,
				content:input.innerHTML
			};
			if(null!=websocket)websocket.send(JSON.stringify(mes));
			var html = '<div class="mes from_me">'+input.innerHTML+' : '+userName+'</div>';
			document.getElementById("left_top").innerHTML+=html;
			input.innerHTML='';
		}
	</script>
</body>
</html>

 

 

ChatServlet 

 

package com.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

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;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

@ServerEndpoint("/chat")
public class ChatServlet {
	private String id;
    private static ConcurrentMap<String,ChatServlet>users = new ConcurrentHashMap<>(); 
    private Session session;
    
    private void sendMessage(String mes){
    	this.session.getAsyncRemote().sendText(mes);
    }
    
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        Map<String,List<String>>map = session.getRequestParameterMap();
        id = map.get("id").get(0);
        users.put(id, this);
        List<String>list =new ArrayList<>( users.keySet());
        Set<String>key = users.keySet();
    	for(String k: key){
    		users.get(k).sendMessage(JSONArray.fromObject(list).toString());
    	}
    }
    @OnClose
    public void onClose(){

        users.remove(id);
    }
     
    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
        //here is word filter
        JSONObject json = JSONObject.fromObject(message);
        Mes mes = (Mes)JSONObject.toBean(json,Mes.class);
        if(mes.getTo().isEmpty()){
        	Set<String>key = users.keySet();
        	for(String k: key){
        		if(k.equals(mes.from))continue;
        		users.get(k).sendMessage(message);
        	}
        }else{
        	ChatServlet toServlet = users.get(mes.getTo());
            if(null!=toServlet){
            	toServlet.sendMessage(message);
            }
        }
        
    }
     
    
    @OnError
    public void onError(Session session, Throwable error){
        error.printStackTrace();
    }
}

 

OK

 

测试浏览器: Chrome

服务器环境: java8+tomcat8

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是基于传统的Tomcat、Spring MVC和WebSocket的简单示例: 1. 首先,在pom.xml文件中添加以下依赖: ```xml <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.5.RELEASE</version> </dependency> <!-- WebSocket --> <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-websocket</artifactId> <version>9.0.30</version> </dependency> ``` 2. 接下来,创建一个WebSocket端点类,例如: ```java import javax.websocket.OnMessage; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/websocket") public class MyWebSocketEndpoint { @OnMessage public void onMessage(String message, Session session) { try { session.getBasicRemote().sendText("Received: " + message); } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个例子中,我们创建了一个名为`MyWebSocketEndpoint`的WebSocket端点,并将其映射到`/websocket`路径。`onMessage`方法用于处理接收到的消息并回传回去。 3. 然后,在Spring MVC控制器中,我们可以使用`WebSocketContainer`将WebSocket连接注入到请求处理方法中,例如: ```java import javax.servlet.http.HttpServletRequest; import javax.websocket.Session; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MyController { private WebSocketContainer webSocketContainer; public MyController(WebSocketContainer webSocketContainer) { this.webSocketContainer = webSocketContainer; } @RequestMapping(value = "/websocket-test", method = RequestMethod.GET) @ResponseBody public String testWebSocket(HttpServletRequest request) { try { Session session = webSocketContainer.connectToServer(MyWebSocketEndpoint.class, request.getRequestURI()); session.getBasicRemote().sendText("Test message"); session.close(); return "Message sent"; } catch (Exception e) { e.printStackTrace(); return "Error"; } } } ``` 在这个例子中,我们注入了一个名为`webSocketContainer`的`WebSocketContainer`,并在请求处理方法中使用它来创建WebSocket连接发送测试消息。 这就是一个简单的Tomcat、Spring MVC和WebSocket示例。它可以让你开始理解如何使用这些技术来开发WebSocket应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值