2010-07-06 54 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