2009penguin 2023-05-05 22:15 采纳率: 54.5%
浏览 55

关于获取的图片可能为空的问题,如何解决?

问题:Server获取的图片可能为空
(排查过了)
RemoteScreenProjection_Client

package SRC;
//ClientMain.java

public class ClientMain {    
    static StartInterface SI = new StartInterface();
    static ModeSettings MS = new ModeSettings();
    static RemoteConnection RC;
    public static void main(String[] args) {        
        SI.setVisible(true);        
    }    

}
package SRC;
//ModeSettings.java
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.*;

public class ModeSettings extends JFrame{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    static JOptionPane P = new JOptionPane(null, JOptionPane.INFORMATION_MESSAGE);    
    static ButtonGroup bp = new ButtonGroup();
    static JRadioButton ScreenProjection = new JRadioButton("仅投屏");
    static JRadioButton RemoteControl = new JRadioButton("远程控制");
    static JButton Yes = new JButton("连接");
    static JButton Cancellation = new JButton("返回上一步");
    static JButton Exit = new JButton("退出");
    
    @SuppressWarnings("static-access")
    public ModeSettings() {
        super("模式设置");                
        Yes.addActionListener((e) ->{
            if(ScreenProjection.isSelected() || RemoteControl.isSelected()) {
                String IP = ClientMain.SI.ip.getText();
                int PORT = Integer.parseInt(ClientMain.SI.port.getText());
                ClientMain.MS.setVisible(false);                
                try {
                    ClientMain.RC = new RemoteConnection(IP,PORT);
                    ClientMain.RC.setVisible(true);
                    ClientMain.RC.update();                    
                    //BufferedImage image = ImageIO.read(new File("C:/Users/企鹅之家/Desktop/Icon.png"));
                    //ClientMain.RC.JLabel.setIcon(new ImageIcon(image));
                } catch (Exception e1) {
                    ClientMain.RC.setVisible(false);
                    JOptionPane.showMessageDialog(null,"A Java Exception has occurred","Error",JOptionPane.ERROR_MESSAGE);
                    e1.printStackTrace();
                    ClientMain.MS.setVisible(true);
                }
            }else {
                JOptionPane.showMessageDialog(null,"请选择选项","警告",JOptionPane.WARNING_MESSAGE);
            }
            
        });
        Cancellation.addActionListener((e) ->{
            this.setVisible(false);
            ClientMain.SI.setVisible(true);
            
        });
        Exit.addActionListener((e) ->{
            System.exit(0);
        });
        bp.add(ScreenProjection);
        bp.add(RemoteControl);
        Object[] Options = {ScreenProjection,RemoteControl,Yes,Cancellation,Exit};
        P.setMessage(Options);
        setLayout(new FlowLayout(FlowLayout.LEFT));
        add(P);
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        int screenw = screenSize.width;
        int screenh = screenSize.height;
        setLocation((screenw - 300) / 2, (screenh - 200) / 2);
        setSize(300,200);
    }
}
package SRC;
//RemoteConnection.java
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;

import javax.imageio.ImageIO;
import javax.swing.*;

public class RemoteConnection extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    static Socket client,X,Y;
    static DataInputStream dataInputStream;
    static DataOutputStream X_axisCoordinates,Y_axisCoordinates;
    static JLabel Screen = new JLabel();
    static Timer QuickSettingsForScreenIcons;
    String host;
    int port = 1024;
    
    public RemoteConnection(String host,int port) throws UnknownHostException, IOException {
        super("来自 " + host + " 的屏幕");
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        Screen = new JLabel();
        JScrollPane scrollpane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollpane.getViewport().add(Screen);    
        add(scrollpane);    
        this.host = host;
        this.port = port;
    }
    @SuppressWarnings("static-access")
    public void update() throws IOException {
        client = new Socket(host,port);
        //X = new Socket(host,5000);
        //Y = new Socket(host,6000);
        dataInputStream = new DataInputStream(client.getInputStream());
        System.out.println(true);
        double height = dataInputStream.readDouble();
        double width = dataInputStream.readDouble();
        Screen.setSize((int)width - 20,(int)height);
        System.out.println((int)width);
        System.out.println((int)height);
        System.out.println(true);
        //X_axisCoordinates = new DataOutputStream(X.getOutputStream());
        //Y_axisCoordinates = new DataOutputStream(Y.getOutputStream());
        /*JLabel.addMouseListener(new MouseAdapter() {
             public void mouseClicked(MouseEvent e) {                 
                 try {
                     X_axisCoordinates.writeInt(e.getX());
                     Y_axisCoordinates.writeInt(e.getY());
                } catch (Exception e1) {
                    JOptionPane.showMessageDialog(null,"A Java Exception has occurred","Error",JOptionPane.ERROR_MESSAGE);
                    e1.printStackTrace();
                }                 
             }
        });*/
        System.out.println(true);
        QuickSettingsForScreenIcons = new Timer(1,(e ->{
            int len;
            try {
                len = dataInputStream.readInt();
                byte[] ImageData = new byte[len];
                dataInputStream.readFully(ImageData);
                ByteArrayInputStream in = new ByteArrayInputStream(ImageData);
                BufferedImage image = ImageIO.read(in);
                ImageIcon ICON = new ImageIcon(image);
                ClientMain.RC.Screen.setIcon(ICON);
                ClientMain.RC.repaint();
            } catch (Exception e1) {
                JOptionPane.showMessageDialog(null,"A Java Exception has occurred","Error",JOptionPane.ERROR_MESSAGE);
                e1.printStackTrace();
            }
        }));
        QuickSettingsForScreenIcons.start();
    }
    /*@SuppressWarnings("static-access")
    public static void main(String[] args) throws UnknownHostException, IOException, AWTException {
        Toolkit TK = Toolkit.getDefaultToolkit();
        Dimension D = TK.getScreenSize();
        Rectangle R = new Rectangle(D);
        Robot rr = new Robot();
        BufferedImage BI = rr.createScreenCapture(R);
        RemoteConnection r = new RemoteConnection("20",12);    
        r.setVisible(true);
        r.Screen.setIcon(new ImageIcon(BI));
    }*/    
}

RemoteScreenProjection_Server

package SRC;
//ServerMain.java

public class ServerMain {
    static SetConnectionPort SCP = new SetConnectionPort();
    static Connection C = new Connection();
    
    public static void main(String[] args) {        
        SCP.setVisible(true);    
    }    
}
package SRC;
//Connection.java
import java.io.*;
import java.net.*;

public class Connection {
    @SuppressWarnings("resource")
    public void Connnect(int port) {
        try{
            ServerSocket SS = new ServerSocket(port);
            System.out.println("正在追踪服务器......");
            Socket clinet = SS.accept();
            System.out.println("锁定服务器成功");           
            OutputStream OS = clinet.getOutputStream();
            DataOutputStream DOS = new DataOutputStream(OS);
            Thread t = new Thread(new ScreenShot(DOS));
            t.start();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
package SRC;
//ScreenShot.java
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;

public class ScreenShot implements Runnable {
    
    private DataOutputStream DOS;
    private ByteArrayOutputStream BOAS = new ByteArrayOutputStream();
    
    public ScreenShot(DataOutputStream DOS){
        this.DOS = DOS;
    }
    @Override
    public void run() {
        Toolkit TK = Toolkit.getDefaultToolkit();
        Dimension D = TK.getScreenSize();
        try {
            DOS.writeDouble(D.getHeight());
            DOS.writeDouble(D.getWidth());
            DOS.flush();
            Rectangle R = new Rectangle(D);
            Robot r = new Robot();
            while(true){
                BufferedImage BI = r.createScreenCapture(R);
                ImageIO.write(BI,"jepg",BOAS);
                byte[] data = BOAS.toByteArray();
                System.out.println("kK");
                for(byte b : data) {
                    System.out.println(b);
                }
                DOS.writeInt(data.length);
                DOS.write(data);
                DOS.flush();                               
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}
package SRC;
//SetConnectionPort.java
import java.awt.*;
import java.util.regex.*;
import javax.swing.*;

public class SetConnectionPort extends JFrame{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    static JOptionPane P = new JOptionPane(null, JOptionPane.INFORMATION_MESSAGE);    
    static JLabel Port = new JLabel("Port : ");
    static JTextField port = new JTextField();
    static JButton Link = new JButton("连接");
    static JButton Exit = new JButton("退出");

    public SetConnectionPort() {
        super("设置连接端口");            
        Object[] Options = {Port,port,Link,Exit};
        P.setMessage(Options);
        setLayout(new FlowLayout(FlowLayout.LEFT));
        add(P);
        Link.addActionListener((e) -> {
            if(IsTheDataLegal(port.getText())) {                        
                System.out.println(true);
                ServerMain.C.Connnect(Integer.parseInt(port.getText()));
            }
        });
        Exit.addActionListener((e) -> {
            System.exit(0);        
        });        
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        int screenw = screenSize.width;
        int screenh = screenSize.height;
        setLocation((screenw - 300) / 2, (screenh - 125) / 2);
        setSize(300,125);
    }
    public static boolean IsTheDataLegal(String Port) {
        try {
            if(Pattern.compile("\\d{6}").matcher(Port).find() || 
               Pattern.compile("\\d{5}").matcher(Port).find() || 
               Pattern.compile("\\d{4}").matcher(Port).find()) {
                int PORT = Integer.parseInt(Port);
                if(PORT > 1024 && PORT < 49151) {
                    if(PORT == 5000 || PORT == 6000 || PORT == 7000 || PORT == 8000) {
                        JOptionPane.showMessageDialog(null,"请勿输入为5000,6000,7000,8000的Port值","警告",JOptionPane.WARNING_MESSAGE);
                        return false;
                    }else {
                        return true;
                    }                        
                }else{
                    JOptionPane.showMessageDialog(null,"Port输入不合法","警告",JOptionPane.WARNING_MESSAGE);
                    return false;
                }
            }else {
                JOptionPane.showMessageDialog(null,"Port输入不合法","警告",JOptionPane.WARNING_MESSAGE);
            }
            
        }catch(Exception e) {
            e.printStackTrace();
            return false;
        }
        return false;                            
    }
}

true
true
2358
1278
true
true
java.lang.NullPointerException: Cannot invoke "java.awt.Image.getProperty(String, java.awt.image.ImageObserver)" because "image" is null
at java.desktop/javax.swing.ImageIcon.(ImageIcon.java:257)
at RemoteScreenProjection_Client/SRC.RemoteConnection.lambda$0(RemoteConnection.java:71)
at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:311)
at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:243)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

  • 写回答

1条回答 默认 最新

  • pzzhao 2023-05-06 21:20
    关注

    如果可能为空,就不要执行后面的逻辑啊

    评论

报告相同问题?

问题事件

  • 修改了问题 5月5日
  • 创建了问题 5月5日

悬赏问题

  • ¥15 vb6.0+webbrowser无法加载某个网页求解
  • ¥15 RPA财务机器人采购付款流程
  • ¥15 计算机图形多边形及三次样条曲线绘制
  • ¥15 根据protues画的图用keil写程序
  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件
  • ¥15 逐月累计,月份不连续,补齐月份
  • ¥15 应用简单的Python代码完成一个学生成绩管理系统
  • ¥15 用matlab求微分方程初值问题