【问题标题】:Sending files from client to server using Sockets but getting some files with size zero使用套接字将文件从客户端发送到服务器,但得到一些大小为零的文件
【发布时间】:2013-04-21 18:26:14
【问题描述】:

我正在写一些代码

  1. 客户端从命令行获取文件名(文本文件)
  2. 客户端将每个文件转换为字节数组,然后将该数组发送到服务器。
  3. 服务器启动一个新线程,每个线程都在将一个字节数组转换为某个指定目录中的新文件。

我的客户代码是

客户端

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

class Client
{
    public static void main(String args[])
    {
        try
        {
            int len=args.length;
            if(len== 0)
            {
                System.out.println("Invalid Number of Arguements");
                throw new Exception();
            }
            else
            {
                int i=0;
                while(i<len)
                {          
                    Socket s=new Socket("localhost",2222);
                    File f=new File(args[i++]);
                    if(f.exists())
                    {
                        OutputStream os=s.getOutputStream();
                        FileInputStream fr=new FileInputStream(f);
                        s.setSendBufferSize(fr.available());
                        byte data[]=new byte[fr.available()];
                        fr.read(data);
                        os.write(data);
                        os.flush();
                        os.close();
                        System.out.println("Sending file : "+f.getName()+" with size "+data.length);
                        fr.close();
                    }
                    else
                    {
                        System.out.println("File : "+args[i++]+" doesn't exist.");
                    }

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

服务器端

import java.net.*;
import java.io.*;
import java.util.Date;

public class Server
{
    public static final String dir_to_store_files="c:\\myfiles\\";

    public static void main(String[] args) throws Exception
    {
        ServerSocket ss=new ServerSocket(2222);
        ss.setReceiveBufferSize(51200);
        ss.setReuseAddress(true);

        Socket s=null;
        while( (s=ss.accept()) != null)
        {
            new Thread(new ServerThreads(s,dir_to_store_files)).start();
            s=null;
        }
        ss.close();
    }
}

class ServerThreads implements Runnable
{
    private static int fileNounce=0;
    Socket s;
    String directory;

    ServerThreads(Socket s,String directory)
    {
        this.s=s;
        this.directory=directory;
    }

    public void run()
    {
        try
        {
            InputStream is=s.getInputStream();
            File f=new File(directory+"\\NewFile-"+fileNounce+".txt");
            while(f.exists())
            {
                    fileNounce++;
                    f=new File(directory+"\\NewFile "+fileNounce+".txt");
            }

            fileNounce++;
            f.createNewFile();

            FileOutputStream fos=new FileOutputStream(f);
            byte data[]=new byte[is.available()];
            System.out.print(is.available()+ " bytes are received from "+s.getRemoteSocketAddress());
            is.read(data);
            System.out.println("\t\tCreating file : "+f.getAbsolutePath()+" at : "+new Date()+" of size : "+data.length);
            is.close();
            fos.write(data);
            fos.flush();
            fos.close();
            s.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

问题:服务器无法正确获取文件意味着有时新文件的大小为零(无数据)。例如,我检查过使用发送 239 个 c 文件 java 客户端 *c 服务器正在接收随机数量的文件(范围为 180-235) 甚至它接收到的一些文件大小为零。

【问题讨论】:

    标签: java client-server sendfile


    【解决方案1】:

    fr.available() 不是你想的那样......你想要 File.length(),以及一个用于读取文件字节以发送到服务器的循环......

    is.available() 也是错误的 .. 考虑一个看起来像这样的客户端:

    byte[] buffer = new byte[4096];
    int len = 0;
    while ((len = fr.read(buffer)) >= 0) {
       os.write(buffer, 0, len);
    }
    

    【讨论】:

    • 不,available() 表示可以在不阻塞的情况下读取多少字节......即使这样它也是一个提示。例如,在客户端实际发送数据之前,来自 Socket 的 InputStream() 将具有 available() == 0....
    • 实际上我想要的是将文件(通常是文本文件)从一个系统复制到另一个系统(将进行进一步处理)。那么我应该使用套接字还是正常的文件复制(性能方面)??
    • 如果 from 和 to 位置都在本地机器上,则使用 Files.copy(...) (来自 java.nio.file.Files ),否则使用套接字
    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2012-02-24
    • 2018-09-24
    • 2015-02-06
    相关资源
    最近更新 更多