客户端输入前读取其输出的服务器套接字套接字读/写顺序?

时间:2014-02-13 14:28:04

标签: java sockets inputstream serversocket outputstream

我使用一个带双向通信的套接字设置了客户端 - 服务器模型。

它应该是这样的: 1.客户端 - 发送单词数组 2.服务器 - 读取单词数组 3.服务器 - 发送布尔值 4.客户端 - 读取布尔值 5.客户端 - 发送图像 6.服务器 - 读取图像

此过程在循环内并与第一次迭代完美配合,但在第二次迭代时我得到以下错误:

Java.net.SocketException:软件导致连接中止:套接字写入错误

我认为正在发生的事情是当服务器重新读取单词数组(#2)时,读取它先前发送的布尔值(#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);

}

}

1 个答案:

答案 0 :(得分:0)

output.writeObject("False");

几乎可以肯定是

output.writeBoolean(false);