提交用例
This commit is contained in:
		
							
								
								
									
										56
									
								
								spring-boot/spring-boot-websocket/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								spring-boot/spring-boot-websocket/pom.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.springframework.boot</groupId>
 | 
			
		||||
        <artifactId>spring-boot-starter-parent</artifactId>
 | 
			
		||||
        <version>2.1.1.RELEASE</version>
 | 
			
		||||
        <relativePath/> <!-- lookup parent from repository -->
 | 
			
		||||
    </parent>
 | 
			
		||||
    <groupId>com.heibaiying</groupId>
 | 
			
		||||
    <artifactId>spring-boot-websocket</artifactId>
 | 
			
		||||
    <version>0.0.1-SNAPSHOT</version>
 | 
			
		||||
    <name>spring-boot-websocket</name>
 | 
			
		||||
    <description>Websocket project for Spring Boot</description>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
        <java.version>1.8</java.version>
 | 
			
		||||
    </properties>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-web</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-websocket</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-freemarker</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.projectlombok</groupId>
 | 
			
		||||
            <artifactId>lombok</artifactId>
 | 
			
		||||
            <optional>true</optional>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-test</artifactId>
 | 
			
		||||
            <scope>test</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
        <plugins>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                <artifactId>spring-boot-maven-plugin</artifactId>
 | 
			
		||||
            </plugin>
 | 
			
		||||
        </plugins>
 | 
			
		||||
    </build>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
package com.heibaiying.springboot;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
			
		||||
 | 
			
		||||
@SpringBootApplication
 | 
			
		||||
public class SpringBootWebsocketApplication {
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        SpringApplication.run(SpringBootWebsocketApplication.class, args);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package com.heibaiying.springboot.constant;
 | 
			
		||||
 | 
			
		||||
import javax.websocket.Session;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.concurrent.ConcurrentHashMap;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author : 罗祥
 | 
			
		||||
 * @description :
 | 
			
		||||
 * @date :create in 2018/12/27
 | 
			
		||||
 */
 | 
			
		||||
public interface Constant {
 | 
			
		||||
 | 
			
		||||
    String USER_NAME="username";
 | 
			
		||||
 | 
			
		||||
    Map<String, Session> nameAndSession = new ConcurrentHashMap<>();
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,28 @@
 | 
			
		||||
package com.heibaiying.springboot.controller;
 | 
			
		||||
 | 
			
		||||
import com.heibaiying.springboot.constant.Constant;
 | 
			
		||||
import org.springframework.stereotype.Controller;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.PostMapping;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpSession;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author : 罗祥
 | 
			
		||||
 * @description : 简单登录
 | 
			
		||||
 * @date :create in 2018/12/27
 | 
			
		||||
 */
 | 
			
		||||
@Controller
 | 
			
		||||
public class LoginController {
 | 
			
		||||
 | 
			
		||||
    @PostMapping("login")
 | 
			
		||||
    public String login(String username, HttpSession session) {
 | 
			
		||||
        session.setAttribute(Constant.USER_NAME, username);
 | 
			
		||||
        return "chat";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping
 | 
			
		||||
    public String index() {
 | 
			
		||||
        return "index";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,51 @@
 | 
			
		||||
package com.heibaiying.springboot.websocket;
 | 
			
		||||
 | 
			
		||||
import com.heibaiying.springboot.constant.Constant;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.UnsupportedEncodingException;
 | 
			
		||||
import java.net.URLDecoder;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author : heibaiying
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@ServerEndpoint(value = "/socket/{username}")
 | 
			
		||||
@Component
 | 
			
		||||
public class ChatSocket {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @OnOpen   //建立连接时候触发
 | 
			
		||||
    public void onOpen(Session session, @PathParam("username") String username) {
 | 
			
		||||
        // 这个方法是线程不安全的
 | 
			
		||||
        Constant.nameAndSession.putIfAbsent(username, session);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @OnClose  //关闭连接时候触发
 | 
			
		||||
    public void onClose(Session session, @PathParam("username") String username) {
 | 
			
		||||
        Constant.nameAndSession.remove(username);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @OnMessage //处理消息
 | 
			
		||||
    public void onMessage(Session session, String message, @PathParam("username") String username) throws UnsupportedEncodingException {
 | 
			
		||||
        // 防止中文乱码
 | 
			
		||||
        String msg = URLDecoder.decode(message, "utf-8");
 | 
			
		||||
        // 简单模拟群发消息
 | 
			
		||||
        Constant.nameAndSession.forEach((s, webSocketSession)
 | 
			
		||||
                -> {
 | 
			
		||||
            try {
 | 
			
		||||
                webSocketSession.getBasicRemote().sendText(username + " : " + msg);
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package com.heibaiying.springboot.websocket;
 | 
			
		||||
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author : heibaiying
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
public class WebSocketConfig {
 | 
			
		||||
 | 
			
		||||
    @Bean
 | 
			
		||||
    public ServerEndpointExporter serverEndpointExporter() {
 | 
			
		||||
        return new ServerEndpointExporter();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <title>${Session["username"]}您好!欢迎进入群聊大厅!</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <h5>${Session["username"]}您好!欢迎进入群聊大厅!</h5>
 | 
			
		||||
    <input id="message" type="text">
 | 
			
		||||
    <button id="btn">发送消息</button>
 | 
			
		||||
    <div id="show">
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
<script>
 | 
			
		||||
    let btn = document.getElementById("btn");
 | 
			
		||||
    let message = document.getElementById("message");
 | 
			
		||||
    let show = document.getElementById("show");
 | 
			
		||||
    let ws = new WebSocket("ws://localhost:8080/socket/${Session["username"]}");
 | 
			
		||||
    ws.onmessage = function (evt) {
 | 
			
		||||
        let node = document.createElement("div");
 | 
			
		||||
        node.innerHTML = "<h5>" + evt.data + "</h5>";
 | 
			
		||||
        show.appendChild(node);
 | 
			
		||||
    };
 | 
			
		||||
    btn.addEventListener("click", function () {
 | 
			
		||||
        let data = message.value;
 | 
			
		||||
        console.log(data);
 | 
			
		||||
        if (data) {
 | 
			
		||||
            ws.send(encodeURI(data));
 | 
			
		||||
        } else {
 | 
			
		||||
            alert("请输入消息后发送");
 | 
			
		||||
        }
 | 
			
		||||
        message.value = "";
 | 
			
		||||
    });
 | 
			
		||||
    // 关闭页面时候关闭ws
 | 
			
		||||
    window.addEventListener("beforeunload", function (event) {
 | 
			
		||||
        ws.close();
 | 
			
		||||
    });
 | 
			
		||||
</script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <title>Title</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<form action="/login" method="post">
 | 
			
		||||
    <input name="username" type="text">
 | 
			
		||||
    <button id="btn">输入临时用户名后登录!</button>
 | 
			
		||||
</form>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package com.heibaiying.springboot;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.springframework.boot.test.context.SpringBootTest;
 | 
			
		||||
import org.springframework.test.context.junit4.SpringRunner;
 | 
			
		||||
 | 
			
		||||
@RunWith(SpringRunner.class)
 | 
			
		||||
@SpringBootTest
 | 
			
		||||
public class SpringBootWebsocketApplicationTests {
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void contextLoads() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user