问题: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)