在websocket中操作数据库,需要加载已经配置好的spring中的配置文件,获取service层对象。在搭建好websocket条件下以下几种方法可实现
第一种,通过ContextLoader获取
SharedFarmUsersManager sharedFarmUsersManager = (SharedFarmUsersManager) ContextLoader.getCurrentWebApplicationContext().getBean("sfum")
第二种,通过加载整个配置文件,加载完之后再获取been,这种性能较差,不建议使用
ClassPathXmlApplicationContext cc = new ClassPathXmlApplicationContext(new String[] {"applicationContext-common.xml"});
SharedFarmUsersManagerImpl bean1 = (SharedFarmUsersManagerImpl) cc.getBean("sharedFarmUsersManagerImpl");
第三种,通过Configurator获取httpsession,通过httpsession可获取service
第一步编写一个继承Configurator的类
import javax.servlet.http.HttpSession;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import javax.websocket.server.ServerEndpointConfig.Configurator;
public class GetHttpSessionConfigurator extends Configurator{
@Override
public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
HttpSession httpSession = (HttpSession) request.getHttpSession();
if(httpSession != null){
config.getUserProperties().put(HttpSession.class.getName(), httpSession);
第二步编写@ServerEndpoint,并在onOpen 方法中获取service
import java.io.IOException
import java.io.PrintWriter
import java.util.ArrayList
import java.util.Date
import java.util.HashMap
import java.util.List
import java.util.Map
import java.util.Set
import java.util.concurrent.atomic.AtomicInteger
import javax.annotation.Resource
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import javax.servlet.http.HttpSession
import javax.websocket.EndpointConfig
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 org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
import org.apache.struts2.ServletActionContext
import org.directwebremoting.json.JsonUtil
import org.directwebremoting.json.parse.JsonParseException
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.context.ApplicationContext
import org.springframework.context.support.ClassPathXmlApplicationContext
import org.springframework.context.support.FileSystemXmlApplicationContext
import org.springframework.web.context.ContextLoader
import org.springframework.web.context.support.WebApplicationContextUtils
import com.alibaba.fastjson.JSON
import com.nmfz.app.action.SharedFarmUsers
import com.nmfz.app.manager.SharedFarmUsersManager
import com.nmfz.app.manager.impl.SharedFarmUsersManagerImpl
import net.sf.json.JSONObject
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端。注解的值将被用于监听用户连接的终端访问URL地址。
* configurator:通过GetHttpSessionConfigurator可以在onOpen方法中取得HttpSession,然后通过HttpSession的ServletContext容器可以取得spring的service,实现在websocket中变相注入spring bean。
* @author zho
@ServerEndpoint(value = "/websocket/chat",configurator=GetHttpSessionConfigurator.class)
public class MyWebSocket{
// private static final Log log = LogFactory.getLog(ChatAnnotation.class)
// private WebSocketService webSocketService
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private final static AtomicInteger onlineCount = new AtomicInteger(0)
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
// private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>()
private static List<MyWebSocket> clients = new ArrayList<>()
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session
private HttpSession httpSession
// ngs static int userid
@OnOpen
public void onOpen(Session session, EndpointConfig config) throws IOException, InterruptedException {
System.out.println("Open!")
this.session = session
this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName())
if(httpSession != null){
ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(httpSession.getServletContext())
SharedFarmUsersManager sharedFarmUsersManager = (SharedFarmUsersManager) ctx.getBean("sfum")
List<?> list = sharedFarmUsersManager.selectListBySql("select name from f_yh where id=1", null)
System.out.println(list)
clients.add(this)
// addOnlineCount()
MyWebSocket.onlineCount.incrementAndGet()
// String message = "登录成功"
// broadcast(message)
sendLatestNews()
第三步,由于HTTP协议与websocket协议的不同,导致没法直接从websocket中获取协议,放出去执行,会报空指针值异常,因为这个HttpSession并没有设置进去。而设置HttpSession。需要写一个继承ServletRequestListener的监听器。
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
* 作用:将所有request请求都携带上httpSession
* @author zho
@WebListener
@Component
public class RequestListener implements ServletRequestListener {
public void requestInitialized(ServletRequestEvent sre) {
((HttpServletRequest) sre.getServletRequest()).getSession();
public RequestListener() {
public void requestDestroyed(ServletRequestEvent arg0) {
WebSocket获取service层对象,操作数据库,WebSocke在websocket中操作数据库,需要加载已经配置好的spring中的配置文件,获取service层对象。在搭建好websocket条件下以下几种方法可实现 第一种,通过ContextLoader获取
这几天研究了下php实现webSocket的方法,网上查了不少博文,涉及到的知识点不少。但却非常值得学,因为这方面典型的应用场景非常的多,消息推送,聊天室,所有需要长连接的地方都会用到它。
当然可能有人会说有Workerman的框架,不用自己实现它,从工作角度来看,没错。
但是,框架封装的东西屏蔽了原生的实现方法,看着是简单,但利于工作却并不...
websocket一般用途为消息提醒,股票行情数据推送等等,有很多用途。
我们这里简单举例理解websocket和如何前后端接入websocket;
使用网络抓包分析软件。主要是截取网络封包,并尽可能显示出最为详细的网络封包资料。
2、TCP三次握手
TCP建立连接时,会有三次握手过程。下图是截获到的三次握手的三个数据包(虽然叫数据包,但是三次握手包是没有数据的)
SYN:同步比特,建立连接;
ACK:确认比特,置1表示这是一个确认的TCP包,0则不是;
PSH:推送比特,当发送端PSH=1时,
偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对websocket的认识深刻有木有。所以转到我博客里,分享一下。比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗,纯粹为分享。废话这么多了,最后再赞一个~
一、websocket与http
WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)
首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,...
Service.... service = (Service....) ContextLoader.getCurrentWebApplicationContext().getBean(Service.....class);
ContextLoader.ge...
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.5</version>
</dependency>
查找后记录下使用方法: 创建公共Utils 类 ApplicationContextRegister @Component
@Lazy(false)
public class ApplicationContextRegister implements ApplicationContextAware {
private static ApplicationContext APPLI...