Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从java tcp套接字中的输入流读取数据字节_Java_Tcp_Inputstream - Fatal编程技术网

无法从java tcp套接字中的输入流读取数据字节

无法从java tcp套接字中的输入流读取数据字节,java,tcp,inputstream,Java,Tcp,Inputstream,在我的服务器代码中,我向客户端发送不同的请求并返回响应,但只访问第一个读取请求,在访问第二个读取语句时,它无法读取数据字节,我的代码如下 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)cl

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

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;
    }

private静态布尔Rt_请求(int-id,对象客户端)引发异常
{ 
int size=5;
字节[]buf=新字节[大小];
char[]cbuf=新字符[32];
int byteRead;套接字s=(套接字)客户端;
BufferedReader in1=新的BufferedReader(新的InputStreamReader(s.getInputStream());
PrintStream out=新的PrintStream(s.getOutputStream());
试一试{
buf[0]=0x02;
buf[1]=0x09;
buf[2]=0x01;
buf[3]=0x00;
buf[4]=0x03;
睡眠(5000);
写出(buf,0,5);
}捕获(例外e){
System.out.println(“发生错误…”+e);
}
byteRead=0;
while(byteRead!=1){
试一试{
byteRead=in1.read(cbuf,0,1);//这行有问题,这里我无法读取数据字节。
对于(int i=0;isay BufferedReader#read(char[],int,int)返回:
读取的字符数,如果已到达流的结尾,则为-1

既然你这么做了

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

while(byteRead!=1)

换成

while(byteRead != -1)
这一行只读入一个值,因为在进入for循环之前您不会再次调用它,所以您应该得到在stdout中显示的读入值的1 println。

如果没有可用数据,则将阻塞(即挂起/等待)

此方法将一直阻止,直到输入数据可用、检测到文件结尾或引发异常为止

我强烈怀疑这种情况。 您可以通过在读卡器上调用1.ready()
来检查这一点

刷新输出缓冲区

out.flush();

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

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


NB
bytesRead
在成功的
读取(cbuf,0,1)后永远不能为零。

您告诉它只读取一个字节。cbuf是如何声明的?实际上我想读取32个字节,出于测试目的,我将32替换为1,char[]cbuf=new char[32];…这就是我声明cbuf的方式,我看不到前半段代码的相关性。我缺少什么吗?私有静态布尔Rt_请求(int id,对象客户端)抛出异常{int size=5;byte[]buf=new byte[size];char[]cbuf=new char[32];int byteRead;Socket s=(Socket)客户端;这是我之前跳过的,d概念是我发送5字节的实时请求,我想读取32字节的响应,首先我发送5字节的mac id请求,我可以成功读取5字节的响应。这是我在读取32字节时第二次遇到问题。这表明我的输入流中没有值,但d相同客户端在.NET中运行良好model@Reshma请不要这样做。您可以自己看到注释中的代码完全难以辨认。请将其编辑到您的帖子中。抱歉,但这没有帮助,我将其替换,但只要我一踏上这条语句,byteRead=in1.read(cbuf,0,32);那么它就不会再进一步,也不会给出任何结果。请尝试这样放置((byteRead=in1.read(cbuf,0,1))!=-1)我不知道这是否会起作用,但我一直这样使用它,不知道……只要我将该语句放入while循环,然后循环语句挂起……没有进一步的工作要做……是读取方法造成了问题,我想是这样。这就是将我的数据字节存储在cbuf中,这是一个32字节的缓冲区,然后我打印进去对于循环,我的主要问题是只要我一步执行这个语句byteRead=in1.read(cbuf,0,32);就不会执行进一步的操作,实际上它挂在那里,只有第一个请求我可以正确读取,所以不管它是32字节还是5字节的私有静态布尔Rt_请求(int-id,Object-client)抛出异常{int size=5;byte[]buf=new byte[size];char[]cbuf=new char[32];byte[]my_data=new byte[1];int byteRead;Socket s=(Socket)客户端;这是我之前没有粘贴的,我也使用了,但在1.ready挂起,实际上我的模型是java,还有一个模式是.NET,两个服务器都与客户端GPRS网关通信,但是.NET服务器接收所有响应,我无法接收多个响应,首先我得到了5字节MAC-ID请求的响应,然后我用32字节交换了该函数,得到了32字节的实时请求,但无法得到5字节的MAC-ID请求1.ready()应该返回true或false,您确定它挂起了吗?@flup…是的,它挂起了,当这个语句是access时,它就不会进一步介入。它是在运行时执行的,可能您的调试器没有要介入的源。您能打印或检查它的返回值吗?另外,当您希望它发送时,请刷新输出流。@EJP…是的,我有cr创建了多个BufferedReader,但它们通过不同的线程,这会影响…??一个流中的数据当然只能缓冲在一个缓冲区中。不要将多个读卡器放在同一个流中。
byteRead=in1.read(cbuf, 0, 1);