2014-03-05 169 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();在您的服務器代碼是什麼導致您的問題。
爲什麼關閉輸出流只是爲了重新打開它?