簡體   English   中英

服務器套接字在客戶端輸入之前讀取其輸出。 套接字讀/寫命令?

[英]Server socket reading its output before client input. Socket reading/writing ordering?

我有一個使用兩個通訊方式的套接字設置的客戶端-服務器模型。

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

此過程在一個循環中,並且與第一次迭代完美配合,盡管在第二次迭代中我收到以下錯誤:

Java.net.SocketException:軟件導致連接中止:套接字寫入錯誤

我認為正在發生的事情是,當服務器返回讀取字數組(#2)時,其讀取的是先前發送的布爾值(#3)或客戶端先前發送的圖像(#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);

}

}

output.writeObject("False");

幾乎應該是

output.writeBoolean(false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM