通过套接字传输字符串和文件

时间:2014-03-05 10:24:13

标签: java file sockets stream

我想将文件从服务器传输到客户端。在此之前我想从特定目录发送文件名。当读取返回-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)
    {

    }

}
  }

1 个答案:

答案 0 :(得分:0)

几点说明: byte[] aByte = new byte[1];毫无意义 - 它会强制您一次读取1个字节的文件。 InputStream is = sock.getInputStream();第二次打开相同的输入流有什么意义?

服务器代码中的

outname.close();是导致问题的原因 为什么要关闭输出流只是为了重新打开它?