java websocket 上传大文件,使用java websocket API和Javascript上传文件
我正在学习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上传文件相关推荐
- 视频教程-大数据Java强化班(十)之大数据爬虫-Java
大数据Java强化班(十)之大数据爬虫 10年一线开发及项目管理经验,6年以上大数据项目架构.实施.开发与运维经验,骨灰级大数据玩家,对Hadoop.Storm.Spark.Flink.Kylin.D ...
- python获取文件夹大小_S3 API for python–创建bucket文件夹统计文件夹大小
最近一直在跟S3打交道,但是苦于java不会,python懂一点,API这个东东经常听也知道是啥,但是没有实际根据API文档去进行相关开发的经历,所以前期一直很忐忑,都是找别人帮忙写好特定功能的程序, ...
- linux运行java程序内存过大_排查java应用linux环境内存占用过高的问题
一.问题场景 在一个短信平台的项目中,设置了一个下发节点的Xmx为16G,但是出现了内存撑满,导致CPU过高的情况.当时的具体情况是,该应用内存占用16G,该应用CPU占用1400%(16核),服务器 ...
- java 网格包,求大神解答:JAVA网格包布局管理器小程序问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为什么我在这个程序上加入了一个Container对象就出问题了,求解答,要如何改: package A; import java.awt.*; impor ...
- java算软件工程_大学学软件工程java的,要学到什么程度才可以算是基本合格呢?...
谢谢邀请. 这是一个很好的问题,很多相关专业的小伙伴,应该和你有一样的焦虑. 其实背后,可能你们更多关心的:是学习JAVA之后,如何进取,如何就业和发展的问题. 师傅领进门,修行靠个人 个人以为,在学 ...
- java小项目 幸运大抽奖_[Java教程]幸运大抽奖
[Java教程]幸运大抽奖 0 2014-03-30 19:00:09 幸运大抽奖全新来袭,现在普遍的抽奖活动都是由flash开发的,然而,今天向大家展示由js实现的抽奖.早在2012年的时候写过一篇 ...
- java一个引用多大_为什么Java 8为方法引用引入了一个新的“::”运算符?
在Java 8中,使用::运算符完成引用. 例如 // Class that provides the functionality via it's static method public clas ...
- java audioattributes_请教一下大神,java 问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1. 请教一下,JAVA中 import it.sauronsoftware.jave.AudioAttributes; 是什么意思?那个it是什么包? ...
- php 上传大文件涉及的配置,upload_max_filesize,post_max_size
php.ini配置文件中的默认文件上传大小为2M, 默认upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须设定upload_max ...
最新文章
- R语言笔记5:控制结构
- 程序员4月书讯:Angular来了!
- day 68 增删改查 语法
- 惠安七号机器人创意园_我是F518创意园,请为我投票!
- 基于KMP与Levenshtein模糊匹配算法的银行联行号查询(转)
- Dukto 文件传输软件(推荐)
- 【VBA】汉字转换全拼函数
- zabbix自带模板监控CPU,磁盘和内存
- Win10 中查看笔记本电脑电池信息
- 如何做一个企业网站制作
- 学习笔记:Qt程序打包发布
- 星巴克招人!要技术大拿。
- SQL查询中文字符及标点符号
- 信道编码算法的发展和应用
- Android开发k歌软件,安卓电视k歌软件哪个好?
- 【leetcode 971】 翻转二叉树以匹配先序遍历
- ClamWin杀毒程序的改写
- 开源生态学初探——从生命游戏开始
- 雨量水位监测站 水情监测
- android+查询彩信号码,android 短信 彩信 数据库