ObjectInputStream 在 Java 线程中失败
ObjectInputStream fails in Java Thread
我无法从套接字获取输入和输出流,我的代码每次到达 getInputStream/getOutputStream 时都会阻塞。
class Connection implements Runnable {
private static final Logger logger = Logger.getLogger(Connection.class.getName());
Socket connection = null;
Boolean serverIsDown = false;
Thread thread = null;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
Context ctx = null;
public Connection(Socket accept, Boolean serverIsDown) {
logger.log(Level.INFO, "Connected" + accept.getRemoteSocketAddress());
this.connection = accept;
this.serverIsDown = serverIsDown;
this.thread = new Thread(this, "Client Connection");
this.thread.start();
}
public void init() throws IOException {
while (true) {
System.out.println("Hit enter to send object");
System.in.read();
Request request = new Request();
oos.writeObject(request);
}
}
@Override
public void run() {
try {
this.ois = new ObjectInputStream(this.connection.getInputStream()); //Blocks here
this.oos = new ObjectOutputStream(this.connection.getOutputStream());
this.init();
} catch (IOException e) {
e.printStackTrace();
}
}
}
阻塞时没有输出错误。
创建一个从指定 InputStream 读取的 ObjectInputStream。 序列化流 header 从流中读取并验证。 此构造函数 将阻塞,直到相应的 ObjectOutputStream 已写入并刷新 header.
我建议您使用两个线程处理来自已接受套接字的输入和输出流,以避免阻塞。另一种更好的方法是使用线程池和一些异步 io(例如;选择器),而不是为每个接受的套接字分配一个线程。
另请参阅其他post如下:
new ObjectInputStream() blocks
您为每个 object 创建一个新流。只创建一个输出和一个输入流。 Object 个流发送 header 个数据,这些数据在您创建新流时可能已损坏。
我无法从套接字获取输入和输出流,我的代码每次到达 getInputStream/getOutputStream 时都会阻塞。
class Connection implements Runnable {
private static final Logger logger = Logger.getLogger(Connection.class.getName());
Socket connection = null;
Boolean serverIsDown = false;
Thread thread = null;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
Context ctx = null;
public Connection(Socket accept, Boolean serverIsDown) {
logger.log(Level.INFO, "Connected" + accept.getRemoteSocketAddress());
this.connection = accept;
this.serverIsDown = serverIsDown;
this.thread = new Thread(this, "Client Connection");
this.thread.start();
}
public void init() throws IOException {
while (true) {
System.out.println("Hit enter to send object");
System.in.read();
Request request = new Request();
oos.writeObject(request);
}
}
@Override
public void run() {
try {
this.ois = new ObjectInputStream(this.connection.getInputStream()); //Blocks here
this.oos = new ObjectOutputStream(this.connection.getOutputStream());
this.init();
} catch (IOException e) {
e.printStackTrace();
}
}
}
阻塞时没有输出错误。
创建一个从指定 InputStream 读取的 ObjectInputStream。 序列化流 header 从流中读取并验证。 此构造函数 将阻塞,直到相应的 ObjectOutputStream 已写入并刷新 header.
我建议您使用两个线程处理来自已接受套接字的输入和输出流,以避免阻塞。另一种更好的方法是使用线程池和一些异步 io(例如;选择器),而不是为每个接受的套接字分配一个线程。
另请参阅其他post如下: new ObjectInputStream() blocks
您为每个 object 创建一个新流。只创建一个输出和一个输入流。 Object 个流发送 header 个数据,这些数据在您创建新流时可能已损坏。