【问题标题】:transfer String and file through socket通过套接字传输字符串和文件
【发布时间】:2014-04-07 08:17:43
【问题描述】:

我想将文件从服务器传输到客户端。在此之前我想从特定目录发送文件名。文件未传输,因为读取返回-1。谁能纠正我哪里出错了?

我的客户端代码是这样的。

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

class PC1Client {

public static void main(String args[]) throws UnknownHostException, IOException 
{
    byte[] aByte = new byte[1];
    int bytesRead;
    Socket sock = new Socket("localhost",3000);
    InputStream is1 = sock.getInputStream();
    BufferedReader br  = new BufferedReader(new InputStreamReader(is1));
    String st = br.readLine();

    System.out.println(st);
    InputStream is = sock.getInputStream();
    FileOutputStream fos = null;
    fos = new FileOutputStream("F:\\ANI1.TXT");
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    bytesRead = is.read(aByte, 0, aByte.length);
    System.out.println(bytesRead);
     do {
         System.out.println("s");
         baos.write(aByte);
         bytesRead = is.read(aByte);
        } while (bytesRead != -1);
    bos.write(baos.toByteArray());
    bos.flush();
    bos.close();
    sock.close();
}
}

我的服务器代码是这样的。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class PC1Server {

public static void main(String[] args) throws IOException
{
    ServerSocket serversocket = new ServerSocket(3000);
    try
    {
        while(true)
        {
            String str="";
            Socket socket = serversocket.accept();
            File file = new File("D:\\ani");
            for(File fi : file.listFiles() )
            {
                str=str+fi.getName()+";";
            }
            PrintWriter outname = new PrintWriter(socket.getOutputStream());
            outname.println(str);
            outname.flush();
            outname.close();
            System.out.println("hello der");
            BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream() );
            File myfile  = new File("d:/hello.txt");
            byte[] mybyte = new byte[(int)myfile.length()];
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myfile));
            bis.read(mybyte, 0, mybyte.length);
            out.write(mybyte, 0, mybyte.length);
            out.flush();
            out.close();

        }
    }
    catch(Exception e)
    {

    }

}
  }

【问题讨论】:

    标签: java file sockets stream


    【解决方案1】:

    几点注意事项: byte[] aByte = new byte[1]; 毫无意义——它迫使您一次读取文件 1 个字节。 InputStream is = sock.getInputStream();第二次打开同一个输入流有什么意义?

    服务器代码中的outname.close(); 是导致问题的原因。
    为什么关闭输出流只是为了再次重新打开它?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多