我在流中等待数据这样一种奇怪的方式......因为我认为每次尝试流都会抛出异常readObject()
不是一个好主意。这就是为什么我使用PushBackInputStream
并且每10毫秒从该流读取一个byte
。使用ObjectInputStream等待来自套接字的数据
@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()) {
...
我做了什么错流......我得到一个异常:
Exception in thread "Thread-0" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to java.util.ArrayList
at com.rizhov.main.ClientHandler.run(ClientHandler.java:39)
在代码的一部分:
ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject();
我在做什么错?有没有更好的解决方案来等待数据。
UPDATE:
ArrayList<Object> arrList = null;
for (;;) {
try {
arrList = ((ArrayList<Object>) ois.readObject());
break;
} catch (Exception e) {
}
}
int command = (Integer) arrList.get(0);
是的。双流包装是一个错误,现在我以这种方式修正了我的代码(这在上面)......但是我认为这对于真正的数据处理来说太慢了...... –
它可能太慢了,但它可能超过了足够快。这取决于你的要求。 –