java發送chunk包的簡單介紹

本文目錄一覽:

java 大文件上傳時 後台拋出了一個異常 java.io.IOException: Invalid chunk 求解決

盡量延長超時的時間 、、、、、、、一般這麼大的文件,要分段上傳的了

~~~~~~~~

java服務器如何對zip文件分包上傳?

這個你是用什麼客戶端上傳呢?

java寫的客戶端和H5頁面都可以做這個操作,思路都是一樣的。

把文件切割再上傳,後台接受結束後再把文件合併。

在DB里做個記錄就是斷點續傳了嘛。

給點代碼提示:

js:

每次上傳2M,必須是支持H5的瀏覽器才行,兼容的問題需要注意!

function calculate(file,callBack){

    var fileReader = new FileReader(),    

        blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice,    

        chunkSize = 2097152,    

        // read in chunks of 2MB

        chunks = Math.ceil(file.size / chunkSize),    

        currentChunk = 0,    

        spark = new SparkMD5();    

    

    fileReader.onload = function(e) {    

        spark.appendBinary(e.target.result); // append binary string

        currentChunk++;    

    

        if (currentChunk  chunks) {    

            loadNext();    

        }    

        else {    

            callBack(spark.end());  

        }    

    };    

    

    function loadNext() {    

        var start = currentChunk * chunkSize,    

            end = start + chunkSize = file.size ? file.size : start + chunkSize;    

    

        fileReader.readAsBinaryString(blobSlice.call(file, start, end));    

    };    

    

    loadNext();    

}

java代碼沒什麼注釋,也不是全部的代碼看個大概意思,理解一下吧

根據文件的MD5碼來判斷每次上傳的文件是不是上傳過的。

如果是就找到上次的點告訴前台從哪開始上傳。

Message message = new Message();

PrintWriter out = response.getWriter();

ServiceBreakpointUpload service = new ServiceBreakpointUpload();

BreakpointShard shard = new BreakpointShard();

String currentShardIndex = “”;

String totalShard = “”;

String fileMD5 = “”;

String fileName = “”;

String fileType = “other”;

try {

fileMD5 = request.getParameter(“fileMD5”);

Part part = request.getPart(“fileData”);

currentShardIndex = request.getParameter(“currentShardIndex”);

totalShard = request.getParameter(“totalShard”);

fileName = request.getParameter(“fileName”);

fileName = new String(fileName.getBytes(“iso-8859-1″),”UTF-8”);

fileType = request.getParameter(“fileType”);

String typeFolderName = service.getTypeFolder(fileType);

String folderPath = getServletContext().getRealPath(“/upload/”) + typeFolderName + File.separator;

String path = folderPath + fileName + “-” + fileMD5 + “-” + currentShardIndex;

System.out.println(“fileName:”+fileName);

// 是否初次上傳

if (!service.isUpload(fileMD5,fileType)) {

BreakpointFile breakpointFile = new BreakpointFile();

breakpointFile.setMd5(fileMD5);

breakpointFile.setFile_name(fileName);

breakpointFile.setTotal_shard(totalShard);

breakpointFile.setCurrent_shard_index(currentShardIndex);

breakpointFile.setFile_type(fileType);

breakpointFile.setPath(folderPath);

service.saveFile(breakpointFile);

} else {// 返回上次完成位置

service.updateFile(fileMD5, currentShardIndex,fileType);

System.out.println(“upload shard “+currentShardIndex+” OK”);

}

shard.setMd5(fileMD5);

shard.setShard_index(currentShardIndex);

shard.setPath(path);

service.saveShardFile(shard);

part.write(path);

if (currentShardIndex.equals(totalShard)) {// 上傳完成

System.out.println(“upload File finsh start merge shard”);

service.mergeFiles(fileMD5,fileType);

System.out.println(“merge shard OK”);

message.setData(“completed”);

}

message.setData(currentShardIndex);

out.println(JSONObject.fromObject(message).toString());

} catch (Exception e) {

e.printStackTrace();

message.setHasError(true);

message.setErrorMessage(“錯誤!”);

out.println(JSONObject.fromObject(message).toString());

}

}

java怎麼處理http用chunk方式返回的數據

equest.getparameter 接受post/get過來的值 function(data) 裡面的data就是action返回回來的值 按照上面的data.status這樣的格式,返回的應該是json格式。

java編程要和歐姆龍通訊,在哪裡下載java包?

java安裝包在oracle官網下載,需要根據自己電腦系統選擇版本下載。就目前而言學習5G軟件專業是一個不錯的選擇,這專業會學習以下語言:C,JAVA,PHP,PYTHON,MYSQL,JAVASCRIPT另外就是各個語言的框架,提高開發速度的。下面是跟數據相關的知識。

數據的連接首先需要加載一個代碼塊。如果 chunk 是一個字符串,代碼塊指這個字符串。如果 chunk 是一個函數, load 不斷地調用它獲取代碼塊的片段。 每次對 chunk 的調用都必須返回一個字符串緊緊連接在上次調用的返回串之後。 當返回空串、nil、或是不返回值時,都表示代碼塊結束。

1.如果沒有語法錯誤, 則以函數形式返回編譯好的代碼塊; 否則,返回 nil 加上錯誤消息。

如果結果函數有上值, env 被設為第一個上值。 若不提供此參數,將全局環境替代它。 所有其它上值初始化為 nil。 (當你加載主代碼塊時候,結果函數一定有且僅有一個上值 _ENV ))。 然而,如果你加載一個用函數(參見 string.dump, 結果函數可以有任意數量的上值) 創建出來的二進制代碼塊時,所有的上值都是新創建出來的。 也就是說它們不會和別的任何函數共享。

2.接下來就是根據以上信息進行下面的操作,chunkname 在錯誤消息和調試消息中,用於代碼塊的名字。 如果不提供此參數,它默認為字符串chunk 。 chunk 不是字符串時,則為 “=(load)” 。

字符串 mode 用於控制代碼塊是文本還是二進制(即預編譯代碼塊)。 它可以是字符串 “b” (只能是二進制代碼塊), “t” (只能是文本代碼塊), 或 “bt” (可以是二進制也可以是文本)。 默認值為 “bt”。

3.Lua 不會對二進制代碼塊做健壯性檢查。 惡意構造一個二進制塊有可能把解釋器弄崩潰。

運行程序來遍歷表中的所有域。 第一個參數是要遍歷的表,第二個參數是表中的某個鍵。 next 返回該鍵的下一個鍵及其關聯的值。 如果用 nil 作為第二個參數調用 next 將返回初始鍵及其關聯值。 當以最後一個鍵去調用,或是以 nil 調用一張空表時, next 返回 nil。 如果不提供第二個參數,將認為它就是 nil。 特別指出,你可以用 next(t) 來判斷一張表是否是空的。

索引在遍歷過程中的次序無定義, 即使是數字索引也是這樣。 (如果想按數字次序遍歷表,可以使用數字形式的 for 。)

4.當在遍歷過程中你給表中並不存在的域賦值, next 的行為是未定義的。 然而你可以去修改那些已存在的域。 特別指出,你可以清除一些已存在的域。

如果 t 有元方法 __pairs, 以 t 為參數調用它,並返回其返回的前三個值。

否則,返回三個值:next 函數, 表 t,以及 nil。 因此以下代碼

能迭代表 t 中的所有鍵值對。

參見函數 next 中關於迭代過程中修改表的風險。

5.傳入參數,以 保護模式 調用函數 f 。 這意味着 f 中的任何錯誤不會拋出; 取而代之的是,pcall 會將錯誤捕獲到,並返回一個狀態碼。 第一個返回值是狀態碼(一個布爾量), 當沒有錯誤時,其為真。 此時,pcall 同樣會在狀態碼後返回所有調用的結果。 在有錯誤時,pcall 返回 false 加錯誤消息。

希望能幫到你,謝謝!

TCP/IP協議 怎麼用JAVA發送和接收二進制數據 要具體實例

1.TCP/IP協議要求信息必須在塊(chunk)中發送和接收,而塊的長度必須是8位的倍數,因此,我們可以認為TCP/IP協議中傳輸的信息是字節序列。如何發送和解析信息需要一定的應用程序協議。

2.信息編碼:

首先是Java里對基本整型的處理,發送時,要注意:1)每種數據類型的字節個數;2)這些字節的發送順序是怎樣的?(little-endian還是

big-endian);3)所傳輸的數值是有符號的(signed)還是無符號的(unsigned)。具體編碼時採用位操作(移位和屏蔽)就可以了。

具體在Java里,可以採用DataOutputStream類和ByteArrayOutputStream來實現。恢復時可以採用

DataInputStream類和ByteArrayInputStream類。

其次,字符串和文本,在一組符號與一組整數之間的映射稱為編碼字符集(coded character

set)。發送者與接收者必須在符號與整數的映射方式上達成共識,才能使用文本信息進行通信,最簡單的方法就是定義一個標準字符集。具體編碼時採用

String的getBytes()方法。

最後,位操作。如果設置一個特定的設為1,先設置好掩碼(mask),之後用或操作;要清空特定一位,用與操作。

3.成幀與解析

成幀(framing)技術解決了接收端如何定位消息的首位位置的問題。

如果接收者試圖從套接字中讀取比消息本身更多的字節,將可能發生以下兩種情況之一:如果信道中沒有其他消息,接收者將阻塞等待,同時無法處理接收

到的消息;如果發送者也在等待接收端的響應消息,則會形成死鎖(dealock);另一方面,如果信道中還有其他消息,則接收者會將後面消息的一部分甚至

全部讀到第一條消息中去,這將產生一些協議錯誤。因此,在使用TCP套接字時,成幀就是一個非常重要的考慮因素。

有兩個技術:

1.基於定界符(Delimiter-based):消息的結束由一個唯一的標記(unique

marker)指出,即發送者在傳輸完數據後顯式添加的一個特殊字節序列。這個特殊標記不能在傳輸的數據中出現。幸運的是,填充(stuffing)技術

能夠對消息中出現的定界符進行修改,從而使接收者不將其識別為定界符。在接收者掃描定界符時,還能識別出修改過的數據,並在輸出消息中對其進行還原,從而

使其與原始消息一致。

2.顯式長度(Explicit length):在變長字段或消息前附加一個固定大小的字段,用來指示該字段或消息中包含了多少字節。這種方法要確定消息長度的上限,以確定保存這個長度需要的字節數。

接口:

Java代碼 import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }

定界符的方式:

Java代碼 import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)’\n’;//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException(“Message contains delimiter”); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException(“Non-empty message without delimiter”); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }

顯式長度方法:

Java代碼 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.lengthMAXMESSAGELENGTH){ throw new IOException(“message too long”); } //write length prefix out.write((message.lengthBYTEMASK)BYTEMASK); out.write(message.lengthBYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0=length=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it’s a framing error; return msg; } }

原創文章,作者:WCG4I,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/129022.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WCG4I的頭像WCG4I
上一篇 2024-10-03 23:25
下一篇 2024-10-03 23:25

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論