2010-07-06 52 views
1

我有一个等待客户端连接的最小服务器,然后他启动一个线程,将回复给客户端的答复,问题是答复。Java - 套接字 - 冻结

这是服务器的代码:路过

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是插座“链接”参数在服务器代码

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循环,客户端冻结在line:valid = answerI.readInt();

任何人都可以帮助我吗?

预先感谢您

+0

[什么是调试器,它如何帮助我诊断问题](http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help -me-diagnose-problems) – Raedwald 2016-01-29 03:38:59

回答

0

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

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

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

+0

谢谢!现在它工作! – michele 2010-07-06 21:18:18

0

在这个协议中,如果它总是'1'则不需要回复。只需关闭插座。客户端应该阻塞在read()中,当服务器关闭套接字时,它将返回-1。

+0

答复不会总是1,我已经把1用于测试协议,目前我在服务器和客户端分别关闭输入流和输出流,例如: 1 - 客户端发送mex到服务器然后关闭所述输出流 2 - 服务器接收MEX然后关闭的InputStream, 3 - 服务器打开一个OutputStream和客户端打开的InputStream 4 - 服务器发送应答返回给客户端。 现在它工作:)谢谢! – michele 2010-07-08 01:28:37