Java 新的ObjectInputStream()块
客户呢Java 新的ObjectInputStream()块,java,sockets,objectinputstream,Java,Sockets,Objectinputstream,客户呢 public class SerProg { static ServerSocket ser=null; static Socket cli=null; static ObjectInputStream ins=null; static ObjectOutputStream outs=null; public static void main(String[] args) { try { ser=
public class SerProg {
static ServerSocket ser=null;
static Socket cli=null;
static ObjectInputStream ins=null;
static ObjectOutputStream outs=null;
public static void main(String[] args) {
try {
ser=new ServerSocket(9000,10);
cli=ser.accept();
System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort());
ins=new ObjectInputStream(cli.getInputStream());
outs=new ObjectOutputStream(cli.getOutputStream());
String str=(String)ins.readObject();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
连接已成功建立,但在服务器代码行中
public class SerProg {
/**
* @param args
*/
static ServerSocket ser=null;
static Socket cli=null;
static ObjectInputStream ins=null;
static ObjectOutputStream outs=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ser=new ServerSocket(9000,10);
cli=ser.accept();
System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort());
ins=new ObjectInputStream(cli.getInputStream());
outs=new ObjectOutputStream(cli.getOutputStream());
String str=(String)ins.readObject();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
代码停止且不继续,可能是什么问题???您需要在连接两侧的
ObjectInputStream
之前创建ObjectOutputStream
(!)。创建ObjectInputStream
时,它尝试从InputStream
读取对象流标题。因此,如果另一侧的ObjectOutputStream
尚未创建,则没有要读取的对象流头,它将无限期地阻塞
或者用不同的措辞:如果双方首先构造ObjectInputStream
,双方都将阻止尝试读取对象流标题,直到创建了ObjectOutputStream
(在行的另一侧)之后才会写入该标题;这永远不会发生,因为在ObjectInputStream
的构造函数中双方都被阻塞
这可以从以下的Javadoc中推断:
从流中读取序列化流头并进行验证。此构造函数将阻塞,直到相应的ObjectOutputStream写入并刷新标头
Esmond Pitt在Java基础网络的第3.6.2节中也描述了这一点。您必须为流进行握手。我的意思是,在客户端,当您创建一个对象输入流时,您必须在服务器端创建一个对象输出流
ins=new ObjectInputStream(cli.getInputStream());
我试图演示如何为流进行握手。我不明白为什么ObjectOutputStream和ObjectInputStream@benjarobin如果双方都首先构造
ObjectInputStream
,则双方都将阻止尝试读取对象流标头,在创建ObjectOutputStream
之前(在该行的另一侧)不会写入它;这将永远不会发生,因为双方都被阻塞在ObjectInputStream
的构造函数中。对不起,我误解了您的消息,对不起!!!你的评论很清楚,你应该在回答中加上它。我不知道客户端和服务器都在双向发送对象(我的错)您从我这里获得+1:-)我看到了许多重复的问题,它们都有相同的答案,不幸的是,这个解决方案不适合我,您还有其他建议吗?@danibilel在某些实现中,可能需要在创建ObjectOutputStream
后立即显式调用flush()
,然后再创建ObjectInputStream
。但是,在任何情况下,都必须在两端先构造出,然后再构造入,以防止相互等待。您已经完成了两次SerProg代码。不必是首先创建ObjectOutputStream
的客户端:它可以是任一端,但首先在两端创建它是最安全的。那你就不会有问题了。
//SERVER SIDE
Socket clientSocket = TcpServer.socket.accept();
// 1. input stream;
ObjectInputStream sInput = new ObjectInputStream(clientSocket.getInputStream());
// 2. output stream
ObjectOutputStream sOutput = new ObjectOutputStream(clientSocket.getOutputStream());
//CLIENT SIDE
Socket socket = new Socket(ip, port);
// 2. output stream
ObjectOutputStream sOutput = new (socket.getOutputStream());
// 1. input stream
ObjectInputStream sInput = new ObjectInputStream(socket.getInputStream());