默认
发表评论 6
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 求教我的MobileIMSDK服务端在centos 6.5 上出现JSON解析异常
阅读(44113) | 评论(6 收藏 淘帖
我gson的包试过了 2.8.0版本和2.2.4 版本<groupId>com.google.code.gson</groupId>        <artifactId>gson</artifactId>

tomcat 是 apache-tomcat-8.0.20
jdk 是java version "1.8.0_31"

启动 MI以后不停的报 如下异常,请问什么原因,如何解决

[01 15:07:35,073 ERROR] [pool-2-thread-36] server.ServerCoreHandler - [IMCORE]exceptionCaught鎹曡幏鍒伴敊浜嗭紝鍘熷洜鏄細java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
        at com.google.gson.Gson.fromJson(Gson.java:887)
        at com.google.gson.Gson.fromJson(Gson.java:852)
        at com.google.gson.Gson.fromJson(Gson.java:801)
        at com.google.gson.Gson.fromJson(Gson.java:773)
        at net.openmob.mobileimsdk.server.protocal.ProtocalFactory.parse(ProtocalFactory.java:63)
        at net.openmob.mobileimsdk.server.ServerCoreHandler.fromIOBuffer(ServerCoreHandler.java:776)
        at net.openmob.mobileimsdk.server.ServerCoreHandler.messageReceived(ServerCoreHandler.java:103)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:690)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)
        at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:74)
        at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
        ... 16 more
[01 15:07:35,074 DEBUG] [pool-2-thread-36] filterchain.IoFilterEvent - Event EXCEPTION_CAUGHT has been fired for session 834
[01 15:07:35,074 DEBUG] [pool-2-thread-33] filterchain.IoFilterEvent - Firing a SESSION_CLOSED event for session 834
[01 15:07:35,074 INFO ] [pool-2-thread-33] server.ServerCoreHandler - [IMCORE]涓巤uid:null,cid:-1}/100.109.221.128:30339鐨勪細璇濆叧闂?user_id=-1,loginName=null)浜?..
[01 15:07:35,074 WARN ] [pool-2-thread-33] server.ServerCoreHandler - [IMCORE]銆愭敞鎰忋

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:MobileIMSDK
上一篇:[已回复] MobileIMSDK为何不能 new ServerLauncher().startup()?下一篇:[已回复] APP闪退后MobileIMSDK出现不能够正常登录的情况
推荐方案
评论 6
你这种情况应该是出现乱码了,你可以把JSON内容打印出来。
先确认是否出现了乱码,如果出现乱码你可以查查为何在你的环境下会出现乱码,你自已也可以写个简单的小程序测测为何乱码。
这个异常出现在ServerCoreHandler.java 中,是反复出现的,应该和心跳包有关系,
我也打印出来了相关的东西。请问 ProtocalFactory.parse 需要的是不是一个jason格式的数据?但是
IOBuffer转化成的 是一句话,是不是这里有问题?

g a MESSAGE_RECEIVED event for session 2179
++++++++++++++message+++++++++HeapBuffer[pos=0 lim=59 cap=2048: 4B 65 65 70 61 6C 69 76 65 64 20 61 67 65 6E 74...]
++++++++++++++buffer+++++++++HeapBuffer[pos=0 lim=59 cap=2048: 4B 65 65 70 61 6C 69 76 65 64 20 61 67 65 6E 74...]
++++++++++++++jsonStr+++++++++Keepalived agent udp check string(digest=52921), ignore it!
[01 16:58:48,350 DEBUG] [pool-2-thread-87] filterchain.IoFilterEvent - Event MESSAGE_RECEIVED has been fired for session 2179
[01 16:58:48,350 DEBUG] [pool-2-thread-77] filterchain.IoFilterEvent - Firing a EXCEPTION_CAUGHT event for session 2179
[01 16:58:48,350 ERROR] [pool-2-thread-77] server

相关的代码如下:
/**
     * MINA框架中收到客户端消息的回调方法。
     * <p>
     * 本类将在此方法中实现完整的即时通讯数据交互和处理策略。
     * <p>
     * 为了提升并发性能,本方法将运行在独立于MINA的IoProcessor之外的线程池中,
     * 详见 {@link ServerLauncher#initAcceptor()}中的MINA设置代码 。
     *
     * @param session 收到消息对应的会话引用
     * @param message 收到的MINA的原始消息封装对象,本类中是 {@link IoBuffer}对象
     * @throws Exception 当有错误发生时将抛出异常
     */
    @Override
    public void messageReceived(IoSession session, Object message)
            throws Exception
    {
            if (message instanceof IoBuffer)
            {
                    System.out.println("++++++++++++++message+++++++++" + message);
            IoBuffer buffer = (IoBuffer) message;
            System.out.println("++++++++++++++buffer+++++++++" + buffer);
            Protocal pFromClient = fromIOBuffer(buffer); //这一行中出错
            
            String remoteAddress = ServerCoreHandler.clientInfoToString(session);

        /**
         * 从MINA的原始数据对象中解析出MobileIMSDK的完整协议内容(Protocal对象的JSON表示形式)。
         *
         * @param buffer MINA的原始数据封装对象
         * @return 解析后的MobileIMSDK的完整协议内容(Protocal对象的JSON表示形式)
         * @throws Exception 解析出错则抛出本异常
         * @see {@link IoBuffer#getString(java.nio.charset.CharsetDecoder)}
         */
        public static String fromIOBuffer_JSON(IoBuffer buffer) throws Exception
        {
                String jsonStr = buffer.getString(CharsetHelper.decoder);
                System.out.println("++++++++++++++jsonStr+++++++++" + jsonStr);
                return jsonStr;
        }
       
        /**
         * 从MINA的原始数据对象中解析出MobileIMSDK的完整协议内容(Protocal对象)。
         *
         * @param buffer MINA的原始数据封装对象
         * @return 解析后的MobileIMSDK的完整协议内容(Protocal对象)
         * @throws Exception 解析出错则抛出本异常
         * @see #fromIOBuffer_JSON(IoBuffer)
         */
        public static Protocal fromIOBuffer(IoBuffer buffer) throws Exception
        {
                return ProtocalFactory.parse(fromIOBuffer_JSON(buffer), Protocal.class);
        }
再问一句,解析成:Keepalived agent udp check string(digest=52921), ignore it! 对吗?为啥我在本地跑没这个问题呢?
我突然明白了,这个消息是我前端配的 SLB 负载均衡发的心跳包,格式是SLB的,所以解析不了,但是依然强转成jason,就报异常了。我只要忽略,应该就行了!
引用:holysunxiao 发表于 2016-11-01 17:03
再问一句,解析成:Keepalived agent udp check string(digest=52921), ignore it! 对吗?为啥我在本地跑没 ...

先把json打印了出来看看。MObileIMSDK里的JSON解析和序列化代码都是非常简单的,你照着源码把那段代码拎出来,自已写简单的Demo试试看为何在你服务器环境下就乱码。

至于这段UDP提示,先不用管它,先解决乱码问题再说。
引用:JackJiang 发表于 2016-11-01 17:21
先把json打印了出来看看。MObileIMSDK里的JSON解析和序列化代码都是非常简单的,你照着源码把那段代码拎 ...

我不太了解你具体的架构,以及具体对MobileIMSDK做了什么样的修改
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部