9.websocket简单实例
9.1添加jar:
<!-- 使用spring websocket依赖的jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${org.springframework-version}</version>
</dependency>
9.2配置:继承 WebSocketConfigurer
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
//指定拦截路径和处理消息类
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler(), "/websocket/queryOrder");
}
//自定义的处理消息类
@Bean
public TextWebSocketHandler webSocketHandler(){
return new SpringWebSocketHandler();
}
}
9.3处理消息类,只是简单的把发送过来的数据做处理,其他方法可自行添加实现
public class SpringWebSocketHandler extends TextWebSocketHandler {
private static final Logger logger = LoggerFactory.getLogger(SpringWebSocketHandler.class);
@Autowired
private TestService testService;
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
logger.info("Received message: " + message.getPayload());
String payload = message.getPayload();
Query query = ParseJson.parseObject(payload,Query.class);
Result<TestResult> result = testService.queryOrder(query );
session.sendMessage(new TextMessage(ParseJson.toJSONString(result)));
}
}
9.4前端发送消息时需转为json
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title></title>
<!--
<link rel="stylesheet" href="/css/style.css"/>
-->
<script src="${pageContext.request.contextPath}/api/resources/js/jquery-2.0.3.js"></script>
<script type="text/javascript">
var websocket = new WebSocket("ws://localhost:8080/api/websocket/queryOrder");
websocket.onopen = onOpen;
websocket.onmessage = onMessage;
websocket.onerror = onError;
websocket.onclose = onClose;
function onOpen(openEvt) {
alert(openEvt.Data);
}
function onMessage(evt) {
alert(evt.data);
}
function onError() {}
function onClose() {}
function doSendUser() {
if (websocket.readyState == websocket.OPEN) {
//var msg = document.getElementById("inputMsg").value;
var query = '{"name":"3333","code":"12333"}';
var str = JSON.stringify(query);
websocket.send(str);//调用后台handleTextMessage方法
alert("发送成功!");
} else {
alert("连接失败!");
}
}
function doSendUsers() {
if (websocket.readyState == websocket.OPEN) {
var msg = document.getElementById("inputMsg").value;
websocket.send("#everyone#"+msg);//调用后台handleTextMessage方法
alert("发送成功!");
} else {
alert("连接失败!");
}
}
window.close=function()
{
websocket.onclose();
}
</script>
</head>
<body>
请输入:<textarea rows="5" cols="10" id="inputMsg" name="inputMsg"></textarea>
<button onclick="doSendUser();">发送</button>
<button onclick="doSendUsers();">群发</button>
</body>
</html>
9.5如果有nginx代理,需添加
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
10.cxf 开发webservice
10.1jar
<!-- 添加CXF 依赖 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
10.2.web.xml添加
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
10.3.配置文件,spring-cxf.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!--其中id是自己定义的,implementor是接口实现类,address就是访问的地址 -->
<!-- 相当于Endpoint.publish("http://localhost:8080/service", newHelloServiceImp()); -->
<jaxws:endpoint id="helloService" implementor="com.xx.service.impl.HelloServiceImp" address="/hello"/>
</beans>
10.4接口及其实现类
import javax.jws.WebService;
/**
*/
@WebService
public interface HelloService {
public String sayHello(String name);
}
public class HelloServiceImp implements HelloService {
@Override
public String sayHello(String name) {
return "大家好,我是"+name;
}
}
10.5访问:http://localhost:8081/webservice/hello成功,则webservice搭建成功
10.6生成客户端java文件
wsimport -s D:\\test\\TheClient\\src -p com.ws.client -keep http://localhost:8081/webservice/hello?wsdl
--如果上面命令不能识别则手动设置下java环境
set java_home=C:\Program Files\Java\jdk1.8.0_111
set classpath=%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
set path=%JAVA_HOME%\bin
10.7拷贝到客户端,调取使用
发送数据
public class Test {
public static void main(String[] args) {
HelloService service=new HelloServiceImpService().getHelloServiceImpPort();
System.out.println(service.sayHello("CXF111"));
}
}
10.6.1 根据接口信息, 创建客户端接口HelloService用JaxWsProxyFactoryBean直接调用
String url = "http://localhost:8081/webservice/hello";
//创建工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//对工厂对象附加属性,服务端地址,客户端接口
factory.setServiceClass(HelloService.class);
factory.setAddress(url);
//通过工厂方法创建具体实现的实例,也就是上面定义的接口
HelloService service = (HelloService) factory.create();
String result = service.sayHello("1222");