gpt4 book ai didi

java - 我想从我的 android 下载 PC 文件夹中的所有文件,用于执行 java 套接字,但正确获得第一个文件,其他文件是垃圾

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

*我的电脑中有一个文件夹在 c:/name share 中,在运行我的客户端和服务器代码后我有 4 张图片我在我的 android 模拟器中下载了所有 4 张图片但只有第一张图片正确下载其他3个是垃圾这是我的代码服务器端

public class Multiplefilessending 
{
public static void main(String[] args) throws IOException,EOFException
{
FileOutputStream fos;
BufferedOutputStream bos;
OutputStream output;
int len;
int smblen;
InputStream in;
boolean flag=true;
DataInputStream clientData;
BufferedInputStream clientBuff;
System.out.println("Waiting for Connection");
ServerSocket serverSocket = new ServerSocket(5991);
Socket clientSocket = null;
clientSocket = serverSocket.accept();

////////////////////////
File myFile = new File("C:/share");
File[] Files = myFile.listFiles();

OutputStream os = clientSocket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);

dos.writeInt(Files.length);

for (int count=0;count<Files.length;count ++)
{
dos.writeUTF(Files[count].getName());

}

for (int count=0;count<Files.length;count ++)
{

int filesize = (int) Files[count].length();
dos.writeInt(filesize);
}

for (int count=0;count<Files.length;count ++)
{
int filesize = (int) Files[count].length();
byte [] buffer = new byte [filesize];

//FileInputStream fis = new FileInputStream(myFile);
FileInputStream fis = new FileInputStream(Files[count].toString());
BufferedInputStream bis = new BufferedInputStream(fis);

//Sending file name and file size to the server
bis.read(buffer, 0, buffer.length); //This line is important

dos.write(buffer, 0, buffer.length);
dos.flush();
//dos.close();
}

if (flag==false){
clientSocket = serverSocket.accept();
flag = true;
}
//Closing socket
//dos.close();
clientSocket.close();

}
}

和客户端

Socket sock = new Socket("10.0.2.2", 5991);
System.out.println("正在连接…………");

        FileOutputStream fos;  
BufferedOutputStream bos;
OutputStream output;
DataOutputStream dos;
int len;
int smblen;
InputStream in;
boolean flag=true;
DataInputStream clientData;
BufferedInputStream clientBuff;

while (true)
{
//while(true && flag==true){
while(flag==true)
{
in = sock.getInputStream(); //used
clientData = new DataInputStream(in); //use
clientBuff = new BufferedInputStream(in); //use
int fileSize = clientData.read();
ArrayList<File>files=new ArrayList<File>(fileSize); ArrayList<Integer>sizes = new ArrayList<Integer>(fileSize); //store file size from client
//Start to accept those filename from server
for (int count=0;count < fileSize;count ++){
File ff=new File(clientData.readUTF());
files.add(ff);
}
for (int count=0;count < fileSize;count ++){
sizes.add(clientData.readInt());
}
for (int count =0;count < fileSize ;count ++)
{
if (fileSize - count == 1)
{
flag =false;
}
len=sizes.get(count);
//System.out.println("File Size ="+len);
output = new FileOutputStream("/mnt/sdcard/" + files.get(count));
dos=new DataOutputStream(output);
bos=new BufferedOutputStream(output);
byte[] buffer = new byte[1024];
bos.write(buffer, 0, buffer.length); //This line is important
while (len > 0 && (smblen = clientData.read(buffer)) > 0)
{
dos.write(buffer, 0, smblen);
len = len - smblen;
dos.flush();
}
dos.close(); //It should close to avoid continue deploy by resource under view
}
}

if (flag==false)
{
sock = new Socket("10.0.2.2", 5991);
flag = true;
}
} }

catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}

最佳答案

您的读取循环不正确。您需要限制读取长度,以免过度运行到下一个文件:

while (len > 0 && (smblen = clientData,read(buffer, 0, len > buffer.length ? buffer.length : (int)len)) > 0)
{
bos.write(buffer, 0, smblen);
len -= smblen;
}

其他评论:

  • 文件长度是 long,不是 int。
  • 使用更大的缓冲区,至少 8192,并在方法的顶部声明一次。您不需要每个文件一个新的。
  • 不要在循环内刷新。
  • 不要一直重新创建流。在两端使用相同的 socket 。
  • 您应该写信给“bos”,而不是“dos”。事实上,您根本不需要 DataOutputStream 来写入文件。只有 BufferedOutputStream 和 FileOutputStream。
  • 你应该发送一个文件名,一个长度,然后是一个文件,然后是下一个文件名,...这样发送者可以随时停止。这摆脱了初始计数,也摆脱了所有“标志”废话。如果您在读取下一个名称时遇到 EOFException,则对等方已关闭连接。

关于java - 我想从我的 android 下载 PC 文件夹中的所有文件,用于执行 java 套接字,但正确获得第一个文件,其他文件是垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049729/

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