当前位置:   article > 正文

js+html+jquery 实现与websocket通信 多文件上传并且带进度条_jquery websocket.js

jquery websocket.js

一:成品演示:
在这里插入图片描述

二:话不多说,直接上代码。

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat Client</title>
    <meta charset="utf-8" />
    <style>
        .progress {
            width: 200px;
            height: 20px;
            background: #ddd;
            position: relative;
        }

        .info {
            width: 0px;
            height: 20px;
            background: #ec5710;
            position: absolute;
            left: 0;
            top: 0;
        }
    </style>
    <script type="text/javascript" src="../upload/jquery-1.6.4/jquery-1.6.4.min.js"></script>
    <script type="text/javascript" src="../upload/jquery.json-2.3/jquery.json-2.3.min.js"></script>
    <script type="text/javascript">
        $().ready(
            function () {
                // Check for the various File API support.
                if (window.File && window.FileReader && window.FileList
                    && window.Blob) {
                    // Great success! All the File APIs are supported.
                } else {
                    alert('The File APIs are not fully supported in this browser.');
                }
            });

        //在消息框中打印内容
        function log(text) {
            $("#log").append(text + "\n");
        }

        function readFile(file) {
            var oInfo = document.getElementById("info");
            var oRes = document.getElementById("result");
            var reader = new FileReader();
            //reader.readAsDataURL(file);
            reader.readAsArrayBuffer(file);
            reader.onprogress = function (e) {
                oInfo.style.width = e.loaded / e.total * 200 + "px";
                oRes.innerHTML = Math.round((e.loaded / e.total * 200) * 0.5) + "%";
            }
            reader.onload = function (e) {
                ws.send(file.name);
                log('发送' + file.name + '成功!');
                fileData = reader.result;
                //var binary = fileData.slice(0, 1000);
                //ws.send(binary);
                var date = [];
                var n = 1000;
                for (var i = 0, l = fileData.byteLength; i < l / n; i++) {
                    var a = fileData.slice(n * i, n * (i + 1));
                    date.push(a);
                }
                for (i = 0; i < date.length; i++) {
                    ws.send(date[i])
                }
            }
        }

        //全局的websocket变量
        var ws;
        var paragraph = 10485760;
        var fileList;
        var file;
        var startSize, endSize = 0;
        var i = 0; j = 0;
        var fileData;
        //连接服务器
        $(function () {
            $("#connect").click(function () {
                ws = new WebSocket($("#url").val());
                //连接成功建立后响应
                ws.onopen = function () {
                    log("成功连接到" + $("#url").val());
                }
                //收到服务器消息后响应
                ws.onmessage = function (e) {      
                    //连接关闭后响应
                    ws.onclose = function () {
                        log("关闭连接");
                        ws = null;
                    }
                    return false;
                }
            });
        });
        $(function () {
            $("#sendFileForm").click(function () {
                fileList = document.getElementById("file").files;
                if (fileList) {
                    for (i = 0; i < fileList.length; i++) {
                        readFile(fileList[i]);
                    }
                }
            })
        });
        $(function () {
            $("#reset").click(function () {
                $("#log").empty();
                return false;
            });
        });
    </script>
</head>

<body>
    <span>Html5功能测试</span><br />
    <input type="text" id="url" value="ws://localhost:9003" style="width: 200px;"> <input type="button" id="connect"
        value="Connect"><input type="button" id="disconnect" value="Disconnect" disabled="disabled">
    <form>
        <input id="file" type="file" multiple />
        <input type="button" id="sendFileForm" value="测试" />
        <input type="button" id="reset" value="清空消息框" />
        <div class="progress">
            <div class="info" id="info"></div>
        </div>
        <div id="result"></div>
    </form>
    <form>
        <textarea id="log" rows="30" cols="100" style="font-family: monospace; color: red;"></textarea>
    </form>
</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
  • 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

注:源码已上传github。
https://github.com/fulin-z/html-js-jquery

三:代码详解
主要思路:画出静态页面–>连接websocket服务器–>读取文件转二进制–>发送给websocket服务器
1.html标签画出静态页面

<body>
    <span>Html5功能测试</span><br />
    <input type="text" id="url" value="ws://localhost:9003" style="width: 200px;"> <input type="button" id="connect"
        value="Connect"><input type="button" id="disconnect" value="Disconnect" disabled="disabled">
    <form>
        <input id="file" type="file" multiple />
        <input type="button" id="sendFileForm" value="测试" />
        <input type="button" id="reset" value="清空消息框" />
        <!-- 下面两个div用于实现进度条-->
        <div class="progress">
            <div class="info" id="info"></div>
        </div>
        <div id="result"></div>
    </form>
    <form>
        <textarea id="log" rows="30" cols="100" style="font-family: monospace; color: red;"></textarea>
    </form>
</body>
<style>
        .progress {
            width: 200px;
            height: 20px;
            background: #ddd;
            position: relative;
        }

        .info {
            width: 0px;
            height: 20px;
            background: #ec5710;
            position: absolute;
            left: 0;
            top: 0;
        }
 </style>
  • 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

2.连接websocket服务器

var ws = new WebSocket(服务器地址);
  • 1

3.实现多文件上传

$(function () {
   $("#sendFileForm").click(function () {
       //获取所有文件
       fileList = document.getElementById("file").files;
       //循环发送
       if (fileList) {
          for (i = 0; i < fileList.length; i++) {
             readFile(fileList[i]);
          }
       }
   })
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4.文件发送

function readFile(file) {
    var oInfo = document.getElementById("info");
    var oRes = document.getElementById("result");
    var reader = new FileReader();
    reader.readAsArrayBuffer(file);
    reader.onprogress = function (e) { 
      //控制div的宽度,来实现进度条的效果
      oInfo.style.width = e.loaded / e.total * 200 + "px";
      oRes.innerHTML = Math.round((e.loaded / e.total * 200) * 0.5) + "%";
    }
    reader.onload = function (e) {
        ws.send(file.name);//send()方法发送文件名给服务器
        log('发送' + file.name + '成功!');
        fileData = reader.result;
            var date = [];
            var n = 1000;
            //将获取的二进制按1000等分,合并成数组
            //因为字节太长,后台接收不到
            for (var i = 0, l = fileData.byteLength; i < l / n; i++) {
               var a = fileData.slice(n * i, n * (i + 1));
                  date.push(a);
            }
            //将等分好的数组,循环发送给服务器
            for (i = 0; i < date.length; i++) {
                 ws.send(date[i])
            }
        }
 }
  • 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

前端不复杂,主要是后端处理数据。后端我就不展开记录了。

如果文章对你有用,不妨点个赞呗。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/1003937
推荐阅读
相关标签
  

闽ICP备14008679号