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 这是我的邮箱..
查看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表明
有连接
但是没输送数据
阻塞表示等待传送数据
如果你对这些不明白的话
你的函数肯定用不对的
至少说明你的方法的逻辑是有问题的
返回值的产生
肯定是函数已经运行完毕了
那还阻塞个什么劲啊
返回值是-1表明
有连接
但是没输送数据
阻塞表示等待传送数据
如果你对这些不明白的话
你的函数肯定用不对的
至少说明你的方法的逻辑是有问题的
#3
你能不能把题目写清楚一点。
谁能看得懂啊。
socket的另一边可写这别写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();
谁能看得懂啊。
socket的另一边可写这别写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();
#4
你能不能把题目写清楚一点。
谁能看得懂啊。
socket的另一边可向这边写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();
谁能看得懂啊。
socket的另一边可向这边写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();
#5
在你使用这里的代码调用你的serverInput.read()之前
是不是在其他的地方试验下这个函数
或者你该检查下自己的代码到底出现什么问题了
是否得到了该数据流
是否有socket生成
是不是在其他的地方试验下这个函数
或者你该检查下自己的代码到底出现什么问题了
是否得到了该数据流
是否有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
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 这是我的邮箱..
查看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表明
有连接
但是没输送数据
阻塞表示等待传送数据
如果你对这些不明白的话
你的函数肯定用不对的
至少说明你的方法的逻辑是有问题的
返回值的产生
肯定是函数已经运行完毕了
那还阻塞个什么劲啊
返回值是-1表明
有连接
但是没输送数据
阻塞表示等待传送数据
如果你对这些不明白的话
你的函数肯定用不对的
至少说明你的方法的逻辑是有问题的
#3
你能不能把题目写清楚一点。
谁能看得懂啊。
socket的另一边可写这别写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();
谁能看得懂啊。
socket的另一边可写这别写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();
#4
你能不能把题目写清楚一点。
谁能看得懂啊。
socket的另一边可向这边写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();
谁能看得懂啊。
socket的另一边可向这边写数据了啊
ServlerSocket socket = new ServerSocke(33);
socket.getOutputStream();
#5
在你使用这里的代码调用你的serverInput.read()之前
是不是在其他的地方试验下这个函数
或者你该检查下自己的代码到底出现什么问题了
是否得到了该数据流
是否有socket生成
是不是在其他的地方试验下这个函数
或者你该检查下自己的代码到底出现什么问题了
是否得到了该数据流
是否有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
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
哎呀。。冒的人说话列。。。