Java创建一个新的ObjectInputStream块 [英] Java Creating a new ObjectInputStream Blocks
问题描述
我正在尝试使用从Socket检索的InputStream创建一个新的ObjectInputStream。这是我的代码:
这是我的MessageGetterSender类的构造函数。程序没有到达Checkpoint 4。
public MessageGetterSender(Socket socket){
系统。 out.println(MessageGetterSender:Checkpoint 1);
this.socket = socket;
//获取输入和输出流
try {
System.out.println(MessageGetterSender:Checkpoint 2);
InputStream is = socket.getInputStream();
System.out.println(MessageGetterSender:Checkpoint 3);
this.in = new ObjectInputStream(is);
System.out.println(MessageGetterSender:Checkpoint 4);
} catch(IOException ioe){
System.out.println(无法在套接字上获取ObjectInputStream:+ socket.getLocalPort());
}
try {
this.out = new ObjectOutputStream(socket.getOutputStream());
} catch(IOException ioe){
System.out.println(Could not get ObjectOutputStream on socket:+ socket.getLocalPort());
}
System.out.println(MessageGetterSender:Checkpoint 5);
}
我正在从我连接到的类实例化一个新的MessageGetterSender对象一个服务器来获取套接字。以下是相关代码。它是InstantMessageClass的构造函数,即实例化MessageGetterSender对象的类:
public InstantMessageClient(String username){
try {
socket = new Socket(localhost,5555);
} catch(IOException ioe){
System.out.println(错误:无法连接到端口上的套接字+ serverPort);
}
messageGetterSender = new MessageGetterSender(socket);
...
由于代码不执行到Checkpoint 4,它确实到了Checkpoint 3,我很确定ObjectInputStream的实例化是罪魁祸首。我不知道为什么。有任何想法吗?感谢您的帮助。
当您构建一个 ObjectInputStream
该类的构造函数尝试读取连接另一端相关联的 ObjectOutputStream
的头文件。它将不会返回,直到该标题已被读取。因此,如果您看到构造函数挂起,那是因为套接字的另一端还没有使用 ObjectOutputStream
,还没有刷新数据。 / p>
I'm trying to create a new ObjectInputStream using an InputStream retrieved from a Socket. Here is my code:
This is the constructor for my MessageGetterSender class. The program does not get to Checkpoint 4.
public MessageGetterSender(Socket socket) {
System.out.println("MessageGetterSender: Checkpoint 1");
this.socket = socket;
// Get input and output streams
try {
System.out.println("MessageGetterSender: Checkpoint 2");
InputStream is = socket.getInputStream();
System.out.println("MessageGetterSender: Checkpoint 3");
this.in = new ObjectInputStream(is);
System.out.println("MessageGetterSender: Checkpoint 4");
} catch (IOException ioe) {
System.out.println("Could not get ObjectInputStream on socket: " + socket.getLocalPort());
}
try {
this.out = new ObjectOutputStream(socket.getOutputStream());
} catch (IOException ioe) {
System.out.println("Could not get ObjectOutputStream on socket: " + socket.getLocalPort());
}
System.out.println("MessageGetterSender: Checkpoint 5");
}
I'm instantiating a new MessageGetterSender object from a class in which I connect to a server to get the socket. Here is the relevant code. It is the constructor for the InstantMessageClass, the class that instantiates the MessageGetterSender object:
public InstantMessageClient(String username) {
try {
socket = new Socket("localhost", 5555);
} catch (IOException ioe) {
System.out.println("Error: Could not connect to socket on port: " + serverPort);
}
messageGetterSender = new MessageGetterSender(socket);
...
Since the code does not execute to Checkpoint 4 but it does get to Checkpoint 3, I'm pretty sure the instantiation of the ObjectInputStream is the culprit. I cannot figure out why though. Any ideas? Thanks for the help.
When you construct an ObjectInputStream
, in the constructor the class attempts to read a header that the associated ObjectOutputStream
on the other end of the connection has written. It will not return until that header has been read. So if you are seeing the constructor 'hang', it's because the other side of the socket either hasn't used an ObjectOutputStream
, or hasn't flushed the data yet.
这篇关于Java创建一个新的ObjectInputStream块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!