0

在我的服务器代码中,我向客户端发送不同的请求并返回响应,但只访问了第一个读取请求,在访问第二个读取语句期间,它无法读取数据字节,我的代码如下。

private static boolean Rt_Request(int id,Object client)throws Exception  
{ 

int size=5; 

byte[] buf=new byte[size];

char[] cbuf=new char[32]; 

int byteRead; Socket s=(Socket)client;


BufferedReader in1= new BufferedReader(new InputStreamReader(s.getInputStream()));

PrintStream out=new PrintStream(s.getOutputStream());

try {
    buf[0]=0x02;            
    buf[1]=0x09;            
    buf[2]=0x01;            
    buf[3]=0x00;            
    buf[4]=0x03;
    Thread.sleep(5000);

    out.write(buf, 0, 5);      
} catch(Exception e) {        
     System.out.println("Error Occured...."+e);                             
}

byteRead=0;

while(byteRead!=1) {
        try {

            byteRead=in1.read(cbuf, 0, 1);// Have problem on this line,here I am unable to read data bytes.
            for(int i=0;i<byteRead;i++)
            {
            System.out.println(cbuf[i]);
            }
            if(byteRead==0)
            {
                System.out.println("Breaking.....");
                return false;
            }         
        }
        catch(Exception e) {
            System.out.println("Error Occured...."+e);
            return false;
        }

    }       
        return true;   
    } catch(Exception e) {
        System.out.println("System is not Connected..."+e);
        return false;
    }

几乎尝试了所有套接字未关闭的东西,read.available();,read.fully(); 等..无法得到解决方案。我在TimerTask类的run方法中编写了这个函数。任何帮助将不胜感激

4

4 回答 4

0

read()阻塞直到至少有一个字节可用。也许您还没有发送它,或者没有正确刷新它,或者您正在BufferedReaders同一个套接字上创建多个。

成功后NBbytesRead永远不能为零read(cbuf, 0, 1).

于 2013-04-15T23:12:03.213 回答
0
byteRead=in1.read(cbuf, 0, 1);

此行仅读取一个值,并且由于在进入 for 循环之前您不会再次调用它,因此您应该在 stdout 中显示读取的值的 1 个 println。

于 2013-04-15T06:32:25.960 回答
0

如果没有数据可用,底层InputStream的读取方法将阻塞(即挂起/等待)。

在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。

我强烈怀疑是这种情况。您可以通过调用in1.ready()读者来检查这一点。

刷新输出缓冲区

out.flush();

写入字节后,或者它们可能会在本地缓冲。

于 2013-04-15T07:52:26.550 回答
0

javadocs说 BufferedReader#read(char[], int, int) 返回:读取的 字符数,如果已到达流的末尾,则为 -1

既然你这样做了

byteRead=in1.read(cbuf, 0, 1);

while(byteRead!=1)

将其更改为

while(byteRead != -1)
于 2013-04-15T06:28:41.107 回答