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

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

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

<!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>

注:源码已上传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>

2.连接websocket服务器

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

3.实现多文件上传

$(function () {
   $("#sendFileForm").click(function () {
       //获取所有文件
       fileList = document.getElementById("file").files;
       //循环发送
       if (fileList) {
          for (i = 0; i < fileList.length; i++) {
             readFile(fileList[i]);
          }
       }
   })
});

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])
            }
        }
 }

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

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是一个简单的多人聊天对话框的前端页面示例,使用Spring Boot作为后端框架,Thymeleaf作为模板引擎,jQuery作为前端框架,不使用WebSocketHTML部分: ```html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>多人聊天室</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script th:src="@{/js/chat.js}"></script> <link rel="stylesheet" th:href="@{/css/chat.css}" /> </head> <body> <div class="chat-container"> <div class="chat-header"> <h1>多人聊天室</h1> </div> <div class="chat-body"> <div class="chat-messages"> <ul id="messages"></ul> </div> <div class="chat-input"> <input id="message" type="text" placeholder="输入消息..."> <button id="send-btn">发送</button> </div> </div> </div> </body> </html> ``` CSS部分: ```css .chat-container { display: flex; flex-direction: column; height: 100vh; width: 100vw; } .chat-header { text-align: center; font-size: 24px; padding: 10px; } .chat-body { display: flex; flex-direction: column; flex: 1; overflow-y: scroll; padding: 10px; } .chat-messages { flex: 1; overflow-y: scroll; } .chat-messages li { margin-bottom: 10px; } .chat-input { display: flex; margin-top: 10px; } .chat-input input { flex: 1; margin-right: 10px; } .chat-input button { padding: 5px 10px; border: none; background-color: #007bff; color: #fff; cursor: pointer; } .chat-input button:hover { background-color: #0069d9; } ``` JavaScript部分: ```javascript $(function() { var username = prompt("请输入您的昵称:"); var socket = new WebSocket("ws://" + location.host + "/chat"); socket.onopen = function() { socket.send(JSON.stringify({ type: "join", username: username })); }; socket.onmessage = function(event) { var message = JSON.parse(event.data); handleMessage(message); }; $("#send-btn").click(function() { var message = $("#message").val(); if (message.trim() != "") { socket.send(JSON.stringify({ type: "message", username: username, message: message })); $("#message").val(""); } }); function handleMessage(message) { if (message.type == "message") { var msgElement = $("<li>").text(message.username + ": " + message.message); $("#messages").append(msgElement); $(".chat-body").scrollTop($(".chat-body")[0].scrollHeight); } else if (message.type == "join") { var joinElement = $("<li class='join-msg'>").text(message.username + " 加入了聊天室"); $("#messages").append(joinElement); $(".chat-body").scrollTop($(".chat-body")[0].scrollHeight); } else if (message.type == "leave") { var leaveElement = $("<li class='leave-msg'>").text(message.username + " 离开了聊天室"); $("#messages").append(leaveElement); $(".chat-body").scrollTop($(".chat-body")[0].scrollHeight); } } }); ``` 以上代码实现了一个简单的多人聊天室的前端页面,使用Thymeleaf作为模板引擎,jQuery作为前端框架,不使用WebSocket。后端代码需要实现一个WebSocket处理器来处理WebSocket连接和消息的收发。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个喜欢弹吉他的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值