发送多个文件时的 Java 客户端-服务器问题

标签 java file-io client-server

我重写了一些代码来实现下面的两个答案,你瞧,我让它发送 1 个图像,但现在我只需要它继续发送,但服务器在 1 个图像后完成。

客户端(修订版):

public void transferImage() {

File file = new File(ServerStats.clientFolder);
String[] files = file.list();
int numFiles = files.length;
boolean done = false;
BufferedInputStream bis;
BufferedOutputStream bos;
int num;
byte[] byteArray;
long count;
long len;

Socket socket = null ;
while (!done){

  try {
    socket = new Socket(ServerStats.imgServerName,ServerStats.imgServerPort) ;
    InputStream inStream = socket.getInputStream() ;
    OutputStream outStream = socket.getOutputStream() ;
    System.out.println("Connected to : " + ServerStats.imgServerName);

    BufferedReader inm = new BufferedReader(new InputStreamReader(inStream));
    PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);

    for (int itor = 0; itor < numFiles; itor++) {

      String fileName = files[itor];
      System.out.println("transfer: " + fileName);
      File sentFile = new File(fileName);
      len = sentFile.length();
      System.out.println(len);
      out.println(len);
      out.println(sentFile);


      //SENDFILE
      bis = new BufferedInputStream(new FileInputStream(fileName));
      bos = new BufferedOutputStream(socket.getOutputStream( ));
      byteArray = new byte[1000000];
      count = 0;
      while ( (num = bis.read(byteArray)) >0 ){
        //num = bis.read(byteArray);
        bos.write(byteArray,0,num);
      }
      bos.close();
      bis.close();
      System.out.println("file done: " + itor);
    }
    done = true;
  } catch (IOException ee){
    System.err.println("FileIO Error: " + ee);
  }
}

}

服务器(修订版):

public static void main(String[] args) {
BufferedInputStream bis;
BufferedOutputStream bos;
int num;
File file = new File(ServerStats.serverFolder);
if (!(file.exists())){
  file.mkdir();
}

try {
  ServerSocket socket = new ServerSocket(ServerStats.imgServerPort);
  Socket incoming = socket.accept();

  try {
    try{
      if (!(file.exists())){
        file.mkdir();
      }
      InputStream inStream = incoming.getInputStream();
      OutputStream outStream = incoming.getOutputStream();

      BufferedReader inm = new BufferedReader(new InputStreamReader(inStream));
      PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
      String length2 = inm.readLine();
      System.out.println(length2);
      String filename = inm.readLine();
      System.out.println("Filename = " + filename);
      out.println("ACK: Filename received = " + filename);

      //RECIEVE and WRITE FILE
      byte[] receivedData = new byte[1000000];
      bis = new BufferedInputStream(incoming.getInputStream());
      bos = new BufferedOutputStream(new FileOutputStream(ServerStats.serverFolder + "/" + filename));

      //long length = (long)Integer.parseInt(length2);
      //length++;
      while ( (num = bis.read(receivedData)) > 0){
        bos.write(receivedData,0,num);
      }
      //System.out.println(counter);
      bos.close();
      bis.close();

      File receivedFile = new File(filename);
      long receivedLen = receivedFile.length();
      out.println("ACK: Length of received file = " + receivedLen);

    } finally {
      incoming.close();
   }
  } catch (IOException e){
    e.printStackTrace();
  }
} catch (IOException e1){
  e1.printStackTrace();
}

}

输出:

    Welcome to DrJava.  Working directory is C:\Documents and Settings\Dapper Dan\Desktop
> run ServerQueue.Client
Connected to : localhost
transfer: Sunset.jpg
71189
file done: 0
transfer: Water lilies.jpg
83794
FileIO Error: java.net.SocketException: Socket is closed
Connected to : localhost
transfer: Sunset.jpg
71189
> 

这是客户端的输出,唯一传输的图像是 Sunset.jpg,如文件完成语句所示。

对于造成这种情况的原因有什么想法吗?

最佳答案

在客户端,将套接字(和关联的流)创建移动到 numFiles 迭代器循环下

for (int itor = 0; itor < numFiles; itor++) {
//socket = new Socket(...
//socket's outputstream = ....

在服务器端,将 socket.accept 调用及其下面的所有逻辑移至 while(true) 循环下。

关于发送多个文件时的 Java 客户端-服务器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711360/

相关文章:

php - 如何使用 PHP 流式传输媒体文件?

c - 为什么我的客户端没有收到任何字节?

java - 无法在套接字上使用 BufferedReader/Writer 发送和接收数据

java - 将 Set<E> 转换为 String[] 会给出错误顺序的元素

java - 如何解决 alfresco sdk 中的 alfresco webscripts 中的 CORS 错误?

java - 在彼此之上的物体上绘画

c++ - 如何调用 shell "file copy dialog"来报告 Win32 中的复制进度?

java - Java如何从文本文件中提取数据

python - 在Python中读取传入的请求字符串

java - 如何以有效的方式与基于键的对象数组列表进行比较