当前位置: 首页 > 知识库问答 >
问题:

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

程举
2023-03-14

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

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

这个过程在一个循环中,与第一次迭代完美配合,但在第二次迭代中,我得到了以下错误:

JAVA网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);

}

}

共有1个答案

狄飞鹏
2023-03-14
output.writeObject("False");

几乎可以肯定

output.writeBoolean(false);
 类似资料:
  • 我有两个通过字符串与套接字通信的Java项目。一个是客户端,另一个是服务器。服务器通过“ServerSocket”接受连接,并使用新创建的“套接字”创建新的“会话”(线程)。 同时,客户端只有一个“套接字”,一旦连接了这个套接字,客户端就会创建一个“ClientSession”(线程,非常类似于“session”)。 我想要的是服务器通过“username”字符串询问客户机他的用户名,客户机用他的

  • 我已经看到了很多与我试图做的事情有关的问题,但我还没有找到任何解决方案。 我尝试编写两个套接字程序(一个客户端和一个服务器),以便服务器能够向客户端发送任何类型的文件(按字节)。我不确定如何构建/协调以下内容: > (在服务器中)读取语句从文件中获取数据(我使用fread()) (在服务器中)将数据发送到客户端的write语句(我使用的是write()) (在客户端)读取语句从服务器接收数据(我使

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 我有java服务器和只有一个客户端的时间。 客户端连接并发送卡ID(在服务器端阻止读取是合适的,因为当时只有一个客户端)

  • 在我的客户端/服务器应用程序中,我的客户端wiil与服务器通信有两个功能:客户端要么向服务器请求数据,要么发送数据,以便服务器保存。我对这两种方法都使用一个套接字,要使用的方法由发送的第一个字节定义。如果第一个字节是“1”,它将请求数据。如果是“2”,它将发送数据(数据字节在“2”字节之后发送)。它非常适合发送数据。但是当我请求数据时,只要我不读取客户端中的套接字流,它就可以工作。这就像如果我在发

  • 我正在尝试创建一个非常基本的JavaFTP服务器。 处理传入套接字、接受它并将其转换为客户机线程的代码似乎工作得很好,但由于某些原因,当我尝试发送欢迎消息时,数据似乎没有到达客户机。 我在控制台中看到它正在运行并试图发送欢迎消息,但是FileZilla(我用来连接的FTP客户端)通常位于: === 编辑 欢迎信息非常基本:发送(“220欢迎使用FTP服务器”); 我试图只包含相关的代码,因为在这里