Java - 套接字 - 冻结

时间:2010-07-06 20:15:33

标签: java sockets freeze

我有一个等待客户端连接的最小服务器,然后他启动一个线程,它会将回复发送回客户端,问题是回复。

这是服务器的代码:

 int port = 1234;
 ServerSocket servSock = null;
 servSock = new ServerSocket(port);       
  while (true) {
   Socket link = servSock.accept();
   serverThread st = new serverThread(link);
   st.start();
  }

这是线程的run()方法的代码,发送回答的代码,sk是服务器代码中参数传递的套接字“link”

 public void run() {
    String dato = "";
    InputStream i = null;
    try {
        i = sk.getInputStream();
    } catch (IOException ex) {
        Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
    }
        Scanner input = new Scanner(i);
     //i receive the data sent
        while (input.hasNext()) {
            dato += input.nextLine();
        }   
    // then i send a reply
    DataOutputStream outputStream=new DataOutputStream(sk.getOutputStream());
    outputStream.writeInt(1);
    outputStream.close();

客户端(只有应该从服务器接收答案的代码):

        Socket link;
        int valid = 0;
        String url="localhost";
        int port=1234;
        link = new Socket(InetAddress.getByName(url), port);

        //i've to send some data to the server
        PrintWriter output = new PrintWriter(link.getOutputStream(), true);
        String a = new String(Base64.encode(mex));
        output.println(createXml(tag, a));
        output.flush();


        //then i need to receive an answer from the server
        DataInputStream answerI = new DataInputStream(link.getInputStream());

        while(answerI.available()!=0)// but answerI.available() is always equal 0
           valid = answerI.readInt();

        answerI.close();
        output.close (); 
        link.close();

使用此代码,istruction valid = answerI.readInt();没达到。

没有while循环,客户端冻结在行:valid = answerI.readInt();

任何人都可以帮助我吗?

提前谢谢

2 个答案:

答案 0 :(得分:0)

我猜测服务器在调用input.hasNext()时被阻止了。当套接字关闭时,这将返回false,并且其InputStream返回-1以表示流的结束。但是,套接字仍处于打开状态。客户可以发送另一行; Scanner阻止查看客户的下一步行动。

有一些方法可以关闭套接字的“一半”,以便服务器可以告诉客户端已关闭其发送通道但仍可以收到响应。

然而,这种方法很复杂。我建议更改协议,以便服务器可以确定何时允许响应。

答案 1 :(得分:0)

在此协议中,如果始终为“1”,则不需要回复。只需关闭插座即可。客户端应该在read()中阻塞,当服务器关闭套接字时,它将返回-1。