【问题标题】:ServerSocketChannelImpl ClassCastException write from Server to Client Java GrizzlyServerSocketChannelImpl ClassCastException 从服务器写入客户端 Java Grizzly
【发布时间】:2014-12-27 22:06:47
【问题描述】:

当使用 TCPNIOServerConnection 在 FilterChain 外部“写入”到指定客户端时,我总是遇到以下异常:

INFORMATION: Write to /127.0.0.1:50559
Dez 27, 2014 10:57:11 PM org.glassfish.grizzly.filterchain.DefaultFilterChain execute
WARNUNG: GRIZZLY0013: Exception during FilterChain execution
java.lang.ClassCastException: sun.nio.ch.ServerSocketChannelImpl cannot be cast to java.nio.channels.SocketChannel
    at org.glassfish.grizzly.nio.transport.TCPNIOUtils.writeSimpleBuffer(TCPNIOUtils.java:108)
    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.write(AbstractNIOAsyncQueueWriter.java:260)
    at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:169)
    at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:71)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransportFilter.handleWrite(TCPNIOTransportFilter.java:126)
    at org.glassfish.grizzly.filterchain.TransportFilter.handleWrite(TransportFilter.java:191)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
    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.filterchain.DefaultFilterChain.write(DefaultFilterChain.java:413)
    at org.glassfish.grizzly.nio.NIOConnection.write(NIOConnection.java:407)
    at org.glassfish.grizzly.nio.NIOConnection.write(NIOConnection.java:395)
    at net.vistahr.moose.server.connection.push.ServerConnection.writeTo(ServerConnection.java:58)
    at net.vistahr.moose.server.connection.push.ServerConnection.broadcast(ServerConnection.java:46)
    at net.vistahr.moose.server.service.auth.AuthService.startServerPush(AuthService.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at net.vistahr.moose.server.filter.DelegateServiceFilter.handleRead(DelegateServiceFilter.java:43)
    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:561)
    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:565)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
    at java.lang.Thread.run(Thread.java:745)

使用 FilterChainContext 将消息写入指定的客户端没有问题,但只有使用 Connection 时,每次都会发生异常。

TCPNIOServerConnection connection = getTransport().bind(host, port);
getTransport().start();
connection( destinationAddress, pushMessage, null );

是否有其他方式与客户端通信(FilterChain 之外)?

【问题讨论】:

    标签: java server grizzly


    【解决方案1】:

    您不能写入服务器端 TCPNIOServerConnection,只能写入客户端 TCPNIOConnection。 例如:

    Connection c = transport.connect("www.google.com", "80");
    c.write(....);
    

    【讨论】:

    • 感谢您的回复 - 但我想实现向所有客户推送广播。有没有办法“推”给客户?
    • 不幸的是,除了保持打开的连接列表并将数据写入循环中的每个连接之外,没有其他方法可以推送到所有连接。
    猜你喜欢
    • 2021-11-04
    • 2013-07-03
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    相关资源
    最近更新 更多