这日志根本看不出什么,你要找到出问题的那段代码,针对出问题的代码再作分析。 |
06-07 16:00:56.855: D/SencondServer(13477): myIntent===>com.tchip.mid_undock 06-07 16:00:56.881: E/MediaPlayer(13477): Should have subtitle controller already set 06-07 16:00:56.885: E/BaseApplication(13477): action=com.tchip.mid_undock 06-07 16:00:56.903: E/123(13477): ==================================== 06-07 16:00:56.905: E/ServerCoreHandler(13477): ------------sendData(Protocal p)------------ 06-07 16:00:56.905: E/ServerCoreHandler(13477): ------------sendData(IoSession session, Protocal p)------------(0x00000001: nio datagram, server, /192.168.1.6:51270 => /:::26386) 06-07 16:00:56.912: E/ServerCoreHandler(13477): [IMCORE]exceptionCaught捕获到错了,原因是:null 06-07 16:00:56.913: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:FRD-AL00,cid:10001}/192.168.1.6:51270 06-07 16:00:56.913: I/ServerCoreHandler(13477): [IMCORE]与{uid:FRD-AL00,cid:10001}/192.168.1.6:51270的会话关闭(user_id=10001,loginName=FRD-AL00)了... 06-07 16:00:56.913: E/ServerCoreHandler(13477): [IMCORE]exceptionCaught捕获到错了,原因是:Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference 06-07 16:00:57.018: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:FRD-AL00,cid:10001}/192.168.1.6:51270 06-07 16:00:57.020: W/ServerCoreHandler(13477): [IMCORE]给客户端:{uid:FRD-AL00,cid:10001}/192.168.1.6:51270的数据->{"QoS":false,"dataContent":"{\"message\":\"66666\",\"type\":67}","from":0,"to":10001,"type":2},发送失败. 06-07 16:00:57.020: D/DialerFragment(13477): ---onReceive---lastStation===>com.tchip.mid_undock 06-07 16:00:57.046: W/MediaPlayer(13477): mediaplayer went away with unhandled events 06-07 16:00:57.046: E/MediaPlayer(13477): Should have subtitle controller already set 06-07 16:00:58.751: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:null,cid:-1}/192.168.1.6:51270 06-07 16:00:58.751: I/ServerCoreHandler(13477): [IMCORE]与{uid:null,cid:-1}/192.168.1.6:51270的会话建立(sessionCreated)了... 06-07 16:00:58.752: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:null,cid:-1}/192.168.1.6:51270 06-07 16:00:58.752: I/ServerCoreHandler(13477): [IMCORE]与{uid:null,cid:-1}/192.168.1.6:51270的会话(sessionOpened)打开了... 06-07 16:00:58.752: E/ServerCoreHandler(13477): ----- 06-07 16:00:58.754: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:null,cid:-1}/192.168.1.6:51270 06-07 16:00:58.754: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:null,cid:-1}/192.168.1.6:51270 06-07 16:00:58.755: W/ServerCoreHandler(13477): [IMCORE]>> 客户端{uid:null,cid:-1}/192.168.1.6:51270尚未登陆,{}处理未继续. 06-07 16:00:58.760: E/ServerCoreHandler(13477): ------------sendData(IoSession session, Protocal p)------------(0x00000002: nio datagram, server, /192.168.1.6:51270 => /:::26386) 06-07 16:01:00.902: E/ServerCoreHandler(13477): ----- 06-07 16:01:00.904: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:null,cid:-1}/192.168.1.6:51270 06-07 16:01:00.906: I/ServerCoreHandler(13477): [IMCORE]>> 客户端{uid:null,cid:-1}/192.168.1.6:51270发过来的登陆信息内容是:getLoginName=FRD-AL00|getLoginPsw=88888888 06-07 16:01:00.906: E/ServerCoreHandler(13477): alreadyLogined=false 06-07 16:01:00.906: D/ServerEventListenerImpl(13477): 正在调用回调方法:OnVerifyUserCallBack...(extra=null lpUserName=FRD-AL00 lpPassword=88888888) 06-07 16:01:00.908: E/ServerCoreHandler(13477): ------------sendData(IoSession session, Protocal p)------------(0x00000002: nio datagram, server, /192.168.1.6:51270 => /:::26386) 06-07 16:01:00.914: D/ServerEventListenerImpl(13477): 正在调用回调方法:OnUserLoginAction_CallBack... userId=10002 userName=FRD-AL00 /192.168.1.6:51270 06-07 16:01:00.914: E/123(13477): ipString=/192.168.1.6:51270 ipStr=192.168.1.6 06-07 16:01:00.927: E/ServerCoreHandler(13477): ----- 06-07 16:01:00.930: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:FRD-AL00,cid:10002}/192.168.1.6:51270 06-07 16:01:00.930: I/ServerCoreHandler(13477): >> 收到客户端{uid:FRD-AL00,cid:10002}/192.168.1.6:51270的通用数据发送请求. 06-07 16:01:00.930: D/ServerCoreHandler(13477): 【IMCORE】【QoS机制_S2C】收到10002发过来的指纹为f5fc0d43-2c0a-4cdf-88dd-1b398c837fad的应答包. 06-07 16:01:03.974: E/ServerCoreHandler(13477): ----- 06-07 16:01:03.977: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:FRD-AL00,cid:10002}/192.168.1.6:51270 06-07 16:01:03.977: E/ServerCoreHandler(13477): ------------sendData(Protocal p)------------ 06-07 16:01:03.978: E/ServerCoreHandler(13477): ------------sendData(IoSession session, Protocal p)------------(0x00000002: nio datagram, server, /192.168.1.6:51270 => /:::26386) 06-07 16:01:07.047: E/ServerCoreHandler(13477): ----- 06-07 16:01:07.050: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:FRD-AL00,cid:10002}/192.168.1.6:51270 06-07 16:01:07.050: E/ServerCoreHandler(13477): ------------sendData(Protocal p)------------ 06-07 16:01:07.051: E/ServerCoreHandler(13477): ------------sendData(IoSession session, Protocal p)------------(0x00000002: nio datagram, server, /192.168.1.6:51270 => /:::26386) 06-07 16:01:07.175: D/SencondServer(13477): myIntent===>com.tchip.mid_ondock 06-07 16:01:07.205: E/MediaPlayer(13477): Should have subtitle controller already set 06-07 16:01:07.208: E/BaseApplication(13477): action=com.tchip.mid_ondock 06-07 16:01:07.214: D/DialerFragment(13477): ---onReceive---lastStation===>com.tchip.mid_ondock 06-07 16:01:07.258: E/MediaPlayer(13477): Should have subtitle controller already set 06-07 16:01:09.972: E/ServerCoreHandler(13477): ----- 06-07 16:01:09.976: E/ServerCoreHandler(13477): ------clientInfoToString---{uid:FRD-AL00,cid:10002}/192.168.1.6:51270 06-07 16:01:09.977: E/ServerCoreHandler(13477): ------------sendData(Protocal p)------------ 06-07 16:01:09.978: E/ServerCoreHandler(13477): ------------sendData(IoSession session, Protocal p)------------(0x00000002: nio datagram, server, /192.168.1.6:51270 => /:::26386) |
或者我要怎么弄一下日志打印给到你? |
这个不是收数据的时候报错的,是发数据的时候报错的。。。。我看了一下和你源码里面的改动基本上不会影响到这里。日志就是最上面的日志了。 |
无论如何,这个QoS类也只跟消息送达保证有关,而你的代码是在服务端数据接收时就出错了,所以目前的问题可先不管这个QoS类。像这个空指针错误一定是一个非常明显的低级问题,你把源码里的异常栈打印出来,在Android上是:Log.d(TAG, e) 这样的日志输出就可以 |
/* * Copyright (C) 2016 即时通讯网(52im.net) The MobileIMSDK Project. * All rights reserved. * Project URL:[url=https://github.com/JackJiang2011/MobileIMSDK]https://github.com/JackJiang2011/MobileIMSDK[/url] * * 即时通讯网(52im.net) - 即时通讯技术社区! PROPRIETARY/CONFIDENTIAL. * Use is subject to license terms. * * QoS4SendDaemonS2C.java at 2016-2-20 11:26:03, code by Jack Jiang. * You can contact author with [url=mailto:jack.jiang@52im.net]jack.jiang@52im.net[/url] or [url=mailto:jb2011@163.com]jb2011@163.com[/url]. */ package net.openmob.mobileimsdk.server.qos; //import java.awt.event.ActionEvent; //import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; //import javax.swing.Timer; import net.openmob.mobileimsdk.server.ServerLauncher; import net.openmob.mobileimsdk.server.protocal.Protocal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class QoS4SendDaemonS2C { private static Logger logger = LoggerFactory.getLogger(QoS4SendDaemonS2C.class); public static boolean DEBUG = false; public static final int CHECH_INTERVAL = 5000; public static final int MESSAGES_JUST$NOW_TIME = 2000; public static final int QOS_TRY_COUNT = 1; private ServerLauncher serverLauncher = null; private ConcurrentHashMap<String, Protocal> sentMessages = new ConcurrentHashMap<String, Protocal>(); private ConcurrentHashMap<String, Long> sendMessagesTimestamp = new ConcurrentHashMap<String, Long>(); private boolean running = false; private boolean _excuting = false; // private Timer timer = null; private static QoS4SendDaemonS2C instance = null; public static QoS4SendDaemonS2C getInstance() { if (instance == null) instance = new QoS4SendDaemonS2C(); return instance; } private QoS4SendDaemonS2C() { init(); } private void init() { // this.timer = new Timer(CHECH_INTERVAL, new ActionListener() // { // public void actionPerformed(ActionEvent e) { // QoS4SendDaemonS2C.this.run(); // } // }); } public void run() { // 极端情况下本次循环内可能执行时间超过了时间间隔,此处是防止在前一 // 次还没有运行完的情况下又重复执行,从而出现无法预知的错误 if (!this._excuting) { ArrayList<Protocal> lostMessages = new ArrayList<Protocal>(); this._excuting = true; try { if (DEBUG) { logger.debug("【IMCORE】【QoS发送方】=========== 消息发送质量保证线程运行中, 当前需要处理的列表长度为" + this.sentMessages.size() + "..."); } for (String key : this.sentMessages.keySet()) { Protocal p = (Protocal)this.sentMessages.get(key); if ((p != null) && (p.isQoS())) { if (p.getRetryCount() >= QOS_TRY_COUNT) { if (DEBUG) { logger.debug("【IMCORE】【QoS发送方】指纹为" + p.getFp() + "的消息包重传次数已达" + p.getRetryCount() + "(最多" + QOS_TRY_COUNT + "次)上限,将判定为丢包!"); } lostMessages.add((Protocal)p.clone()); remove(p.getFp()); } else { //### 2015104 Bug Fix: 解决了无线网络延较大时,刚刚发出的消息在其应答包还在途中时被错误地进行重传 long delta = System.currentTimeMillis() - sendMessagesTimestamp.get(key); // 该消息包是“刚刚”发出的,本次不需要重传它哦 if(delta <= MESSAGES_JUST$NOW_TIME) { if(DEBUG) logger.warn("【IMCORE】【QoS发送方】指纹为"+key+"的包距\"刚刚\"发出才"+delta +"ms(<="+MESSAGES_JUST$NOW_TIME+"ms将被认定是\"刚刚\"), 本次不需要重传哦."); } //### 2015103 Bug Fix END else { boolean sendOK = ServerLauncher.sendData(p); p.increaseRetryCount(); if (sendOK) { if (DEBUG) { logger.debug("【IMCORE】【QoS发送方】指纹为" + p.getFp() + "的消息包已成功进行重传,此次之后重传次数已达" + p.getRetryCount() + "(最多" + 1 + "次)."); } } else if (DEBUG) { logger.warn("【IMCORE】【QoS发送方】指纹为" + p.getFp() + "的消息包重传失败,它的重传次数之前已累计为" + p.getRetryCount() + "(最多" + 1 + "次)."); } } } } else { remove(key); } } } catch (Exception eee) { if (DEBUG) { logger.warn("【IMCORE】【QoS发送方】消息发送质量保证线程运行时发生异常," + eee.getMessage(), eee); } } if ((lostMessages != null) && (lostMessages.size() > 0)) { notifyMessageLost(lostMessages); } this._excuting = false; } } protected void notifyMessageLost(ArrayList<Protocal> lostMessages) { if ((this.serverLauncher != null) && (this.serverLauncher.getServerMessageQoSEventListener() != null)) this.serverLauncher.getServerMessageQoSEventListener().messagesLost(lostMessages); } public QoS4SendDaemonS2C startup(boolean immediately) { stop(); // if (immediately) // this.timer.setInitialDelay(0); // else // this.timer.setInitialDelay(CHECH_INTERVAL); // // this.timer.start(); // this.running = true; return this; } public void stop() { // if (this.timer != null) { // this.timer.stop(); // } this.running = false; } public boolean isRunning() { return this.running; } public boolean exist(String fingerPrint) { return this.sentMessages.get(fingerPrint) != null; } public void put(Protocal p) { if (p == null) { if (DEBUG) logger.warn("Invalid arg p==null."); return; } if (p.getFp() == null) { if (DEBUG) logger.warn("Invalid arg p.getFp() == null."); return; } if (!p.isQoS()) { if (DEBUG) logger.warn("This protocal is not QoS pkg, ignore it!"); return; } if (this.sentMessages.get(p.getFp()) != null) { if (DEBUG) { logger.warn("【IMCORE】【QoS发送方】指纹为" + p.getFp() + "的消息已经放入了发送质量保证队列,该消息为何会重复?(生成的指纹码重复?还是重复put?)"); } } // save it sentMessages.put(p.getFp(), p); // 同时保存时间戳 sendMessagesTimestamp.put(p.getFp(), System.currentTimeMillis()); } public void remove(String fingerPrint) { //### 20151129 Bug Fix: 解决了之前错误地在服务端实现本remove方法时 // 使用了SwingWorker而导致一段时间后一定几率下整个Timer不能正常工作了(OOM) try { // remove it sendMessagesTimestamp.remove(fingerPrint); Object result = sentMessages.remove(fingerPrint); if(DEBUG) logger.warn("【IMCORE】【QoS发送方】指纹为"+fingerPrint+"的消息已成功从发送质量保证队列中移除(可能是收到接收方的应答也可能是达到了重传的次数上限),重试次数=" +(result != null?((Protocal)result).getRetryCount():"none呵呵.")); } catch (Exception e) { if(DEBUG) logger.warn("【IMCORE】【QoS发送方】remove(fingerPrint)时出错了:", e); } //### 20151129 Bug Fix END } public int size() { return this.sentMessages.size(); } public void setServerLauncher(ServerLauncher serverLauncher) { this.serverLauncher = serverLauncher; } } |
引用:JackJiang 发表于 2017-06-07 12:01 这个是这样的,我把这个服务端,移植到了Android 上,我们有项目需要用到这个类似的推送。android 上由于没有java.awt.event.ActionEvent 和java.awt.event.ActionListener 的支持,我把这里的东西都注释掉了。 |
引用:JackJiang 发表于 2017-06-07 12:01 这套代码本来是PC上的,现在是把它移到了android上面来,也就是在手机上搭建了这个服务器,肯定是删掉了很多东西的,在看看吧。。。现在也不知道为什么是null。。 |
看样子你改过源码,而且出错的原因很明显,应该是有什么地方改动的不对。 你可以描述一下你大致改动了什么代码,如果能把改动的代码跟原先的代码作一个比对截个图发出来,一看就能明白了。MobileIMSDK官方原版是一定可以用服务端API发送消息给指定客户端的,不然要这个sdk有何用。所以,优先检查你改过的代码 |