Sending files through sockets

后端 未结 3 915
刺人心
刺人心 2020-12-10 00:29

Hello there im trying to send files using client-server classes in java. For some reason when the method that sends the file is called the socket closes. here is the code :<

3条回答
  •  失恋的感觉
    2020-12-10 01:21

    The InputStream.read(byte[]) method returns an int for the number of bytes it actually read. It's not guaranteed to read as many bytes as you requested from the byte array. It'll often return the size of the underlying buffer and you'll have to call it many times.

    You can use this to be more efficient by streaming the bytes from the socket to the file instead of buffering the whole byte array in memory. Likewise on the server side you can do the same thing to save memory and be faster than writing a byte at a time.

    Here's a working example of a server and client in one that connects to itself to transfer a file:

    public class SocketFileExample {
        static void server() throws IOException {
            ServerSocket ss = new ServerSocket(3434);
            Socket socket = ss.accept();
            InputStream in = new FileInputStream("send.jpg");
            OutputStream out = socket.getOutputStream();
            copy(in, out);
            out.close();
            in.close();
        }
    
        static void client() throws IOException {
            Socket socket = new Socket("localhost", 3434);
            InputStream in = socket.getInputStream();
            OutputStream out = new FileOutputStream("recv.jpg");
            copy(in, out);
            out.close();
            in.close();
        }
    
        static void copy(InputStream in, OutputStream out) throws IOException {
            byte[] buf = new byte[8192];
            int len = 0;
            while ((len = in.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
        }
    
        public static void main(String[] args) throws IOException {
            new Thread() {
                public void run() {
                    try {
                        server();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
    
            client();
        }
    }
    

提交回复
热议问题