Java 在客户端和服务器之间以字节数组形式发送图像
我可以成功地从我的客户机向服务器发送并绘制大小为125 x 125的图像。唯一的问题是,这太小了。我希望能够发送一个更大的图像,但字节数组无法处理它,我得到了一个java堆异常。现在我用这个来解释我的图像。有没有更有效的方法 论客户Java 在客户端和服务器之间以字节数组形式发送图像,java,image,sockets,Java,Image,Sockets,我可以成功地从我的客户机向服务器发送并绘制大小为125 x 125的图像。唯一的问题是,这太小了。我希望能够发送一个更大的图像,但字节数组无法处理它,我得到了一个java堆异常。现在我用这个来解释我的图像。有没有更有效的方法 论客户 screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); screenShot
screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
screenShot = resize(screenShot, 125, 125);
ByteArrayOutputStream byteArrayO = new ByteArrayOutputStream();
ImageIO.write(screenShot,"PNG",byteArrayO);
byte [] byteArray = byteArrayO.toByteArray();
out.writeLong(byteArray.length);
out.write(byteArray);
如上所述调整方法的大小
public static BufferedImage resize(BufferedImage img, int newW, int newH) {
int w = img.getWidth();
int h = img.getHeight();
BufferedImage dimg = new BufferedImage(newW, newH, img.getType());
Graphics2D g = dimg.createGraphics();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null);
g.dispose();
return dimg;
}
解释图像的服务器
in = new DataInputStream(Client.getInputStream());
long nbrToRead = in.readLong();
byte[] byteArray = new byte[(int) nbrToRead];
int nbrRd = 0;
int nbrLeftToRead = (int) nbrToRead;
while (nbrLeftToRead > 0) {
int rd = in.read(byteArray, nbrRd, nbrLeftToRead);
if (rd < 0)
break;
nbrRd += rd; // accumulate bytes read
nbrLeftToRead -= rd;
}
ByteArrayInputStream byteArrayI = new ByteArrayInputStream(
byteArray);
image = ImageIO.read(byteArrayI);
if (image != null) {
paint(f.getGraphics(), image);
} else {
System.out.println("null image.");
}
in=newdatainputstream(Client.getInputStream());
long nbrToRead=in.readLong();
字节[]byteArray=新字节[(int)NBRTREAD];
int nbrRd=0;
int nbrleftRead=(int)nbrRead;
而(NbLeftToRead>0){
int rd=in.read(字节数组、nbrRd、NBRLeftRead);
if(rd<0)
打破
nbrRd+=rd;//累积读取的字节数
NbleFTREAD-=rd;
}
ByteArrayInputStream byteArrayI=新建ByteArrayInputStream(
byteArray);
image=ImageIO.read(byteArrayI);
如果(图像!=null){
绘制(f.getGraphics(),图像);
}否则{
System.out.println(“空图像”);
}
正如您所知,代码非常庞大,而且很可能效率低下。我可以将图像的1/10发送10次,以显示尺寸和高度,然后在这些部分绘制,但我想知道是否有更简单的方法来实现这一点 您可能应该考虑通过网络以流的形式传输数据。您可以使用第三方库,如。若您可以使用web服务进行数据传输,那个么您可以查看消息传输优化机制(MTOM),它允许您以更高效的方式以流的形式传输数据。有关更多详细信息,请查看您可能应该考虑通过网络以流的形式传输数据。您可以使用第三方库,如。若您可以使用web服务进行数据传输,那个么您可以查看消息传输优化机制(MTOM),它允许您以更高效的方式以流的形式传输数据。有关更多详细信息,请查看这对我很有用
public class ImageClient {
public static void main(String[] args) throws AWTException, IOException {
BufferedImage screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
Socket socket = new Socket("localhost",11111);
MemoryCacheImageOutputStream byteArrayO = new MemoryCacheImageOutputStream(socket.getOutputStream());
ImageIO.write(screenShot, "PNG", byteArrayO);
byteArrayO.flush();
socket.close();
}
}
public class ImageServer {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ServerSocket ss = new ServerSocket(11111);
try{
Socket s = ss.accept();
InputStream is = s.getInputStream();
MemoryCacheImageInputStream ois = new MemoryCacheImageInputStream(is);
ImageIO.read(ois);
s.close();
}finally{
ss.close();
}
}
}
这对我有用
public class ImageClient {
public static void main(String[] args) throws AWTException, IOException {
BufferedImage screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
Socket socket = new Socket("localhost",11111);
MemoryCacheImageOutputStream byteArrayO = new MemoryCacheImageOutputStream(socket.getOutputStream());
ImageIO.write(screenShot, "PNG", byteArrayO);
byteArrayO.flush();
socket.close();
}
}
public class ImageServer {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ServerSocket ss = new ServerSocket(11111);
try{
Socket s = ss.accept();
InputStream is = s.getInputStream();
MemoryCacheImageInputStream ois = new MemoryCacheImageInputStream(is);
ImageIO.read(ois);
s.close();
}finally{
ss.close();
}
}
}
我认为这有点类似于我正在做的事情,但我的字节数组太大,无法处理任何>125x125I'试图避免以多个片段读取屏幕您需要将其作为字节数组发送吗?这就是造成您的尺寸限制的原因。为什么不通过对象流将其作为对象发送呢?我可以做到?为什么呢如何将其转换回
buffereImage
?我认为这与这有点类似,这与我正在做的类似,但我的字节数组太大,无法处理任何内容>125x125I'试图避免以多个片段读取屏幕是否需要将其作为字节数组发送?这就是造成您的尺寸限制的原因。为什么不通过对象流将其作为对象发送呢?我可以做到?为什么呢我将如何将其转换回缓冲图像
?稍后我将对此进行研究,但在简要阅读之后,这似乎是我所需要的。谢谢稍后我会看一看,但这似乎是我在简要阅读之后所需要的。谢谢