如何通过java中的套接字发送图像?

我正在写一个客户端 – 服务器程序,我希望它发送一个图像。 代码如下:

//RECEIVER while(true){ try{ socket = server.accept(); out = new ObjectOutputStream(socket.getOutputStream()); out.flush(); in = new ObjectInputStream(socket.getInputStream()); System.out.println("Connected to "+PORTA+"."); while(!socket.isClosed()){ System.out.println("\nPrint the action"); azione = reader.readLine(); if(azione.equals("screenshot")){ out.writeObject("screenshot"); out.flush(); BufferedImage screenshot = ImageIO.read(in); ImageIO.write(screenshot, "jpg", new File("screenshot.jpg")); } }catch(Exception ex){ System.out.println("Not connected.\n"); } } 

和服务器:

 while(true){ try{ socket = new Socket(INDIRIZZO, PORT); out = new ObjectOutputStream(socket.getOutputStream()); out.flush(); in = new ObjectInputStream(socket.getInputStream()); while(!socket.isClosed()){ try { action = (String)in.readObject(); if(azione.equals("screenshot")){ BufferedImage screenshot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); ImageIO.write(screenshot, "jpg", out); }catch(Exception e){ } } }catch(Exception ex){ // } } 

我的问题是,只有当我关闭套接字或输出流时,客户端才会收到图像,但我不希望这种情况发生。 我怎么能绕过那个? 如何将图像作为字节发送? 谢谢!

问题是ImageIO.read等待流的结束。 套接字仅在您关闭它时发送它。 (这很有意义)

你想要做的是首先发送图像的大小,并在接收器一侧读取图像作为字节数组。

 public class Send { public static void main(String[] args) throws Exception { Socket socket = new Socket("localhost", 13085); OutputStream outputStream = socket.getOutputStream(); BufferedImage image = ImageIO.read(new File("C:\\Users\\Jakub\\Pictures\\test.jpg")); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ImageIO.write(image, "jpg", byteArrayOutputStream); byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array(); outputStream.write(size); outputStream.write(byteArrayOutputStream.toByteArray()); outputStream.flush(); System.out.println("Flushed: " + System.currentTimeMillis()); Thread.sleep(120000); System.out.println("Closing: " + System.currentTimeMillis()); socket.close(); } } public class Receive { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(13085); Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); System.out.println("Reading: " + System.currentTimeMillis()); byte[] sizeAr = new byte[4]; inputStream.read(sizeAr); int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get(); byte[] imageAr = new byte[size]; inputStream.read(imageAr); BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr)); System.out.println("Received " + image.getHeight() + "x" + image.getWidth() + ": " + System.currentTimeMillis()); ImageIO.write(image, "jpg", new File("C:\\Users\\Jakub\\Pictures\\test2.jpg")); serverSocket.close(); } } 

您可以在easywayprogramming中找到(非编译)示例。

我已经简化了它并修复了错误,我希望这对你的问题是一个有用的答案。

首先运行服务器,然后根据需要随时运行客户端。

该示例将截取屏幕左上角200×100像素的屏幕截图,将其发送到服务器,该服务器将打开一个新窗口并显示屏幕截图。

GreetingServer.java

 import java.awt.image.BufferedImage; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; import java.sql.SQLException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class GreetingServer extends Thread { private ServerSocket serverSocket; Socket server; public GreetingServer(int port) throws IOException, SQLException, ClassNotFoundException, Exception { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(180000); } public void run() { while(true) { try { server = serverSocket.accept(); BufferedImage img=ImageIO.read(ImageIO.createImageInputStream(server.getInputStream())); JFrame frame = new JFrame(); frame.getContentPane().add(new JLabel(new ImageIcon(img))); frame.pack(); frame.setVisible(true); } catch(SocketTimeoutException st) { System.out.println("Socket timed out!"); break; } catch(IOException e) { e.printStackTrace(); break; } catch(Exception ex) { System.out.println(ex); } } } public static void main(String [] args) throws IOException, SQLException, ClassNotFoundException, Exception { Thread t = new GreetingServer(6066); t.start(); } } 

GreetingClient.java

 import java.awt.AWTException; import java.awt.Image; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.Socket; import javax.imageio.ImageIO; public class GreetingClient { Image newimg; static BufferedImage bimg; byte[] bytes; public static void main(String [] args) { String serverName = "localhost"; int port = 6066; try { Socket client = new Socket(serverName, port); Robot bot; bot = new Robot(); bimg = bot.createScreenCapture(new Rectangle(0, 0, 200, 100)); ImageIO.write(bimg,"JPG",client.getOutputStream()); client.close(); } catch(IOException | AWTException e) { e.printStackTrace(); } } }