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>
原创粉丝点击