gpt4 book ai didi

java - 使用套接字将文件从客户端发送到服务器,但获取一些大小为零的文件

转载 作者:行者123 更新时间:2023-11-30 04:24:34 25 4
gpt4 key购买 nike

我正在编写一些代码

  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)甚至它收到的某些文件的大小为零。

最佳答案

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);
}

关于java - 使用套接字将文件从客户端发送到服务器,但获取一些大小为零的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16255758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com