socket.getInputStream()返回-1,而不阻塞,是什么情况,谢谢?

时间:2022-08-26 19:01:36
如题: 

socket.getInputStream()返回-1,而不阻塞,是什么情况,谢谢? 

我跟踪了下,发现读出的所有消息都是“-1”,根据java api所说,如果为-1,则没有数据,在没有数据的情况下,好像应该自动阻塞,但此种情况却没有阻塞。 什么个情况。 请各位帮忙。

byte[] lenBuffer=new byte[lenSize];
//读取消息长度
for(int i=0;i<4;i++)
{
//这里读出都是-1
 lenBuffer[i]= (byte)this.client.serverInput.read();
}
//消息长度
int messageLength = ConvertUtil.bytes2int(lens);
//
byte[] line=lenBuffer[messageLength];;
//读出所有消息
for(int i=lenSize;i<messageLength;i++) 
{
//这里读出所有也都是-1
line[i]=(byte)this.client.serverInput.read();
}



10 个解决方案

#1


1.
  查看API
public InputStream getInputStream()
                           throws IOException返回此套接字的输入流。 
如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。如果通道为非阻塞模式,则输入流的 read 操作将抛出 IllegalBlockingModeException。 

在非正常条件下,底层连接可能被远程主机或网络软件中断(例如,TCP 连接情况下的连接重置)。当网络软件检测到中断的连接时,将对返回的输入流应用以下操作: 

网络软件可能丢弃经过套接字缓冲的字节。网络软件没有丢弃的字节可以使用 read 读取。 

如果没有任何字节在套接字上缓冲,或者 read 已经消耗了所有缓冲的字节,则对 read 的所有后续调用都将抛出 IOException。 

如果没有任何字节在套接字上缓冲,并且没有使用 close 关闭套接字,则 available 将返回 0。 

关闭返回的 InputStream 将关闭关联套接字。 


返回:
从此套接字读取字节的输入流。 
抛出: 
IOException - 如果在创建输入流时发生 I/O 错误、没有关闭套接字、没有连接套接字或者使用 shutdownInput() 关闭了套接字输入
2.
  是否有异常

3.
  还不行。请发到 heigegaojian@163.com 这是我的邮箱..

#2


你没明白API中说明的事情
返回值的产生
肯定是函数已经运行完毕了
那还阻塞个什么劲啊
返回值是-1表明
有连接
但是没输送数据
阻塞表示等待传送数据

如果你对这些不明白的话
你的函数肯定用不对的

至少说明你的方法的逻辑是有问题的

#3


你能不能把题目写清楚一点。
谁能看得懂啊。
socket的另一边可写这别写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();

#4


你能不能把题目写清楚一点。
谁能看得懂啊。
socket的另一边可向这边写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();

#5


在你使用这里的代码调用你的serverInput.read()之前
是不是在其他的地方试验下这个函数
或者你该检查下自己的代码到底出现什么问题了
是否得到了该数据流
是否有socket生成

#6


首先,当与服务器端建立连接后,第一次读取数据正常,然后紧接着他就又去读数据。。。下面是第二次读数据日志:

2010-04-07 16:50:18,265 [DEBUG] [LongSocketMsgQueue.java] run : 43 -- -----------------------------准备接收OCS消息开始---------------------------
lenBuffer[0]-1
lenBuffer[1]-1
lenBuffer[2]-1
lenBuffer[3]-1
lenBuffer[4]-1
lenBuffer[5]-1
2010-04-07 16:50:18,265 [DEBUG] [LongSocket.java] run : 62 -- 收到的SOCKET消息长度{HEX}:00FFFFFF
2010-04-07 16:50:18,265 [DEBUG] [LongSocket.java] run : 64 -- 收到的消息长度{DEC}: 16777215
line[0]-1
line[1]-1
line[2]-1
line[3]-1
line[4]-1
line[5]-1

#7


读到的数据那个长度哦。。吓死人 16777215, 直接内存溢出。

#8


期待。。。。

#9


学习!

#10


哎呀。。冒的人说话列。。。

#1


1.
  查看API
public InputStream getInputStream()
                           throws IOException返回此套接字的输入流。 
如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。如果通道为非阻塞模式,则输入流的 read 操作将抛出 IllegalBlockingModeException。 

在非正常条件下,底层连接可能被远程主机或网络软件中断(例如,TCP 连接情况下的连接重置)。当网络软件检测到中断的连接时,将对返回的输入流应用以下操作: 

网络软件可能丢弃经过套接字缓冲的字节。网络软件没有丢弃的字节可以使用 read 读取。 

如果没有任何字节在套接字上缓冲,或者 read 已经消耗了所有缓冲的字节,则对 read 的所有后续调用都将抛出 IOException。 

如果没有任何字节在套接字上缓冲,并且没有使用 close 关闭套接字,则 available 将返回 0。 

关闭返回的 InputStream 将关闭关联套接字。 


返回:
从此套接字读取字节的输入流。 
抛出: 
IOException - 如果在创建输入流时发生 I/O 错误、没有关闭套接字、没有连接套接字或者使用 shutdownInput() 关闭了套接字输入
2.
  是否有异常

3.
  还不行。请发到 heigegaojian@163.com 这是我的邮箱..

#2


你没明白API中说明的事情
返回值的产生
肯定是函数已经运行完毕了
那还阻塞个什么劲啊
返回值是-1表明
有连接
但是没输送数据
阻塞表示等待传送数据

如果你对这些不明白的话
你的函数肯定用不对的

至少说明你的方法的逻辑是有问题的

#3


你能不能把题目写清楚一点。
谁能看得懂啊。
socket的另一边可写这别写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();

#4


你能不能把题目写清楚一点。
谁能看得懂啊。
socket的另一边可向这边写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();

#5


在你使用这里的代码调用你的serverInput.read()之前
是不是在其他的地方试验下这个函数
或者你该检查下自己的代码到底出现什么问题了
是否得到了该数据流
是否有socket生成

#6


首先,当与服务器端建立连接后,第一次读取数据正常,然后紧接着他就又去读数据。。。下面是第二次读数据日志:

2010-04-07 16:50:18,265 [DEBUG] [LongSocketMsgQueue.java] run : 43 -- -----------------------------准备接收OCS消息开始---------------------------
lenBuffer[0]-1
lenBuffer[1]-1
lenBuffer[2]-1
lenBuffer[3]-1
lenBuffer[4]-1
lenBuffer[5]-1
2010-04-07 16:50:18,265 [DEBUG] [LongSocket.java] run : 62 -- 收到的SOCKET消息长度{HEX}:00FFFFFF
2010-04-07 16:50:18,265 [DEBUG] [LongSocket.java] run : 64 -- 收到的消息长度{DEC}: 16777215
line[0]-1
line[1]-1
line[2]-1
line[3]-1
line[4]-1
line[5]-1

#7


读到的数据那个长度哦。。吓死人 16777215, 直接内存溢出。

#8


期待。。。。

#9


学习!

#10


哎呀。。冒的人说话列。。。