2015-01-13 85 views
0

我正在編寫Socket程序,此處客戶端通過流發送字符串,服務器對其進行處理並寫回客戶端。我的問題是,服務器進程String後,它寫回流,但在客戶那可不一定能讀取流的顯示異常,因爲Exception in while: java.net.SocketException: socket closed這裏是我的代碼,如何保持Socket連接,直到服務器處理它?

客戶端,

public void run() { 
    while (true) { 
     try { 
      // Open your connection to a server, at port 1231 
      s1 = new Socket("localhost", 1231); 

      OutputStream s1out = s1.getOutputStream(); 
      DataOutputStream dos = new DataOutputStream(s1out); 
      InputStream in=s1.getInputStream(); 
      DataInputStream dis=new DataInputStream(in); 

      String s = br.readLine(); 
     dos.writeUTF(s); 
     dos.flush(); 
     dos.close(); 

      System.out.println(dis.readUTF());//it is the String from Server after processing 
      dis.close(); 

     } catch (IOException ex) { 
      // Logger.getLogger(SimpleClient.class.getName()).log(Level.SEVERE, null, ex); 
      System.out.println("Exception in while: " + ex); 
     } 
    } 

在服務器

public void run() 
    { 


     while(true){ 
      try { 

       System.out.println("Waiting for connect to client"); 
       s1=serverSocket.accept(); 


       s1In = s1.getInputStream(); 
       dis = new DataInputStream(s1In); 

       out=s1.getOutputStream(); 
       dos=new DataOutputStream(out); 

       String clientData=dis.readUTF(); 

       //processing task String 

       dos.writeUTF("Bus Registered Successfully"); 
       dos.flush(); 

      } 
      } 

在這裏,我不能夠在客戶端讀取Bus Registered Successfully。如何解決這個問題。?

回答

1

那麼在你的程序中有很多東西是不正確的。但首先讓我回答你的問題......你剛剛寫入流後關閉套接字...所以服務器拋出異常,只需在dos.flush();之後刪除dos.close();即可。它會運行良好。

現在又回到了編程實踐...

1)服務器應該接受在while(true)迴路的連接,然後創建一個新的線程。所以下面的聲明應該是而不是run方法的一部分。

   System.out.println("Waiting for connect to client"); 
      s1=serverSocket.accept(); 


      s1In = s1.getInputStream(); 
      dis = new DataInputStream(s1In); 

      out=s1.getOutputStream(); 
      dos=new DataOutputStream(out); 

2)不需要在clientrun方法的。因爲每個新客戶都將擁有自己的variablessocket

+0

非常感謝。 。 – Raghu

+0

是否可以,如果我寫'serverSocket.accept();'while while循環之前? ,但我的需求是客戶端可以隨時發送數據,所以服務器應該可以隨時接受它。 – Raghu

+0

檢查更新的答案。 'serverSocket.accept();'不應該是'run'方法的一部分(至少如果你想要多個客戶端服務器)。 – Junaid

0

快速查看顯示插座關閉的原因是因爲您使用了dos.close()

關閉一個DataInputStream所(或的PrintStream,或者任何similiar流)將關閉底層套接字。

只要拿出dos.close()

您也可以將dos.close()移動到try塊的最後。作爲一般規則,在套接字完成之前不要關閉與套接字有關的任何東西。

相關問題