java - Java中通过socket传输文件

标签 java file sockets

我正在尝试通过java中的套接字传输文件..实际上我已经能够传输..但是出现了一个问题..问题是发送的文件大小缩小了..例如我传输300mb文件,客户端只会收到 299mb....我想知道可能是什么问题..

服务器端

File myFile = new File (basePath+"\\"+input.readUTF());
byte [] mybytearray  = new byte [1024];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
txtArea.append("Sending... \n");
while (true)
{
    int i = bis.read(mybytearray, 0, mybytearray.length);
            if (i == -1) {
        break;
    }
    output.write(mybytearray, 0, i);
    txtArea.append("Sending chunk " + i + "\n");

}
output.flush();

客户端

output.writeUTF("get");
txtArea.append("Starting to recive file... \n");
                long start = System.currentTimeMillis();
                byte [] mybytearray  = new byte [1024];
                txtArea.append("Connecting... \n");
                output.writeUTF(remoteSelection);
                FileOutputStream fos = new FileOutputStream(basePath+"\\"+remoteSelection);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                int bytesRead = input.read(mybytearray, 0, mybytearray.length);
                while(bytesRead != -1) 
                {
                    bos.write(mybytearray, 0, bytesRead);
                    txtArea.append("got chunk" + bytesRead +"\n");
                    bytesRead = input.read(mybytearray, 0, mybytearray.length);
                }
bos.flush();

最佳答案

在 Java 中复制流的规范方法如下:

int count;
byte[] buffer = new byte[8192]; // or whatever you like really, not too small
while ((count = in.read(buffer)) > 0)
{
   out.write(buffer, 0, count);
}

适用于任何长度输入;不将整个输入加载到内存中;这样做不会增加延迟。

如果您要发送多个文件,您需要首先通过 DataOutputStream.writeLong() 发送长度;通过反函数在另一端读取它;并调整读取端的循环条件,使其在读取完那么多字节后终止。并不像看起来那么简单;留给读者作为练习。

关于java - Java中通过socket传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10563203/

相关文章:

java - 使用 getPathMatcher 的全局模式

java - 如何计算一个周期的天数?

php - 通过 PHP 检索网站源的最有效方法? (获取请求)

php - 从 php 调用时,perl 脚本有时无法创建套接字连接

laravel - 在 Laravel 中,除了免费之外,使用 redis 和 socket.io 比 pusher 有什么好处?

java - 冒充 'jconsole'

java - 外部实体更改后索引不更新

java - 如何确定使用 PrintWriter 打开文件的正确路径?

c++ - 将数据从 std::istream 保存到文件的最佳方式

java - 创建 java.io.File 类型的 bean 时出错 [不明确的构造函数参数类型]