Javaでクライアントサーバープログラムを作成しました。 今のところ、すべてのプログラムは:クライアントはスクリーンショットを送信し、イメージを作成してサーバーに送信し、サーバーはそのイメージをディレクトリに保存します。イメージの一部だけが全体ではなく保存されていますが、修正する必要はありますか?
何らかの理由で、サーバーによって保存されたイメージが部分的です。つまり、すべてのスクリーンショットがサーバー側に保存されているわけではありません。
クライアント側のスクリーンショット:
関連コード:
private static void screenshot(){
try {
BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
File compressedImageFile = new File("C:\\Gilad\\Screenshots\\compress.jpg");
OutputStream os = new FileOutputStream(compressedImageFile);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(1f);
writer.write(null, new IIOImage(image, null, null), param);
os.close();
ios.close();
writer.dispose();
Path path = Paths.get("C:\\Images\\Screenshots\\compress.jpg");
byte[] compressedImage = Files.readAllBytes(path);
serverThread.sendOutput(compressedImage); //serverThread is object of type ThreadForServer
} catch (HeadlessException | AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ThreadForServerクラスから画像を送信:
outputThread = new Thread(new Runnable(){
@Override
public void run() {
byte[] imageAr;
//ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int len;
byte[] lenAr;
try{
while(true){
if(outputs.isEmpty()) Thread.sleep(10);
else{
imageAr = outputs.remove();
len = imageAr.length;
System.out.println("length: " + len);
lenAr = ByteBuffer.allocate(4).putInt(len).array();
System.out.println("length array: " + lenAr + " " + System.currentTimeMillis());
socketOutput.write(lenAr);
System.out.println("Image array: " + imageAr + " " + System.currentTimeMillis());
socketOutput.write(imageAr);
socketOutput.flush();
System.out.println("Flushed: " + System.currentTimeMillis());
}
}
}catch(InterruptedException | IOException e){ e.printStackTrace(); }
}
});
サーバ側で
InputThread:画像を保存
inputThread = new Thread(new Runnable(){
@Override
public void run() {
byte[] imageAr;
byte[] lenAr = new byte[4];
int len;
try{
while(running){
System.out.println("Server input thread: " + System.currentTimeMillis());
socketInput.read(lenAr);
len = ByteBuffer.wrap(lenAr).asIntBuffer().get();
System.out.println("length: " + len);
imageAr = new byte[len];
socketInput.read(imageAr);
inputs.add(imageAr);
break;
}
}catch(IOException e){
e.printStackTrace();
}
}
});
サーバー:事前に
private static void startClientThreadHandler(ThreadForClient clientThread){
new Thread(new Runnable(){
@Override
public void run() {
try{
while(true){
byte[] image = clientThread.getInput();
if(image == null){
Thread.sleep(10);
continue;
}
ByteArrayInputStream in = new ByteArrayInputStream(image);
BufferedImage buffImage = ImageIO.read(in);
ImageIO.write(buffImage, "jpg", new File(IMAGE_DESTINATION + "\\image" + counter));
++counter;
}
}catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();;
}
ありがとう!
ありがとうございました! – MuffinsDev
@MuffinsDevを修正しました。これが本当に問題だった場合は、正解とマークすることを検討してください。 –