当前位置:   article > 正文

Java实现WebSocket_java原生websocket的源码

java原生websocket的源码

改良了网上的一些代码,整理后代码地址:
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 {
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/249123
推荐阅读
相关标签
  

闽ICP备14008679号