我正在学习websocket并且已经使用websocket / json完成了聊天程序.但我坚持上传ATM的文件.任何建议&回答会很感激.

服务器端:

package websocket;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.nio.ByteBuffer;

import javax.websocket.CloseReason;

import javax.websocket.EndpointConfig;

import javax.websocket.OnClose;

import javax.websocket.OnError;

import javax.websocket.OnMessage;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/receive/fileserver")

public class FileServer {

@OnOpen

public void open(Session session, EndpointConfig conf) {

System.out.println("chat ws server open");

}

@OnMessage

public void processUpload(ByteBuffer msg, boolean last, Session session) {

System.out.println("Binary message");

FileOutputStream fos = null;

File file = new File("D:/download/tmp.txt");

try {

fos = new FileOutputStream(file);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

byte readdata = (byte) -999;

while(readdata!=-1) {

readdata=msg.get();

try {

fos.write(readdata);

} catch (IOException e) {

e.printStackTrace();

}

}

}

@OnMessage

public void message(Session session, String msg) {

System.out.println("got msg: " + msg + msg.length());

}

@OnClose

public void close(Session session, CloseReason reason) {

System.out.println("socket closed: "+ reason.getReasonPhrase());

}

@OnError

public void error(Session session, Throwable t) {

t.printStackTrace();

}

}

客户:

Chat

File Upload

Select file

var ws;

function connectChatServer() {

ws = new WebSocket(

"ws://localhost:8080/MyHomePage/receive/fileserver");

ws.binaryType = "arraybuffer";

ws.onopen = function() {

alert("Connected.")

};

ws.onmessage = function(evt) {

alert(evt.msg);

};

ws.onclose = function() {

alert("Connection is closed...");

};

ws.onerror = function(e) {

alert(e.msg);

}

}

function sendFile() {

var file = document.getElementById('filename').files[0];

var reader = new FileReader();

var rawData = new ArrayBuffer();

reader.loadend = function() {

}

reader.onload = function(e) {

rawData = e.target.result;

ws.send(rawData);

alert("the File has been transferred.")

}

reader.readAsBinaryString(file);

}

服务器端关闭原因消息如下

套接字关闭:解码的文本消息对于输出缓冲区而言太大,并且端点不支持部分消息

Q1:似乎是根据封闭原因找到文本处理方法而不是二进制处理方法,我该如何解决这个问题呢?

Q2:我应该将数据类型更改为Blob以在javascript端传输文件吗?那怎么样?

额外的问:可以有人链接websocket文件传输的示例源(java websocket或javascript或两者)?

谢谢阅读 :)

解决方法:

经过一番研究和尝试,我发现’reader.readAsBinaryString(file);’是问题1的原因.将其更改为’reader.readAsArrayBuffer(file);’我的第一个问题已经解决了.

另外,由于websocket自动将文件作为多个部分数据传输,因此我更改了源代码如下.这有效!只有当文件大小不那么大时. :/

更改了服务器端源:

package websocket;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.nio.ByteBuffer;

import javax.websocket.CloseReason;

import javax.websocket.EndpointConfig;

import javax.websocket.OnClose;

import javax.websocket.OnError;

import javax.websocket.OnMessage;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/receive/fileserver")

public class FileServer {

static File uploadedFile = null;

static String fileName = null;

static FileOutputStream fos = null;

final static String filePath="d:/download/";

@OnOpen

public void open(Session session, EndpointConfig conf) {

System.out.println("chat ws server open");

}

@OnMessage

public void processUpload(ByteBuffer msg, boolean last, Session session) {

System.out.println("Binary Data");

while(msg.hasRemaining()) {

try {

fos.write(msg.get());

} catch (IOException e) {

e.printStackTrace();

}

}

}

@OnMessage

public void message(Session session, String msg) {

System.out.println("got msg: " + msg);

if(!msg.equals("end")) {

fileName=msg.substring(msg.indexOf(':')+1);

uploadedFile = new File(filePath+fileName);

try {

fos = new FileOutputStream(uploadedFile);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}else {

try {

fos.flush();

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

@OnClose

public void close(Session session, CloseReason reason) {

System.out.println("socket closed: "+ reason.getReasonPhrase());

}

@OnError

public void error(Session session, Throwable t) {

t.printStackTrace();

}

}

浏览器(客户端)方:

Chat

File Upload

Select file

var ws;

function connectChatServer() {

ws = new WebSocket(

"ws://localhost:8080/MyHomePage/receive/fileserver");

ws.binaryType = "arraybuffer";

ws.onopen = function() {

alert("Connected.")

};

ws.onmessage = function(evt) {

alert(evt.msg);

};

ws.onclose = function() {

alert("Connection is closed...");

};

ws.onerror = function(e) {

alert(e.msg);

}

}

function sendFile() {

var file = document.getElementById('filename').files[0];

ws.send('filename:'+file.name);

var reader = new FileReader();

var rawData = new ArrayBuffer();

//alert(file.name);

reader.loadend = function() {

}

reader.onload = function(e) {

rawData = e.target.result;

ws.send(rawData);

alert("the File has been transferred.")

ws.send('end');

}

reader.readAsArrayBuffer(file);

}

我仍然无法弄清楚如何传输更大尺寸的文件. (我怀疑自动超时和/或缓冲区大小).有什么建议吗?

标签:javascript,java,blob,websocket

来源: https://codeday.me/bug/20190930/1835352.html

java websocket 上传大文件,使用java websocket API和Javascript上传文件相关推荐

  1. 视频教程-大数据Java强化班(十)之大数据爬虫-Java

    大数据Java强化班(十)之大数据爬虫 10年一线开发及项目管理经验,6年以上大数据项目架构.实施.开发与运维经验,骨灰级大数据玩家,对Hadoop.Storm.Spark.Flink.Kylin.D ...

  2. python获取文件夹大小_S3 API for python–创建bucket文件夹统计文件夹大小

    最近一直在跟S3打交道,但是苦于java不会,python懂一点,API这个东东经常听也知道是啥,但是没有实际根据API文档去进行相关开发的经历,所以前期一直很忐忑,都是找别人帮忙写好特定功能的程序, ...

  3. linux运行java程序内存过大_排查java应用linux环境内存占用过高的问题

    一.问题场景 在一个短信平台的项目中,设置了一个下发节点的Xmx为16G,但是出现了内存撑满,导致CPU过高的情况.当时的具体情况是,该应用内存占用16G,该应用CPU占用1400%(16核),服务器 ...

  4. java 网格包,求大神解答:JAVA网格包布局管理器小程序问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为什么我在这个程序上加入了一个Container对象就出问题了,求解答,要如何改: package A; import java.awt.*; impor ...

  5. java算软件工程_大学学软件工程java的,要学到什么程度才可以算是基本合格呢?...

    谢谢邀请. 这是一个很好的问题,很多相关专业的小伙伴,应该和你有一样的焦虑. 其实背后,可能你们更多关心的:是学习JAVA之后,如何进取,如何就业和发展的问题. 师傅领进门,修行靠个人 个人以为,在学 ...

  6. java小项目 幸运大抽奖_[Java教程]幸运大抽奖

    [Java教程]幸运大抽奖 0 2014-03-30 19:00:09 幸运大抽奖全新来袭,现在普遍的抽奖活动都是由flash开发的,然而,今天向大家展示由js实现的抽奖.早在2012年的时候写过一篇 ...

  7. java一个引用多大_为什么Java 8为方法引用引入了一个新的“::”运算符?

    在Java 8中,使用::运算符完成引用. 例如 // Class that provides the functionality via it's static method public clas ...

  8. java audioattributes_请教一下大神,java 问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1. 请教一下,JAVA中 import it.sauronsoftware.jave.AudioAttributes; 是什么意思?那个it是什么包? ...

  9. php 上传大文件涉及的配置,upload_max_filesize,post_max_size

    php.ini配置文件中的默认文件上传大小为2M, 默认upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须设定upload_max ...

最新文章

  1. R语言笔记5:控制结构
  2. 程序员4月书讯:Angular来了!
  3. day 68 增删改查 语法
  4. 惠安七号机器人创意园_我是F518创意园,请为我投票!
  5. 基于KMP与Levenshtein模糊匹配算法的银行联行号查询(转)
  6. Dukto 文件传输软件(推荐)
  7. 【VBA】汉字转换全拼函数
  8. zabbix自带模板监控CPU,磁盘和内存
  9. Win10 中查看笔记本电脑电池信息
  10. 如何做一个企业网站制作
  11. 学习笔记:Qt程序打包发布
  12. 星巴克招人!要技术大拿。
  13. SQL查询中文字符及标点符号
  14. 信道编码算法的发展和应用
  15. Android开发k歌软件,安卓电视k歌软件哪个好?
  16. 【leetcode 971】 翻转二叉树以匹配先序遍历
  17. ClamWin杀毒程序的改写
  18. 开源生态学初探——从生命游戏开始
  19. 雨量水位监测站 水情监测
  20. android+查询彩信号码,android 短信 彩信 数据库

热门文章

  1. Redis 的内存淘汰策略问题
  2. Jenkins:配置信息变更历史
  3. curl linux 数组参数_Linux系统调用原理
  4. linux创建隐藏进程6,在Linux 2.6内核下实现进程隐藏
  5. rabbitMQ在springboot中的使用
  6. yolov5 face 使用踩坑记录
  7. Cannot assign a device for operation
  8. pytorch 自定义参数不更新
  9. libtorch 加载失败
  10. android EditText显示不全