TCP サーバーからスクリーンショットをキャプチャするプログラムを作成しています。動作しますが、1 つのスクリーンショットの後、次のエラーが表示されますjava.lang.IllegalArgumentException: image == null!
。
また、これは私の最初の tcp プロジェクトであるため、どうすれば tcp クライアントとサーバーのコードをより堅牢にすることができるのでしょうか。コードがかなり悪いことはわかっています。これが私のコードです:
クライアント
package me.sanchixx.sss.client;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.io.File;
import java.net.Socket;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
@SuppressWarnings("serial")
public class Interface extends JFrame implements ActionListener
{
JPanel container = new JPanel(new BorderLayout());
private final JMenuBar menuBar = new JMenuBar();
private final JMenuBar menu = new JMenuBar();
private final JMenu mnMenu = new JMenu("Menu");
private final JMenuItem connect = new JMenuItem("Connect");
private final JMenuItem screenshot = new JMenuItem("Screenshot");
private final JMenuItem save = new JMenuItem("Save");
ImageInPanel imgPan = new ImageInPanel();
Socket skt = null;
String ip;
int port;
static BufferedImage img = null;
public Interface()
{
this.setSize(600, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Stupid Spying Shit");
this.setResizable(true);
this.setContentPane(container);
this.setVisible(true);
initComponents();
}
void initComponents()
{
setJMenuBar(menuBar);
menuBar.add(mnMenu);
connect.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK + ActionEvent.ALT_MASK));
mnMenu.add(connect);
screenshot.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
mnMenu.add(screenshot);
mnMenu.addSeparator();
save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
mnMenu.add(save);
menuBar.add(menu);
imgPan.setBackground(new Color(0xffffff));
container.add(imgPan);
connect.addActionListener(this);
screenshot.addActionListener(this);
}
public void actionPerformed(ActionEvent arg0)
{
if(arg0.getSource() == connect)
{
String adressGiven = JOptionPane.showInputDialog(null, "Server adress", "Prompt", JOptionPane.QUESTION_MESSAGE);
if(adressGiven != null && adressGiven.length() != 0 && adressGiven.contains(":"))
{
String[] adress = adressGiven.split(":");
ip = adress[0];
port = Integer.parseInt(adress[1]);
try
{
skt = new Socket(ip, port);
}
catch(Exception e)
{
JOptionPane.showMessageDialog(container, "Could not connect!", "Error", JOptionPane.ERROR_MESSAGE);
}
}
else
{
JOptionPane.showMessageDialog(container, "Are you serious?", "Error", JOptionPane.ERROR_MESSAGE);
}
}
else if(arg0.getSource() == screenshot)
{
if (skt != null)
{
try
{
BufferedImage image = ImageIO.read(ImageIO.createImageInputStream(skt.getInputStream()));
img = image;
System.out.print("Received image");
File outputfile = new File("c:/saved.png");
ImageIO.write(img, "jpg", outputfile);
repaint();
}
catch(Exception e)
{
e.printStackTrace();
JOptionPane.showMessageDialog(container, ":( " + e, "Error", JOptionPane.ERROR_MESSAGE);
}
}
else
{
JOptionPane.showMessageDialog(container, "You are not connected to a server!", "Error", JOptionPane.ERROR_MESSAGE);
}
}
}
}
サーバ
package me.sanchixx.sss.server;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.net.ServerSocket;
import java.net.Socket;
import javax.imageio.ImageIO;
public class Main
{
public static void main(String args[]) throws Exception
{
@SuppressWarnings("resource")
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true)
{
Socket skt = welcomeSocket.accept();
System.out.print("Server has connected!");
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
ImageIO.write(capture, "jpg", skt.getOutputStream());
/*try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}*/
}
}
}
ありがとう