2014-03-05 171 views
0

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

    } 

} 
    } 

回答

0

几点注意事项: byte[] aByte = new byte[1];是没有意义的 - 它迫使你在一个时间来读取文件1个字节。 InputStream is = sock.getInputStream();第二次打开相同的输入流是什么意思?

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