我遇到的问题是我的程序停留在for循环中,因为dataInputSteam在DataOutputSteam完成之前没有收到所有数据。 在我的程序中,我想向服务器发送一个secreenshot,客户端应该收到它: 服务器:
public sendScreen(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
Robot robot;
try {
robot = new Robot();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screen = new Rectangle( screenSize );
BufferedImage image = robot.createScreenCapture( screen );
BufferedImage scaledImage = Scalr.resize(image, 300);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
byte[] screenBytes = baos.toByteArray();
daos = new DataOutputStream(socket.getOutputStream());
daos.writeInt(screenBytes.length);
daos.write(screenBytes);
System.out.println("Screen sent");
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户:
public static class GetScreenshot implements Runnable{
Socket socket;
private static DataInputStream din;
private static BufferedImage screenshot;
public GetScreenshot(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("start method getScreenshot");
int length;
byte[] buffer;
PrintWriter out;
try {
//sending command to send screenshot
out = new PrintWriter(socket.getOutputStream(), true);
out.println("GETSCREENSHOT");
din = new DataInputStream(socket.getInputStream());
System.out.println("DIS created");
length = din.readInt();
System.out.println("Got data from DIS");
buffer = new byte[length];
System.out.println("Filled buffer");
for(int i = 0; i < length; i++){
buffer[i] = (byte) din.read();
System.out.println("read" + i+ "while length is " + length + " read data " + buffer);
}
System.out.println("got buffer");
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
screenshot = ImageIO.read(bais);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//writing screenshot to local disk
File outputfile = new File("C:\\users\\XXXX\\documents\\image2.png");
try {
ImageIO.write(screenshot, "png", outputfile);
System.out.println("image written to local disk");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//set screenshot in the tool
Main.labelScreenshot.setIcon(new ImageIcon(screenshot));
}
}
有人知道如何传输屏幕截图的所有数据吗?
问候 最大
答案 0 :(得分:0)
buffer = new byte[length];
System.out.println("Filled buffer");
此时此消息根本不真实。你已经创建了缓冲区,但你肯定还没有填充它。
for(int i = 0; i < length; i++){
buffer[i] = (byte) din.read();
System.out.println("read" + i+ "while length is " + length + " read data " + buffer);
}
这一切等同于:
din.readFully(buffer);
然后:
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
screenshot = ImageIO.read(bais);
//writing screenshot to local disk
File outputfile = new File("C:\\users\\XXXX\\documents\\image2.png");
try {
ImageIO.write(screenshot, "png", outputfile);
这一切完全等同于:
try (new FileOutputStream out = new FileOutputStream("C:\\users\\XXXX\\documents\\image2.png"))
{
out.write(buffer);
}
无需对图像进行解码和重新编码。
答案 1 :(得分:0)
我认为你的问题是因为你的观点(画布/标签/等)宽度和&amp;高度小于图像。尝试调整屏幕大小的宽度和宽度。高度与您的视图相同(画布/标签/等)。
答案 2 :(得分:0)
好的,我现在已经改变了
for(int i = 0; i < length; i++){
buffer[i] = (byte) din.read();
System.out.println("read" + i+ "while length is " + length + " read data " + buffer);
}
到
din.readFully(buffer);
并将输出从“Filled buffer”更改为“Initialized buffer”;)
我还完全删除了本地保存部分,对于我的程序来说,只需在程序中显示它就足够了。
但是:执行din.readFully(buffer);
时仍然卡住了,所以问题本身仍然存在。
您对如何解决这个问题有任何想法吗?
问候 最大
答案 3 :(得分:-1)
您可以将其添加到发件人部分:
socket.flush();
如果不起作用,那么:
socket.shutdownOutput();