Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 第二次从套接字inputstream获取的BuffereImage给出的值为null_Java_Sockets_Bufferedimage - Fatal编程技术网

Java 第二次从套接字inputstream获取的BuffereImage给出的值为null

Java 第二次从套接字inputstream获取的BuffereImage给出的值为null,java,sockets,bufferedimage,Java,Sockets,Bufferedimage,我有一个问题,我似乎无法自己解决,所以我转向stackoverflow 我想我的头衔说明了一切。第二次尝试获取BuffereImage时,我从inputstream接收的值为null 我试着检查我的另一个java文件中的outputstream是否有问题。然而,我不认为有一个,因为我没有收到任何错误或问题的图像被发送到outputstream 我在下面添加代码 公共类控制器软件{ 插座连接插座; 公共布尔值isConnected=false; 公共静态无效字符串[]args{ controlle

我有一个问题,我似乎无法自己解决,所以我转向stackoverflow

我想我的头衔说明了一切。第二次尝试获取BuffereImage时,我从inputstream接收的值为null

我试着检查我的另一个java文件中的outputstream是否有问题。然而,我不认为有一个,因为我没有收到任何错误或问题的图像被发送到outputstream

我在下面添加代码

公共类控制器软件{ 插座连接插座; 公共布尔值isConnected=false; 公共静态无效字符串[]args{ controllerSoft cont=新controllerSoft; cont.gui; } 公共用户界面{ JFrame=新的JFrameController软件; JPanel主面板=新JPanel; JPanel imagePanel=新的JPanel; JPanel controllerPanel=新的JPanel; JButton takePictureBtn=新的JButtonTake屏幕截图; JButton connectBtn=新的JButtonConnect; frame.addmainPanel; mainPanel.addimagePanel; mainPanel.addcontrollerPanel; controllerPanel.addtakePictureBtn; controllerPanel.addconnectBtn; mainPanel.setLayoutnew GridLayout2,2; frame.setVisibletrue; frame.setDefaultCloseOperationJFrame.DISPOSE\u ON\u CLOSE; frame.setSize700700; imagePanel.setBorderBorderFactory.CreateLoweredBevelOrder; controllerPanel.setBorderBorderFactory.CreateRaisedBevelOrder; setUpActionListenertakePictureBtn、connectBtn、imagePanel; } 公共无效设置ActionListenerJButton takePictureBtn、JButton connectBtn、JPanel imagePanel{ connectBtn.AddActionListener新建ActionListener{ public void actionPerformedjava.awt.event.ActionEvent e{ 建立联系; } }; takePictureBtn.AddActionListener新建ActionListener{ public void actionPerformedjava.awt.event.ActionEvent e{ 如果断开连接{ 试一试{ boolean shouldStart=true;//我通过套接字发送的布尔值 /*通过套接字发送布尔值。Receiver接受布尔值并启动while循环*/ ObjectOutputStream outputStream=新建ObjectOutputStreamconnectionSocket.getOutputStream; outputStream.WriteObject应启动; outputStream.flush; /*如果imagePanel有任何子项,那么我应该删除它们,因为在任何时候都只有一个子项存在*/ imagePanel.removeAll; GetandDisplayImagePanel; }捕获IOException异常{ System.out.printlnexception; } }否则{ JOptionPane.showMessageDialogtakePictureBtn,必须与另一方建立连接。。。; } } }; } 公共连接{ 试一试{ connectionSocket=新的Socketlocalhost,4000; System.out.printlconnection成功!; 断开连接=正确; }捕捉异常{ System.out.PrintLn连接失败…\t+e; } } public void getAndDisplayImageJPanel imagePanel{ /*我在这里显示图像*/ 试试{ 缓冲图像img; img=ImageIO.readImageIO.createImageInputStreamconnectionSocket.getInputStream; /*第二次尝试调用img时,它返回null…为什么*/ System.out.printlnimage是:\t+img; imagePanel.addnew JLabelnew ImageIconimg; imagePanel.revalidate; }捕捉异常{ System.out.println无法显示图像:\t+e; } } } 公共类listenUnit{ 服务器套接字服务器套接字; 插座控制器插座; 公共布尔值shouldEnd=false; 公共布尔值shouldStart=false; 公共布尔值shouldWait=true; 公共静态无效字符串[]args{ listenUnit=新的listenUnit; 单元连接; } 公共连接{ 试一试{ serverSocket=newserversocket4000; controllerSocket=serverSocket.accept; System.out.printlconnection成功!; 等一下!该结束了吗{ /*将布尔值shouldStart通过套接字发送到controllerSoft.java*/ ObjectInputStream ObjectInputStream=新ObjectInputStreamcontrollerSocket.getInputStream; 试一试{ 布尔ReceivedBoolean=布尔对象InputStream.readObject; shouldStart=receivedboolean; System.out.printlnshouldStart为:+shouldStart; }第C条 拉斯诺芬奇{ 未找到System.out.printlnClass:\t+e; } 如果应该开始{ getAndSendImage; shouldStart=false; }否则{ /*如果“应该开始”不是真的,我就等它出现*/ 试一试{ System.out.printlnBoolean shouldStart还不是真的。。。; TimeUnit.SECONDS.sleep2; }捕捉中断异常{ System.out.PrintLnseep计时器被中断:\t+e; } } } }捕捉异常{ System.out.printlnConnection失败:\t+e; } } 公共无效getAndSendImage{ /*这里我们截图*/ int-sizeX=350; int-sizeY=650; 试一试{ BuffereImage image=new Robot.createScreenCapturenew RectangleToolkit.getDefaultToolkit.getScreenSize; System.out.printlnClick!拍摄的图像!+图像; 试一试{ Image tmp=Image.getScaledInstancesizeY,sizeX,Image.SCALE\u SMOOTH; BuffereImage newImage=新BuffereImage大小、大小、BuffereImage.TYPE_INT_ARGB; Graphics2D g2d=newImage.createGraphics; g2d.drawImagetmp,0,0,null; g2d.dispose; ImageIO.writenewImage,png,controllerSocket.getOutputStream;//这一个发送图像 controllerSocket.getOutputStream.flush; System.out.printlnick!已发送图像!+新建图像; }捕捉异常{ System.out.PrintLn未能收缩图像:\t+e; } }捉迷迭香{ System.out.PrintLn拍摄屏幕截图失败:\t+e; } } }
好的,我找到了问题的答案。如果我在takePictureBtn上单击一次,它会给出正确的结果。第二次和第三次它给了我一个空值,但是第四次我点击按钮,它决定给我正确的结果

我不知道是什么原因导致了这个问题,但从现在起,我可能能够自己解决这个问题

谢谢 布德瓦尔

我现在找到了解决问题的办法。它工作得很好

    public void getAndDisplayImage(JPanel imagePanel)
{
    /*Here I display the image*/
    boolean canReadImage = false;
    try
    {   
        while(!canReadImage)
        {
            BufferedImage img;
            img = ImageIO.read(ImageIO.createImageInputStream(connectionSocket.getInputStream()));
            while(img != null)
            {
                /*The second time I try to call img it returns as null...why?*/
                System.out.println("image is:\t" + img);
                imagePanel.add(new JLabel(new ImageIcon(img)));
                imagePanel.revalidate();
                canReadImage = true;
                break;
            }
        }
    }
    catch(IOException e)
    {
        System.out.println("Couldnt display the image:\t" + e);
    }
}

我的猜测是,一旦你的代码是不确定的。请发表一篇文章。我编辑了我的问题。@hotzst很好的建议和提示。[mcve]在一条评论中,汽车消费到。OP:最新编辑不包括MCVE。可以将MCVE复制/粘贴到IDE中,如果它是运行时问题,则进行编译,然后运行以查看问题。