我只知道,网络流读不到就阻塞,阻塞超过我设置的超时时间(5秒)之后就抛异常,怎么会返回-1,折磨死我了。
急。
谢谢兄弟梦了
String MMSCIP = (String) mm7Config.getMMSCIP().get(0);
            int index = MMSCIP.indexOf(":");
            String ip;
            int port;
            if (index == -1) {
               ip = MMSCIP;
               port = 80;
            } else {
               ip = MMSCIP.substring(0, index);
               port = Integer.parseInt(MMSCIP.substring(index + 1));
            }
            client = new Socket(ip, port);
         }
         if (client != null) {
            logger.debug("here5 ,client != null");
            client.setSoTimeout(mm7Config.getTimeOut());
            client.setKeepAlive(true);
            sender = new DataOutputStream(client.getOutputStream());
            receiver = new DataInputStream(client.getInputStream());
while (1 > 0) {
         if (flag) {
            break;
         }
         readline = is.read(data); //这里返回-1,data为空
         logger.debug("httpRead() 222222");
         baos.write(data, 0, readline);//导致这里出异常
         logger.debug("httpRead() 666666");

解决方案 »

  1.   

    我觉得我现在的关键问题是:以前我一直以为超时之后只会抛出异常,而不会返回-1,并且我的一个朋友也这样认为,关于socket的文档,尤其是关于setSoTimeout()这个函数的说明文档 都是这样说的。
    如果大家能肯定的告诉我,我的关于socket读流的看法是错误的,那么我的问题其实也解决了。但是请大家告诉我一些关于socket超时后不抛异常,而是返回-1的权威资料或者实例!
    谢谢大家
      

  2.   

    ding,csdn这几天是怎么啦,我第一次碰到问题这么少弟兄来光顾的
      

  3.   

    救星来了。
    to :“ dytsoft(anway.vicp.net)”兄弟,客服说详细一点?
    我觉得我现在的关键问题是:以前我一直以为超时之后只会抛出异常,而不会返回-1,并且我的一个朋友也这样认为,关于socket的文档,尤其是关于setSoTimeout()这个函数的说明文档 都是这样说的。
    如果大家能肯定的告诉我,我的关于socket读流的看法是错误的,那么我的问题其实也解决了。但是请大家告诉我一些关于socket超时后不抛异常,而是返回-1的权威资料或者实例!
    谢谢大家
      

  4.   

    client = new Socket(ip, port);
    “ Creates a stream socket and connects it to the specified port number on the named host.”这是sun文档对这个socket构造函数的说明,为何在读的时候还会未连接呢?如果不能连接,那么在构造这个socket的时候就会有异常,我会在函数外捕捉到的
      

  5.   

    -1表示连接已经断开,其实就是null
      

  6.   

    readline = is.read(data); //这里返回-1,data为空
    当底层的socket已经关闭时,在它上面调用read方法,不会抛出connection reset 异常,而是返回-1?
    晕死,这些重要的细节怎么sun的文档上都没有提到呢,
      

  7.   

    这个在张孝祥的就业培训教程里有,他当时也提到了这个问题。
    他给出的例子的一部分就是服务器端如果读到-1就表示客户端已经断开。jinxfei(周华健、言兴朋、茅威涛) ( )   正解
      

  8.   

    晕死,谢谢点拔!
    还想并且需要听听其它哥们的说法。tmd,我们公司一些成熟的通讯程序源码都是只捕捉异常而没有根据-1来判断socket不能读了。
    等候大家的解释
      

  9.   

    ..........
          int dataTotalSizeToRead = dataSize - 4;
          int dataToReadLeft = dataSize - 4;
          int dataThisTimeRead;      while (dataToReadLeft > 0) {
            dataThisTimeRead = dataInStream.read(receivedData,
                                                 dataTotalSizeToRead -
                                                 dataToReadLeft,
                                                 dataToReadLeft);
            dataToReadLeft -= dataThisTimeRead;
    ...........
    这是我们一个较大的通讯平台上运行了7,8年之久的代码。我真的无语,如果不抛异常而返回-1,那么就是这段代码带着毛病支撑了我们的平台差不多十年吗
    弟兄们,欢迎点评...请解我的疑或!!!!!
      

  10.   

    “If the first byte cannot be read for any reason other than end of file, then an IOException is thrown. In particular, an IOException is thrown if the input stream has been closed.”
    我不是死抠,我是真的需要知道真相,我觉得难以理解。
      

  11.   

    try{
    socket client = new Socket(ip,port);
    client.setSoTimeout(10000);
     DatainputStream dataInStream = new DatainputStream(client.getInputStream);
    ..........
          int dataTotalSizeToRead = dataSize - 4;
          int dataToReadLeft = dataSize - 4;
          int dataThisTimeRead;      while (dataToReadLeft > 0) {
            dataThisTimeRead = dataInStream.read(receivedData,
                                                 dataTotalSizeToRead -
                                                 dataToReadLeft,
                                                 dataToReadLeft);
            dataToReadLeft -= dataThisTimeRead;}catch....
    这样代码还少吗,从创建socket开始,难道还有别的地方会影响吗,兄弟?
      

  12.   

    HOHO,看来我是不是没理解你的帖子,我是说本来可以运行了7,8年之久的代码你做了什么改动现在读不出来了?
      

  13.   

    大侠:
    dataInStream.read(receivedData,
                                                 dataTotalSizeToRead -
                                                 dataToReadLeft,
                                                 dataToReadLeft);
    会否返回-1?什么时候返回-1?
    没有连接上返回-1还是抛异常?
    读的时候断开了是返回-1还是抛异常?
    超时时间到了之后还没读到,是否返回-1还是抛异常?
    真成的谢谢
      

  14.   

    当你的dataToReadLeft大于0 但receivedData没有数据的时候 就会返回-1。你应该参考一下DataInputStream的DOC,说的很清楚。
      

  15.   

    there is an attempt to read at least one byte. If no byte is available because the stream is at end of file, the value -1 is returned;这是原话,我之所以翻译成大于0,因为dataToReadLeft小于0的时候会抛异常希望对你有帮助
      

  16.   

    这段问档我已经看过多次了。“.....is at end of file, the value -1 is returned;...”
    如果用DataInputStream读文件或其它非socket流,我一直以是否-1来判断是否到尾了。
    可是,读socket流怎么会 at end of file ?
      

  17.   

    对方关闭了连接,当然就end of file了。
    另外,如果没有连上,new Socket的时候就会抛出异常,当然也就不可能拿到inputStream了。