Java 正在使用ObjectInputStream等待来自套接字的数据
我正在以一种奇怪的方式等待流中的数据。。。因为我认为每次流尝试Java 正在使用ObjectInputStream等待来自套接字的数据,java,sockets,casting,streaming,Java,Sockets,Casting,Streaming,我正在以一种奇怪的方式等待流中的数据。。。因为我认为每次流尝试readObject()时抛出异常不是一个好主意。这就是为什么我使用PushBackInputStream,并且每10毫秒从该流中读取一个字节 @Override public void run() { try { ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream( clientSocket.getOutputStr
readObject()
时抛出异常不是一个好主意。这就是为什么我使用PushBackInputStream
,并且每10毫秒从该流中读取一个字节
@Override
public void run() {
try {
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(
clientSocket.getOutputStream()));
oos.flush();
ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
PushbackInputStream pis = new PushbackInputStream(clientSocket.getInputStream());
while (true) {
int tempByte = -1;
if ((tempByte = pis.read()) == -1) {
sleep(10);
} else {
pis.unread(tempByte);
ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject();
int command = (Integer) arrList.get(0);
if (command == CommandDescriptor.ADD_STRING.getCode()) {
String tempStr = (String) arrList.get(1);
boolean result = Server.colleciton.add(tempStr);
if (result) {
oos.writeInt(1);
oos.flush();
} else {
oos.writeInt(0);
oos.flush();
}
} else if (command == CommandDescriptor.REMOVE_STRING.getCode()) {
...
在代码的该部分:
ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject();
ArrayList arrList=(ArrayList)ois.readObject();
我做错了什么?是否有更好的解决方案来等待数据
更新:
ArrayList<Object> arrList = null;
for (;;) {
try {
arrList = ((ArrayList<Object>) ois.readObject());
break;
} catch (Exception e) {
}
}
int command = (Integer) arrList.get(0);
ArrayList arrList=null;
对于(;;){
试一试{
arrList=((ArrayList)ois.readObject());
打破
}捕获(例外e){
}
}
int命令=(整数)arrList.get(0);
一个流只能包装一次。如果你多次包装它,你很可能会感到困惑而不是有用
一旦流关闭,它就不会重新打开,因此读取字符以检查流是否已完成并丢弃它不是很有用。在操作将阻塞时休眠也不是很有用
我将使用枚举值,而不是使用Integer
代码。这将更干净,您将能够使用switch语句。您只能包装一次流。如果你多次包装它,你很可能会感到困惑而不是有用
一旦流关闭,它就不会重新打开,因此读取字符以检查流是否已完成并丢弃它不是很有用。在操作将阻塞时休眠也不是很有用
我将使用枚举值,而不是使用Integer
代码。这将更干净,您可以使用switch语句。不需要偷看和睡觉。这完全是在浪费你的时间和精力以及CPU的时间和空间
当没有数据时,所有Java流都会阻塞。它们的阻塞时间也完全正确,而不是一次阻塞10毫秒或任何时间,并且不会像您正在做的那样浪费CPU周期
你不必以任何方式或形式自己做任何事情。只需调用readObject()
永远不要忽略一个异常,没有必要偷看和睡觉。这完全是在浪费你的时间和精力以及CPU的时间和空间
当没有数据时,所有Java流都会阻塞。它们的阻塞时间也完全正确,而不是一次阻塞10毫秒或任何时间,并且不会像您正在做的那样浪费CPU周期
你不必以任何方式或形式自己做任何事情。只需调用readObject()
永远不要忽略一个IOException
是的。双流包装是一个错误,现在我用这种方式修复了我的代码(如上所述)。。。这是可行的,但我想这对于真正的数据处理来说太慢了……可能太慢了,但可能已经足够快了。这取决于你的要求。双流包装是一个错误,现在我用这种方式修复了我的代码(如上所述)。。。这是可行的,但我想这对于真正的数据处理来说太慢了……可能太慢了,但可能已经足够快了。这取决于您的要求。您的意思是我的流将等待新数据吗?如果流中没有数据,readObject()
会抛出异常吗?@Pavel我不仅是认真的,我说了。Javadoc也是如此。它将阻塞,直到数据到达。就叫它吧。当对等方关闭连接时,它将抛出EOFEException
。很简单。谢谢,@EJP!我不知道我怎么会错过那个!你的意思是我的流将等待新数据吗?如果流中没有数据,readObject()
会抛出异常吗?@Pavel我不仅是认真的,我说了。Javadoc也是如此。它将阻塞,直到数据到达。就叫它吧。当对等方关闭连接时,它将抛出EOFEException
。很简单。谢谢,@EJP!我不知道我怎么会错过那个!
ArrayList<Object> arrList = null;
for (;;) {
try {
arrList = ((ArrayList<Object>) ois.readObject());
break;
} catch (Exception e) {
}
}
int command = (Integer) arrList.get(0);