在java中使用TCP以字节数组传输二进制文件

时间:2012-02-06 07:51:51

标签: java sockets tcp filestream

我试图通过一次一个字节块将二进制文件从服务器传输到客户端。但是,我遇到的问题是它在转移8kb时遇到困难。该文件通常大于1mb,字节数组大小为1024.我相信它必须对我的while循环做一些事情,因为它没有关闭我的连接。有帮助吗?感谢

客户端

import java.io.*;
import java.net.Socket;

public class FileClient {

    public static void main(String[] argv) throws IOException {
        Socket sock = new Socket("localhost", 4444);
        InputStream is = null;
        FileOutputStream fos = null;

        byte[] mybytearray = new byte[1024];
        try {
            is = sock.getInputStream();
            fos = new FileOutputStream("myfile.pdf");

            int count;
            while ((count = is.read(mybytearray)) >= 0) {
                fos.write(mybytearray, 0, count);
            }
        } finally {
            fos.close();
            is.close();
            sock.close();
        }
    }
}

服务器

import java.net.*;
import java.io.*;

public class FileServer {

    public static void main(String[] args) throws IOException {
        ServerSocket servsock = new ServerSocket(4444);
        File myFile = new File("myfile.pdf");
        FileInputStream fis = null;
        OutputStream os = null;
        while (true) {
            Socket sock = servsock.accept();
            try {
            byte[] mybytearray = new byte[1024];
            fis = new FileInputStream(myFile);
            os = sock.getOutputStream();

            int count;
            while ((count = fis.read(mybytearray)) >= 0) {
                os.write(mybytearray, 0, count);

            }
            os.flush();
            } finally {
            fis.close();
            os.close();
            sock.close();

            System.out.println("Socket closed");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您的循环应该检查count >= 0而不是count > 0,并且应该在finally块中关闭流和套接字。除此之外,代码对我来说很好。

你是什么意思“它被困在转移8kb”?发生了什么异常?