Java实现WebSocket
来源:互联网 发布:打骚扰电话软件 编辑:程序博客网 时间:2024/06/13 15:33
改良了网上的一些代码,整理后代码地址:
GitHub
1.服务端代码:
package web.servlet;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.util.ArrayList;import java.util.List;import javax.servlet.http.HttpServletRequest;import org.apache.catalina.websocket.MessageInbound;import org.apache.catalina.websocket.StreamInbound;import org.apache.catalina.websocket.WebSocketServlet;import org.apache.catalina.websocket.WsOutbound;public class SocketServlet extends WebSocketServlet { private static final long serialVersionUID = -4853540828121130946L; private static List<MyMessageInbound> mmiList = new ArrayList<MyMessageInbound>(); @Override protected StreamInbound createWebSocketInbound(String str, HttpServletRequest request) { return new MyMessageInbound(); } private class MyMessageInbound extends MessageInbound { WsOutbound myoutbound; @Override public void onOpen(WsOutbound outbound) { try { System.out.println("Open Client."); this.myoutbound = outbound; mmiList.add(this); outbound.writeTextMessage(CharBuffer.wrap("Hello!")); } catch (IOException e) { e.printStackTrace(); } } @Override public void onClose(int status) { System.out.println("Close Client."); mmiList.remove(this); } @Override public void onTextMessage(CharBuffer cb) throws IOException { System.out.println("Accept Message : " + cb); for (MyMessageInbound mmib : mmiList) { CharBuffer buffer = CharBuffer.wrap(cb); mmib.myoutbound.writeTextMessage(buffer); mmib.myoutbound.flush(); } } @Override public void onBinaryMessage(ByteBuffer bb) throws IOException { } }}
2.客户端代码:
package web.servlet;import java.awt.Container;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.net.URI;import java.net.URISyntaxException;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import org.java_websocket.WebSocketImpl;import org.java_websocket.client.WebSocketClient;import org.java_websocket.drafts.Draft;import org.java_websocket.drafts.Draft_10;import org.java_websocket.drafts.Draft_17;import org.java_websocket.drafts.Draft_75;import org.java_websocket.drafts.Draft_76;import org.java_websocket.handshake.ServerHandshake;public class Client extends JFrame implements ActionListener { private static final long serialVersionUID = -6056260699202978657L; private final JTextField uriField; private final JButton connect; private final JButton close; private final JTextArea ta; private final JTextField chatField; @SuppressWarnings("rawtypes") private final JComboBox draft; private WebSocketClient cc; @SuppressWarnings({ "unchecked", "rawtypes" }) public Client(String defaultlocation) { super("WebSocket Chat Client"); Container c = getContentPane(); GridLayout layout = new GridLayout(); layout.setColumns(1); layout.setRows(6); c.setLayout(layout); Draft[] drafts = { new Draft_17(), new Draft_10(), new Draft_76(), new Draft_75() }; draft = new JComboBox(drafts); c.add(draft); uriField = new JTextField(); uriField.setText(defaultlocation); c.add(uriField); connect = new JButton("Connect"); connect.addActionListener(this); c.add(connect); close = new JButton("Close"); close.addActionListener(this); close.setEnabled(false); c.add(close); JScrollPane scroll = new JScrollPane(); ta = new JTextArea(); scroll.setViewportView(ta); c.add(scroll); chatField = new JTextField(); chatField.setText(""); chatField.addActionListener(this); c.add(chatField); java.awt.Dimension d = new java.awt.Dimension(300, 400); setPreferredSize(d); setSize(d); addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if (cc != null) { cc.close(); } dispose(); } }); setLocationRelativeTo(null); setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getSource() == chatField) { if (cc != null) { cc.send(chatField.getText()); chatField.setText(""); chatField.requestFocus(); } } else if (e.getSource() == connect) { try { cc = new WebSocketClient(new URI(uriField.getText()), (Draft) draft.getSelectedItem()) { @Override public void onMessage(String message) { ta.append("got: " + message + "\n"); ta.setCaretPosition(ta.getDocument().getLength()); } @Override public void onOpen(ServerHandshake handshake) { ta.append("You are connected to ChatServer: " + getURI() + "\n"); ta.setCaretPosition(ta.getDocument().getLength()); } @Override public void onClose(int code, String reason, boolean remote) { ta.append("You have been disconnected from: " + getURI() + "; Code: " + code + " " + reason + "\n"); ta.setCaretPosition(ta.getDocument().getLength()); connect.setEnabled(true); uriField.setEditable(true); draft.setEditable(true); close.setEnabled(false); } @Override public void onError(Exception ex) { ta.append("Exception occured ...\n" + ex + "\n"); ta.setCaretPosition(ta.getDocument().getLength()); ex.printStackTrace(); connect.setEnabled(true); uriField.setEditable(true); draft.setEditable(true); close.setEnabled(false); } }; close.setEnabled(true); connect.setEnabled(false); uriField.setEditable(false); draft.setEditable(false); cc.connect(); } catch (URISyntaxException ex) { ta.append(uriField.getText() + " is not a valid WebSocket URI\n"); } } else if (e.getSource() == close) { cc.close(); } } public static void main(String[] args) { WebSocketImpl.DEBUG = true; String location; if (args.length != 0) { location = args[0]; System.out.println("Default server url specified: \'" + location + "\'"); } else { location = "ws://localhost:9002/wsServlet"; System.out.println("Default server url not specified: defaulting to \'" + location + "\'"); } new Client(location); }}
3.servlet配置:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>web</display-name> <servlet> <servlet-name>wsServlet</servlet-name> <servlet-class>web.servlet.SocketServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>wsServlet</servlet-name> <url-pattern>/wsServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- 设置session时长 --> <session-config> <session-timeout>60</session-timeout> </session-config> <!-- 首页 --> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list></web-app>
4.html测试代码:
<!DOCTYPE html><html><head><meta charset="utf-8" /><meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><title>WebSocket Test</title><script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script></head><body> <h3 id="test"></h3> <script> // 打开Socket(支持浏览器的原生socket方法) var socket = new WebSocket('ws://localhost:9002/wsServlet'); socket.onopen = function(event) { socket.send('I am the client and I\'m listening!'); socket.onmessage = function(event) { console.log('Client received a message', event.data); $('#test').append( 'Client received a message' + event.data + '</br>'); }; socket.onclose = function(event) { console.log('Client notified socket has closed', event.data); $('#test').append( 'Client notified socket has closed' + event.data + '</br>'); }; socket.send('I am Hello!'); } </script></body></html>
阅读全文
0 0
- Java实现WebSocket聊天
- Java实现WebSocket
- WebSocket的java实现
- Java实现websocket
- java简单实现websocket
- java websocket 实现
- webSocket入门java实现
- 《java websocket》之 实现
- JAVA实现websocket
- websocket的Java实现
- Java实现WebSocket
- Java WebSocket服务端实现
- Java WebSocket客户端实现
- Java实现WebSocket
- java实现websocket
- java WebSocket的实现以及Spring WebSocket
- java实现WebSocket即时通信
- WebSocket Java学习与实现
- [NOIP模拟]路径
- C#冒泡排序的实现
- Spring 框架简介
- 运算放大器的调试经验
- SSH整合之用户登录(全注解)
- Java实现WebSocket
- Hadoop好友推荐系统-寻找最佳DC
- 简单实现贪吃蛇玩法(非智能版还没那水平)
- 获取请求IP地址--一则code review的故事
- 完整页面登录
- redis
- Java动态创建JButton并添加对应监听响应
- struts2文件上传
- 事件类型--焦点事件