【发布时间】:2011-11-21 09:02:17
【问题描述】:
我正在从套接字读取消息(通过 TCP 协议),但我注意到 CPU 花费大量时间来调用 BufferedInputStream 的方法 available()。这是我的代码:
@Override
public void run()
{
Socket socket;
Scanner scanner;
BufferedInputStream buffer = null;
try
{
socket = new Socket(SERVER_HOST, SERVER_PORT);
System.out.println("Connection Completed");
InputStream inputStream = socket.getInputStream();
buffer = new BufferedInputStream(inputStream);
StringBuilder readCharacter;
while (true)
{
readCharacter = new StringBuilder();
try
{
while (buffer.available() > 0)
{
readCharacter.append((char) buffer.read());
}
}
catch (IOException e)
{
e.printStackTrace();
buffer.close();
}
String array[] = separe(new String(readCharacter));
... //parsing the message
我也尝试使用 int read=buffer.read() 并检查 if (read!=-1) 而不是使用可用函数,但在这种情况下,我无法识别消息的结尾...在我的 StringBuilder 'readCharacter ' 我有不止一条消息,一个接一个..它导致我的解析过程失败......
而不是使用available() 检查,进入readCharacter 我一次只有一条消息......并且解析工作......
你能帮我理解为什么,以及如何避免 CPU 被吃掉吗?
【问题讨论】:
-
那么,尝试使用 .read() 方法在 while 循环内进行解析。
-
嗨..你的意思是保持 available() 检查或使用 read()!=-1 ??但是我已经尝试了这两种方法,但它们都不起作用
-
有一个常见的误解,即您可以通过数据之间的停顿来暗示消息何时开始和结束。您不能发送字节流的消息,只能发送字节。您只能通过阅读内容来确定消息的开始和结束时间。
-
你能解释一下吗??你说我必须使用另一种机制来处理消息??
标签: java sockets tcp bufferedinputstream