java websocket 实现
2016-09-17 12:13
246 查看
环境:jdk1.8 + Tomcat 8
IDE:IntelliJ IDEA 2016.2.4
![](https://img-blog.csdn.net/20160917114202228?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
WebSocket.java
main方法是后面测试用的,等会会提到。
WebSocketPool.java
http://www.blue-zero.com/websocket/
作者: 手插口袋_
链接:http://www.imooc.com/article/12401
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!
跑main方法,看看是否能正常启动(看控制台很清楚的),然后打开http://www.blue-zero.com/websocket/
如下图所示
![](http://img.mukewang.com/57b595dd000107a906910423.png)
http://www.blue-zero.com/websocket/
作者: 手插口袋_
链接:http://www.imooc.com/article/12401
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!
(我以后也要写一个类似的!!!!)
Web.xml
startFilter .java
TestServlet .java
index .jsp
websocket .js
应该没剩下了,可以直接跑了。至于最后的显示效果, 我就不放出来了,自己去玩吧,有些方法都写好了,可以去实现跟过可能高级一点的功能。
有什么问题在下面提出来吧
资料参考:慕课网
IDE:IntelliJ IDEA 2016.2.4
WebSocket.java
package websocket; import org.java_websocket.WebSocketImpl; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; import java.net.InetSocketAddress; import java.net.UnknownHostException; /** * Created by Administrator on 2016/9/13. */ public class WebSocket extends WebSocketServer { int j=0; int h=0; int e=0; int l=0; public WebSocket(InetSocketAddress address) { super(address); System.out.println("地址" + address); } public WebSocket(int port) throws UnknownHostException { super(new InetSocketAddress(port)); System.out.println("端口" + port); } /** * 触发连接事件 * @param conn * @param handshake */ @Override public void onOpen(org.java_websocket.WebSocket conn, ClientHandshake handshake) { System.out.println("有人连接Socket conn:" + conn); l++; } /** * 触发关闭事件 * @param conn * @param message * @param reason * @param remote */ @Override public void onClose(org.java_websocket.WebSocket conn, int message, String reason, boolean remote) { userLeave(conn); } /** * 客户端发送消息到服务器是触发事件 * @param conn * @param message */ @Override public void onMessage(org.java_websocket.WebSocket conn, String message) { if(message != null) { //将用户加入 this.userJoin(message, conn); } } /** * 触发异常事件 * @param conn * @param message */ @Override public void onError(org.java_websocket.WebSocket conn, Exception message) { System.out.println("Socket异常:" + message.toString()); e++; } /** * 用户下线处理 * @param conn */ public void userLeave(org.java_websocket.WebSocket conn) { String user = WebSocketPool.getUserByKey(conn); boolean b = WebSocketPool.removeUser(conn); // 在连接池中移除连接 if (b) { WebSocketPool.sendMessage(user); // 把当前用户从所有在线用户列表中删除 String leaveMsg = "[系统]" + user + "下线了"; WebSocketPool.sendMessage(leaveMsg); // 向在线用户发送当前用户退出的信息 } } public void userJoin(String user, org.java_websocket.WebSocket conn) { WebSocketPool.sendMessage(user); // 把当前用户加入到所有在线用户列表中 String joinMsg = "[系统]" + user + "上线了!"; WebSocketPool.sendMessage(joinMsg); // 向所有在线用户推送当前用户上线的消息 WebSocketPool.addUser(user, conn); // 向连接池添加当前的连接的对象 WebSocketPool.sendMessageToUser(conn, WebSocketPool.getOnlineUser().toString()); // 向当前连接发送当前在线用户的列表 } public static void main(String[] args) throws InterruptedException{ // System.out.println("开始启动webSocket"); // WebSocketImpl.DEBUG = false; // int port = 8888; // 端口随便设置,只要不跟现有端口重复就可以了 // WebSocket s =null; // try { // s = new WebSocket(port); // s.start(); // } catch (UnknownHostException e1) { // System.out.println("启动webSocket失败!"); // e1.printStackTrace(); // } // System.out.println("启动webSocket成功!"); } }socket主要函数
main方法是后面测试用的,等会会提到。
WebSocketPool.java
package websocket; import java.util.*; import org.java_websocket.WebSocket; /** * Created by Administrator on 2016/9/13. */ public class WebSocketPool { private static final Map<WebSocket, String> userconnections = new HashMap<WebSocket, String>(); /** * 获取用户名 * @param conn * @return */ public static String getUserByKey(WebSocket conn) { return userconnections.get(conn); } /** * 获取在线总数 * @return */ public static int getUserCount() { return userconnections.size(); } /** * 获取WebSocket * @param user * @return */ public static WebSocket getWebSocketByUser(String user) { Set<WebSocket> keySet = userconnections.keySet(); synchronized (keySet) { for (WebSocket conn : keySet) { String cuser = userconnections.get(conn); if (cuser.equals(user)) { return conn; } } } return null; } /** * 向连接池中添加连接 * @param user * @param conn */ public static void addUser(String user, WebSocket conn) { userconnections.put(conn, user); // 添加连接 } /** * 获取所有的在线用户 * @return */ public static Collection<String> getOnlineUser() { List<String> setUsers = new ArrayList<String>(); Collection<String> setUser = userconnections.values(); for (String u: setUser) { setUsers.add(u); } return setUsers; } /** * 移除连接池中的连接 * @param conn * @return */ public static boolean removeUser(WebSocket conn) { if (userconnections.containsKey(conn)) { userconnections.remove(conn); // 移除连接 return true; } else return false; } /** * 向特定的用户发送数据 * @param conn * @param message */ public static void sendMessageToUser(WebSocket conn, String message) { if (null != conn) { conn.send(message); } } public static void sendMessage(String message) { Set<WebSocket> keySet = userconnections.keySet(); synchronized (keySet) { for (WebSocket conn : keySet) { String user = userconnections.get(conn); if (user != null) { conn.send(message); } } } } }连接池相关函数
http://www.blue-zero.com/websocket/
作者: 手插口袋_
链接:http://www.imooc.com/article/12401
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!
跑main方法,看看是否能正常启动(看控制台很清楚的),然后打开http://www.blue-zero.com/websocket/
如下图所示
![](http://img.mukewang.com/57b595dd000107a906910423.png)
http://www.blue-zero.com/websocket/
作者: 手插口袋_
链接:http://www.imooc.com/article/12401
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!
(我以后也要写一个类似的!!!!)
Web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name></display-name> <filter> <filter-name>startFilter</filter-name> <filter-class>filter.startFilter</filter-class> </filter> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>servlet.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/TestServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>好像少了什么东西,但是不影响结果
startFilter .java
package filter; import java.io.IOException; import java.net.UnknownHostException; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import org.java_websocket.WebSocketImpl; import websocket.WebSocket; /** * Created by Administrator on 2016/9/13. */ public class startFilter implements Filter { public void destroy() { } public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException { chain.doFilter(req, resp); } /** * 初始化 * @param fc * @throws ServletException */ public void init(FilterConfig fc) throws ServletException { this.starWebSocketOnline(); } /** * 启动socket服务 */ public void starWebSocketOnline() { System.out.println("开始启动webSocket"); WebSocketImpl.DEBUG = false; int port = 8888; WebSocket s = null; try { s = new WebSocket(port); s.start(); } catch (UnknownHostException e) { System.out.println("启动webSocket失败!"); e.printStackTrace(); } System.out.println("启动webSocket成功!"); } }过滤器启动socket服务,这里实质跟main方法差不多
TestServlet .java
package servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created by Administrator on 2016/9/14. */ public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doPost(req, resp); System.out.println("content" + req.getParameter("content")); req.getSession().setAttribute("content", req.getParameter("content")); req.getRequestDispatcher("index.jsp").forward(req, resp); } }一个很简单的servlet
index .jsp
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2016/9/13 Time: 10:35 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.util.*" %> <% String path = request.getContextPath(); String basepath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <html> <head> <base href="<%=basepath%>"> <title>sunnylinner的WebSocket</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <script src="js/websocket.js"></script> </head> <body> <input type="hidden" value="${content}" id="content"> <form action="TestServlet" method="post"> content: <input type="text" name="content"> <button type="submit">登陆</button> </form> <span id="span"> </span> <span id="span1"> </span> </body> </html>
websocket .js
/** * Created by Administrator on 2016/9/14. */ var ws = new WebSocket("ws://127.0.0.1:8888"); ws.onopen = function () { // 当websocket创建成功,即会触发onopen事件 var content = document.getElementById("content").value; if (content == null && content == ""){ ws.send("sunnylinner"); // 用于将消息发送到服务端 document.getElementById("span1").innerHTML="1@@1"; } else { ws.send(content); document.getElementById("span1").innerHTML="2@@2"; } }; ws.onmessage = function (evt) { // 当客户端收到服务端发送来的消息时,会触发onmessage事件,参数evt.data中包含server传输过来的数据 document.getElementById("span1").innerHTML="3@@3"; document.getElementById("span").innerHTML="当前在线人数为:" + evt.data; }; ws.onclose = function () { // 当客户端收到服务端发送的关闭连接的请求时,触发onclose事件 alert("WebSocketClosed!"); }; ws.onerror = function () { // 如果出现连接,处理,接收,发送数据失败的时候就会触发onerror事件 alert("WebSocketError!"); }
应该没剩下了,可以直接跑了。至于最后的显示效果, 我就不放出来了,自己去玩吧,有些方法都写好了,可以去实现跟过可能高级一点的功能。
有什么问题在下面提出来吧
资料参考:慕课网
相关文章推荐
- java WebSocket的实现以及Spring WebSocket示例代码
- java WebSocket的实现以及Spring WebSocket
- Java WebSocket实现网络聊天室(群聊+私聊)
- 使用java websocket简单实现即时聊天
- java websocket原理及其简易实现
- Java WebSocket的Tomcat实现(JSR-356)
- 基于java webRct webSocket 实现点对点视频 (需要代码的朋友) 扫码加我微信
- java WebSocket的实现以及Spring WebSocket
- Html5,Java WebSocket简单实现
- 2、Java WebSocket实现服务端主动发消息给客户端
- 详解java WebSocket的实现以及Spring WebSocket
- JAVA Websocket实现扫码二维码登录---GoEasy
- 使用java websocket简单实现即时聊天
- java WebSocket在Tomcat容器的实现
- 使用Jetty搭建Java Websocket Server,实现图像传输
- Java WebSocket服务端实现
- java websocket网页端客户端实现
- java websocket实现简单的即时通讯 消息推送
- Java Websocket实例【服务端与客户端实现全双工通讯】
- Html5,Java WebSocket简单实现