wwwzhouhui 2009-08-24 17:17
浏览 252
已采纳

jwchat JabberHTTPBind中 socket 输入流截断问题2

1.在网上下了一个JWCHAT1.0 版本的后台用JabberHTTPBind 和openfire绑定,登录后从openfire服务中取得rouster流的XML 的时候由于字符串很长。JabberHTTPBind 的readFromSocket 方法取得OPNFFIRE XML字符会截断,造成客户端JWCHAT 登录不上。
[code="java"]private String readFromSocket(long rid) throws IOException {
String retval = "";
char buf[] = new char[16];
int c = 0;

    Response r = this.getResponse(rid);

    while (!this.sock.isClosed() && !this.isStatus(SESS_TERM)) {
        this.setLastActive();
        try {
            if (this.br.ready()) {
                while (this.br.ready()
                        && (c = this.br.read(buf, 0, buf.length)) >= 0)
                    retval += new String(buf, 0, c);
                break; // got sth. to send
            } 
            else {
                if ((this.hold == 0 && r != null && System
                        .currentTimeMillis()
                        - r.getCDate() > 200)
                        ||
                        /*
                         * makes polling clients feel a little bit more
                         * responsive
                         */
                        (this.hold > 0 && ((r != null && System
                                .currentTimeMillis()
                                - r.getCDate() >= this.getWait() * 1000)
                                || this.numPendingRequests() > this
                                        .getHold() || !retval.equals("")))
                        || r.isAborted()) {

                    log.info("readFromSocket done for " + rid);
                    break; // time exeeded
                }

                try {
                    Thread.sleep(READ_TIMEOUT); // wait for incoming
                    // packets
                } catch (InterruptedException ie) {
                    log.error(ie.toString());
                }
            }
        } catch (IOException e) {
            log.error("Can't read from socket");
            this.terminate();
        }
    }

    if (this.sock.isClosed()) {
        throw new IOException();
    }
    return retval;
}[/code]

这段从sockt 输入流 sockt.getInputStream() 取得数据流打印出来数据截断了不符合JABBER XML 数据 出错了
日志中:
[color=red]第一段字符[/color]
inQueue: 增值应用业务部bb公司集成业务部bb公司xx业务部bb公司集成业务部bb公司商务管理采购部bb公司 [color=red]第二段字符[/color]
inQueue: priority="14">xx支撑软件部。。。。。。。
整个XML 给截断了
不知道什么原因。

后来自己机器上架设OPENFIRE 做服务器,rouser数据较多
inQueue: producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0product0其他联系人producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0producttest0grouptest0

这段XML 完整打印出来没有截断,感觉应该和长度限制什么没有关系,怀疑和服务端响应时间什么的有关系

[b]问题补充:[/b]
我后来又试验了,用我机器做服务器,同事的机器启动JWCHAT 访问我的服务端OPEFIRE。还是没有截断。应该和你说的这个不一样的,这里的包应该也是分多个包发的吧。
注:我和我同事机器是同一个网段。被截断的服务器网段和我们不是一个网段。

  • 写回答

2条回答 默认 最新

  • walsh_bupt 2009-08-25 09:43
    关注

    楼主这个,我在很久以前就已经做过测试了,在内网会好点,但是也有限制的,而在外网,你根本就保证不了网络的状况,所以要穿的东西每个包也不要太大,再说,你传的太大,很容易丢包的,

    一个比较好的解决办法是,
    [color=red]
    [size=medium]如果数据量比较大,在你本机传递之前,你先分割,你手动分割,然后传到对放之后,接收后,再封装,这样也不影响你的XML解析。[/color][/size]

    楼主,你如果你信,你可以做个实验呀,你先别穿那么多,你先传512个字节,看能不能收到,然后在变为1024个字节,你就知道了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题