简体   繁体   English

通过Java中的Socket编程传输图像文件

[英]Transfer image file through Socket Programming in Java

In my code, client sent an image to server and server should be able to receive it and show the image name ( HelloNewPic.jpg in here) and also save image in desktop. 在我的代码中,客户端将图像发送到服务器,服务器应该能够接收它并显示图像名称(此处为HelloNewPic.jpg ),并将图像保存在桌面上。

Server: 服务器:

public class Server1 {

ServerSocket serverSocket = null;
Socket socket = null;
DataInputStream dataInputStream = null;

public Server1() {
    try {
        serverSocket = new ServerSocket(6002);
        System.out.println("Server is Waiting for request...");
        socket = serverSocket.accept();
        System.out.println("Connected with: " + socket.getInetAddress());
        dataInputStream = new DataInputStream(socket.getInputStream());
        System.out.println("Server Read from client: " + dataInputStream.readUTF());
        BufferedImage image = ImageIO.read(socket.getInputStream());
        System.out.println("Server: Image received from client.");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    new Server1();
}
}

Client: 客户:

public class Client1 {

Socket clientSocket = null;
OutputStream outputStream = null;
DataOutputStream dataOutputStream = null;
InputStream inputStream = null;

public Client1() {
    try {
        clientSocket = new Socket("localhost", 6002);
        outputStream = clientSocket.getOutputStream();
        dataOutputStream = new DataOutputStream(outputStream);
        inputStream = clientSocket.getInputStream();

        dataOutputStream.writeUTF("Hello");
        System.out.println("Client to server says: Hello");
        BufferedImage image = ImageIO.read(new File("HelloNewPic.jpg"));
        ImageIO.write(image, "JPG", clientSocket.getOutputStream());
        System.out.println("Client: Image sent to server");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    new Client1();
}
}

In client side, There is no exception: 在客户端,没有例外:

Client to server says: Hello
Client: Image sent to server

But exception occur on server side: 但服务器端出现异常:

Server is Waiting for request...
Connected with: /127.0.0.1
Server Read from client: Hello
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:189)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at javax.imageio.stream.FileCacheImageInputStream.readUntil(FileCacheImageInputStream.java:141)
    at javax.imageio.stream.FileCacheImageInputStream.read(FileCacheImageInputStream.java:187)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1158)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:966)
    at javax.imageio.ImageIO.read(ImageIO.java:1448)
    at javax.imageio.ImageIO.read(ImageIO.java:1352)
    at networking.Server1.<init>(Server1.java:23)
    at networking.Server1.main(Server1.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
  1. Your main problem is that the client never closes the connection, it just exits, which causes some OS's to do an abortive close, which yields a 'connection reset' at the receiver. 你的主要问题是客户端永远不会关闭连接,它只是退出,导致一些操作系统进行中断关闭,这会在接收器处产生“连接重置”。

  2. You don't need to use ImageIO just to send a picture. 您不需要仅使用ImageIO发送图片。 Just read and write the bytes. 只需读取和写入字节。 Using ImageIO just wastes time, a lot of it, and space. 使用ImageIO只会浪费时间,浪费时间和空间。 The server should be able to read the bytes with ImageIO as an image, whether ImageIO sent them or they came direct from a JPEG file. 服务器应该能够使用ImageIO作为图像读取字节,无论ImageIO是发送它们还是直接来自JPEG文件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM