for 循环没有收到完整数据
for loop doesn't receive full data
我遇到的问题是我的程序卡在 for 循环中,因为 dataInputSteam 在 DataOutputSteam 完成之前没有接收到所有数据。
在我的程序中,我想向服务器发送一个截图,客户端应该会收到它:
服务器:
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));
}
}
有谁知道如何传输截图的所有数据?
您好
最大值
您将此添加到发件人部分:
socket.flush();
如果没有成功,那么:
socket.shutdownOutput();
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);
}
无需对图像进行解码和重新编码。
我认为您的问题是因为您的视图 (canvas/label/etc) 宽度和高度小于您的图像。尝试调整屏幕截图的大小,使宽度和高度与您的视图相同 (canvas/label/etc)。
我遇到的问题是我的程序卡在 for 循环中,因为 dataInputSteam 在 DataOutputSteam 完成之前没有接收到所有数据。 在我的程序中,我想向服务器发送一个截图,客户端应该会收到它: 服务器:
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));
}
}
有谁知道如何传输截图的所有数据?
您好 最大值
您将此添加到发件人部分:
socket.flush();
如果没有成功,那么:
socket.shutdownOutput();
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);
}
无需对图像进行解码和重新编码。
我认为您的问题是因为您的视图 (canvas/label/etc) 宽度和高度小于您的图像。尝试调整屏幕截图的大小,使宽度和高度与您的视图相同 (canvas/label/etc)。