问题描述
我试图通过WebSocket传输一个大于4M的文件。我使用 org.glassfish.tyrus:tyrus-server:1.13.1
和 org.glassfish.tyrus:tyrus-container-grizzly-server :1.13.1
作为依赖项。
默认情况下,传入缓冲区大小约为4M(请参阅:)。文档清楚地说明了如果我想增加文件的大小但仍然不能改变传入的缓冲区大小,需要做些什么。这是我想要做的事情的本质:
CountDownLatch messageLatch = new CountDownLatch(1);
最终ClientEndpointConfig cec = ClientEndpointConfig.Builder.create()。build();
ClientManager client = ClientManager.createClient();
client.getProperties()。put(ClientProperties.INCOMING_BUFFER_SIZE,new Integer(17_000_000));
Integer tyrusIncomingBufferSize = Utils.getProperty(client.getProperties(),ClientProperties.INCOMING_BUFFER_SIZE,Integer.class);
System.out.println(tyrusIncomingBufferSize:+ tyrusIncomingBufferSize); // 17000000
client.connectToServer(new Endpoint(){
@Override
public void onOpen(Session session,EndpointConfig config){
try {
session.addMessageHandler(new MessageHandler.Whole< ByteBuffer>(){
@Override
public void onMessage(ByteBuffer message){
System.out.println(Received message :+ message);
messageLatch.countDown();
}
});
文件pic = new File(TEST_PIC); //大小是超过4M
FileInputStream fileReader = new FileInputStream(pic);
final long sizeOfScreenshotFile = pic.length();
System.out.println(sizeOfScreenshotFile); // 4734639
byte [] screenshotData = new byte [(int)sizeOfScreenshotFile];
fileReader.read(screenshotData);
fileReader.close();
ByteBuffer bb = ByteBuffer.wrap(screenshotData);
session.getBasicRemote()。sendBinary(bb);
} catch(IOException e){
e.printStackTrace();
}
}
},cec,new URI(URI));
messageLatch.await(100,TimeUnit.SECONDS);
但我仍然有同样的错误:
17000000
4734639
V 30,2017 1:39:58 PM org.glassfish.tyrus.core.TyrusEndpointWrapper onError
警告:意外的错误,关闭连接。
java.lang.IllegalArgumentException:缓冲区溢出。
at org.glassfish.tyrus.core.Utils.appendBuffers(Utils.java:346)
at org.glassfish.tyrus.core.TyrusWebSocketEngine $ TyrusReadHandler.handle(TyrusWebSocketEngine.java:523)
at org.glassfish.tyrus.container.grizzly.server.GrizzlyServerFilter $ ProcessTask.execute(GrizzlyServerFilter.java:379)
at org.glassfish.tyrus.container.grizzly.client.TaskProcessor.processTask(TaskProcessor。
at org.glassfish.tyrus.container.grizzly.client.TaskProcessor.processTask(TaskProcessor.java:91)
at org.glassfish.tyrus.container.grizzly.server.GrizzlyServerFilter。在org.glassfish.grizzly.filterchain.ExecutorResolver上使用$ handle $($) .java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.fil terchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute( ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:526)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy。 java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access $ 100(WorkerThreadIOStrategy.java:56 )
在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy $ WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:591 )
在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThread Pool.java:571)
在java.lang.Thread.run(Thread.java:745)
java.io.IOException:建立的连接被主机中的软件中止在sun.nio.ch.SocketDispatcher.write0上使用
(本机方法)
在sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
在sun.nio.ch .IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:51)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java :471)
at org.glassfish.grizzly.nio.transport.TCPNIOUtils.flushByteBuffer(TCPNIOUtils.java:149)
at org.glassfish.grizzly.nio.transport.TCPNIoutils.writeSimpleBuffer(TCPNIOUtils.java :133)
at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:126)
at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java :106)
at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.processAsync( AbstractNIOAsyncQueueWriter.java:344)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:108)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:526)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.executeIoEvent(WorkerThreadIOStrategy.java:103)
at org .glassfish.grizzly.strategies.AbstractIOStrategy.executeIoEvent(AbstractIOStrategy.java:89)
at org.glassfish.grizzly.nio.SelectorRunner.iterateKeyEvents(SelectorRunner.java:415)
at org.glassfish.grizzly .nio.SelectorRunner.iterateKeys(SelectorRunner.java:384)
在org.glassfish.grizzly.nio.SelectorRunner .doSelect(SelectorRunner.java:348)
at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:279)
at org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.doWork (AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745 )
-9.8634088E7
V 30,2017 1:41:38 PM org.glassfish.grizzly.http.server.NetworkListener shutdownNow
INFO:停止的监听器绑定到[0.0.0.0:8025 ]
V 30,2017 1:41:38 PM org.glassfish.tyrus.server.Server stop
INFO:Websocket Server停止。
我试着调试Tyrus项目,看到 有没有人知道我该如何解决这个问题? 您正在客户端设置属性,但异常显然会在服务器上抛出。 启动服务器?它几乎看起来像你正在使用灰熊独立 - 如果你这样做,你可以尝试启动服务器属性设置为 (这可以通过使用或其他构造函数。 for更多细节。 I trying to transfer a file bigger than 4M via WebSocket. I'm using By default the incoming buffer size is about 4M (see: 8.4. Incoming buffer size). The documentation clearly says what needs to be done if I want to increase the size of the file but still can not change the incoming buffer size. Here is the essence of what I'm trying to do: But I still have the same error: I tried to debug the Tyrus project and saw that the Does anyone have any idea how can I fix this? You are setting the property in the client, but the exception is clearly thrown on the server. How are you starting the server? It almost seems like you are using Grizzly standalone - if you do, you can try starting the server with TyrusWebSocketEngine#INCOMING_BUFFER_SIZE property set to (That can be done by creating the server by using Server(Map, Class ...) or other constructors. See Server class javadoc for more details. 这篇关于传入的缓冲区大小不能设置为Tyrus客户端的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! incomingBufferSize $
17_000_000
或任何你想要的值。
org.glassfish.tyrus:tyrus-server:1.13.1
and org.glassfish.tyrus:tyrus-container-grizzly-server:1.13.1
as dependencies.CountDownLatch messageLatch = new CountDownLatch(1);
final ClientEndpointConfig cec = ClientEndpointConfig.Builder.create().build();
ClientManager client = ClientManager.createClient();
client.getProperties().put(ClientProperties.INCOMING_BUFFER_SIZE, new Integer(17_000_000));
Integer tyrusIncomingBufferSize = Utils.getProperty(client.getProperties(), ClientProperties.INCOMING_BUFFER_SIZE, Integer.class);
System.out.println("tyrusIncomingBufferSize: " + tyrusIncomingBufferSize); // 17000000
client.connectToServer(new Endpoint() {
@Override
public void onOpen(Session session, EndpointConfig config) {
try {
session.addMessageHandler(new MessageHandler.Whole<ByteBuffer>() {
@Override
public void onMessage(ByteBuffer message) {
System.out.println("Received message: " + message);
messageLatch.countDown();
}
});
File pic = new File(TEST_PIC); // the size is more than 4M
FileInputStream fileReader = new FileInputStream(pic);
final long sizeOfScreenshotFile = pic.length();
System.out.println(sizeOfScreenshotFile); // 4734639
byte[] screenshotData = new byte[(int) sizeOfScreenshotFile];
fileReader.read(screenshotData);
fileReader.close();
ByteBuffer bb = ByteBuffer.wrap(screenshotData);
session.getBasicRemote().sendBinary(bb);
} catch (IOException e) {
e.printStackTrace();
}
}
}, cec, new URI(URI));
messageLatch.await(100, TimeUnit.SECONDS);
17000000
4734639
V 30, 2017 1:39:58 PM org.glassfish.tyrus.core.TyrusEndpointWrapper onError
WARNING: Unexpected error, closing connection.
java.lang.IllegalArgumentException: Buffer overflow.
at org.glassfish.tyrus.core.Utils.appendBuffers(Utils.java:346)
at org.glassfish.tyrus.core.TyrusWebSocketEngine$TyrusReadHandler.handle(TyrusWebSocketEngine.java:523)
at org.glassfish.tyrus.container.grizzly.server.GrizzlyServerFilter$ProcessTask.execute(GrizzlyServerFilter.java:379)
at org.glassfish.tyrus.container.grizzly.client.TaskProcessor.processTask(TaskProcessor.java:114)
at org.glassfish.tyrus.container.grizzly.client.TaskProcessor.processTask(TaskProcessor.java:91)
at org.glassfish.tyrus.container.grizzly.server.GrizzlyServerFilter.handleRead(GrizzlyServerFilter.java:215)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:526)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)
java.io.IOException: An established connection was aborted by the software in your host machine
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:51)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
at org.glassfish.grizzly.nio.transport.TCPNIOUtils.flushByteBuffer(TCPNIOUtils.java:149)
at org.glassfish.grizzly.nio.transport.TCPNIOUtils.writeSimpleBuffer(TCPNIOUtils.java:133)
at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:126)
at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:106)
at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.processAsync(AbstractNIOAsyncQueueWriter.java:344)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:108)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:526)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.executeIoEvent(WorkerThreadIOStrategy.java:103)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.executeIoEvent(AbstractIOStrategy.java:89)
at org.glassfish.grizzly.nio.SelectorRunner.iterateKeyEvents(SelectorRunner.java:415)
at org.glassfish.grizzly.nio.SelectorRunner.iterateKeys(SelectorRunner.java:384)
at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:348)
at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:279)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)
-9.8634088E7
V 30, 2017 1:41:38 PM org.glassfish.grizzly.http.server.NetworkListener shutdownNow
INFO: Stopped listener bound to [0.0.0.0:8025]
V 30, 2017 1:41:38 PM org.glassfish.tyrus.server.Server stop
INFO: Websocket Server stopped.
incomingBufferSize
variable actually remained with the default value.17_000_000
or whatever value you want.