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();
}
}
}
连接已成功建立,但在服务器代码行
中ins=new ObjectInputStream(cli.getInputStream());
代码停止并且不继续,可能是什么问题?
答案 0 :(得分:28)
您需要在连接两侧的ObjectOutputStream
之前创建ObjectInputStream
(!)。创建ObjectInputStream
后,它会尝试从InputStream
读取对象流标题。因此,如果尚未创建另一侧的ObjectOutputStream
,则没有要读取的对象流标头,并且它将无限期地阻塞。
或者用不同的方式表达:如果双方首先构造ObjectInputStream
,则两者都将阻止尝试读取对象流标题,在创建ObjectOutputStream
之前不会写入该标题(另一方面)一边);这将永远不会发生,因为双方都在ObjectInputStream
的构造函数中被阻止。
这可以从ObjectInputStream(InputStream in)
的Javadoc中推断出来:
从流中读取序列化流标头并进行验证。此构造函数将阻塞,直到相应的ObjectOutputStream已写入并刷新标头。
Esmond Pitt的 Java基础网络第3.6.2节对此进行了描述。
答案 1 :(得分:-1)
您必须为流进行握手。我的意思是,在客户端,当您创建对象输入流时,必须在服务器端创建对象输出流。
LSTM
我试图展示如何为流进行握手。