keesun / mod-socket-io

Vert.x Socket.IO Module
Other
107 stars 40 forks source link

NPE Thrown by the DefaultSocketIOServer when using socket.emit("") without data. #1

Closed paul-manjarres closed 12 years ago

paul-manjarres commented 12 years ago

I've implemented the DefaultSocketIOServer just like the example. Everything so far works perfect.

But when, on the client side, I use a command emit just using a String parameter, without the JSON data:

socket.emit("request");

The server throws an exception:

java.lang.NullPointerException at org.vertx.java.core.json.JsonObject.putArray(JsonObject.java:72) at com.nhncorp.mods.socket.io.impl.Parser.decodePacket(Parser.java:195) at com.nhncorp.mods.socket.io.impl.transports.WebSocketTransport$3.handle(WebSocketTransport.java:38) at com.nhncorp.mods.socket.io.impl.transports.WebSocketTransport$3.handle(WebSocketTransport.java:36) at org.vertx.java.core.http.impl.DefaultWebSocket.handleFrame(DefaultWebSocket.java:193) at org.vertx.java.core.http.impl.ServerConnection.handleWsFrame(ServerConnection.java:178) at org.vertx.java.core.http.impl.ServerConnection.processMessage(ServerConnection.java:282) at org.vertx.java.core.http.impl.ServerConnection.handleMessage(ServerConnection.java:93) at org.vertx.java.core.http.impl.DefaultHttpServer$ServerHandler.messageReceived(DefaultHttpServer.java:556) at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) at org.jboss.netty.handler.stream.ChunkedWriteHandler.handleUpstream(ChunkedWriteHandler.java:142) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:369) at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:568) at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:437) at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563) at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:558) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247) at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35) at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102) at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

keesun commented 12 years ago

Hm.. I've tested that operation but it works fine. You can test the socket.emit('event') operation with this way. On the Sending and Receiving Events menu, you can see socket.emit(event) test works.

Which version of Socket.IO client did you use?

paul-manjarres commented 12 years ago

Hi, I'm using the last version available of Socket.IO ( build:0.9.10). I'm using Vertex embedded. I'm starting a tomcat container and using a context listener to start the DefaultSocketIOServer. Everything is working for me, except the call to socket emit in javascript with just the event name socket.emit('event')

This is the code I'm using to start the socket.io server.

        Vertx vertx = Vertx.newVertx();
        HttpServer server = vertx.createHttpServer();
        SocketIOServer io = new DefaultSocketIOServer(vertx, server);  
        io.sockets().onConnection(new Handler<SocketIOSocket>() {
            public void handle(final SocketIOSocket socket) {
                   // handle socket events
            }
        });

        server.listen(9000);
keesun commented 12 years ago

Hi paul-manjarres,

I'll look into this.

Thanks.

keesun commented 12 years ago

I've seen the latest codes in Parser.java.

if(args != null) {                               // 194
        packet.putArray("args", args);  // 195, your logs says here is something wrong, but it doesn't pass NULL to the putArray method
}                                                    // 196

I feel, you are using the older version of mod-socket-io, why don't you try the latest version? You can see how to use the latest version of mod-socket-io in this project's README.mf file.

Thank you. :)