2014-02-13 35 views
0

我有一個客戶端 - 服務器模型設置使用一個套接字與雙向通信。客戶端輸入前讀取其輸出的服務器套接字。套接字讀/寫順序?

它應該是這樣的: 1.客戶端 - 送話 的陣列2.服務器 - 讀單詞的排列 3.服務器 - 發送布爾 4.客戶端 - 讀布爾 5.客戶端 - 發送圖像 6.服務器 - 讀取圖像

這個過程是一個循環內,並與第一次迭代的作品完美,但與第二次迭代我收到以下錯誤:

java.net.SocketException異常:軟件導致連接中斷:套接字寫入錯誤

我認爲正在發生的事情是,當服務器重新讀取它在之前發送的布爾值(#3)或客戶端以前發送的圖像(#2)中的讀數(# 5)。如果是這種情況,是否有人知道這個問題的解決方案?我想也許使用兩個套接字可以解決這個問題,但是我再也不知道如何使用兩個套接字來實現它!我有點新手!

我在下面的程序中標記了執行順序。

客戶

private void whileConnected() throws IOException{ 
     do{         
       analyser.start(); 
       boolean takeScreenShot = false; 

       if(analyser.isCaptured) 
       { 
        **output.writeObject(analyser.getCapturedText()); // 1** 
        output.flush(); 

        **takeScreenShot = input.readBoolean(); //4** 

        if(takeScreenShot == true); 
        { 
         ScreenShot ss = new ScreenShot(); 
         BufferedImage screenShot = ss.getScreenShot(); 
         if(screenShot != null) 
         { 
          **ImageIO.write(screenShot, "png",output); // 5** 
          output.flush(); 
         } 

        } 
       } 

       try { 
        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

     }while(true); 
    } 

服務器

private void whileConnected() throws IOException { 
    do { 
     try { 

      analyserDetail = new AnalyserDetail(); 

      **analyserDetail.text = (String[]) input.readObject(); // 2** 


      if(analyserDetail.text != null) 
      { 
       analyserDetail.username = "Michael"; 
       analyserDetail.positionFound = new ArrayList<Integer>(); 
       analyserDetail.wordsFound = new ArrayList<String>(); 
       analyserDetail.wordCount = 0; 

       findProfanity(); 

       if(analyserDetail.wordCount > 0) 
       { 
        new CreateReport(analyserDetail); 
        //output.writeObject(new Boolean(true)); 
        **output.writeBoolean(true); // 3** 
        output.flush(); 
        output.reset(); 
        **BufferedImage screenShot = ImageIO.read(input); //6** 

        if(screenShot != null) 
        { 
        java.util.Date today = Calendar.getInstance().getTime(); 
         SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); 
         String reportName = formatter.format(today); 
         new StoreScreenShot(screenShot,reportName); 
        } 
       }else 
       { 
        output.writeObject("False"); 
        output.flush(); 
       } 

      } 

      analyserDetail = null; 

     } catch (ClassNotFoundException c) { 
      System.out.println("\nI dont know wtf was sent!"); 
     } 
    } while (true); 

} 

}

回答

0
output.writeObject("False"); 

幾乎應該是

output.writeBoolean(false); 
+0

CH雖然這不是問題,但我的循環的第一次迭代中的所有內容都讀入了它的預期內容。它在服務器嘗試讀取** analyserDetail.text =(String [])input.readObject()時崩潰; // 2 ** ..我認爲它的讀數是來自** output.writeBoolean(true)的布爾值; // 3 **或來自** ImageIO.write(screenShot,「png」,output)的圖像; // 5 **,並且正在崩潰,因爲它試圖將前兩者中的任何一個轉換爲(String []) – user3253722

相關問題