3

I have used server socket concept in java to transfer files like images and videos. But when i receive at the client side, i am customizing the file names. Can i get the original name of the file as it is?

For Example:

If the file from server end for transfer is "abc.txt", i need this same name to be reflected in the client end(without passing the name separately).

In the server end:

public class FileServer {
  public static void main (String [] args ) throws Exception {
    // create socket
    ServerSocket servsock = new ServerSocket(13267);
    while (true) {
      System.out.println("Waiting...");

      Socket sock = servsock.accept();
      System.out.println("Accepted connection : " + sock);
      OutputStream os = sock.getOutputStream();
    new FileServer().send(os);
      sock.close();
      }
    }

  public void send(OutputStream os) throws Exception{
      // sendfile
      File myFile = new File ("C:\\User\\Documents\\abc.png");
      byte [] mybytearray  = new byte [(int)myFile.length()+1];
      FileInputStream fis = new FileInputStream(myFile);
      BufferedInputStream bis = new BufferedInputStream(fis);
      bis.read(mybytearray,0,mybytearray.length);
      System.out.println("Sending...");
      os.write(mybytearray,0,mybytearray.length);
      os.flush();
  }
}

In the client end:

    public class FileClient{
  public static void main (String [] args ) throws Exception {


    long start = System.currentTimeMillis();


    // localhost for testing
    Socket sock = new Socket("127.0.0.1",13267);
    System.out.println("Connecting...");
    InputStream is = sock.getInputStream();
    // receive file
    new FileClient().receiveFile(is);
       long end = System.currentTimeMillis();
    System.out.println(end-start);

    sock.close();
  }

  public void receiveFile(InputStream is) throws Exception{
      int filesize=6022386;
      int bytesRead;
      int current = 0;
      byte [] mybytearray  = new byte [filesize];

        FileOutputStream fos = new FileOutputStream("def");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bytesRead = is.read(mybytearray,0,mybytearray.length);
        current = bytesRead;


        do {
           bytesRead =
              is.read(mybytearray, current, (mybytearray.length-current));
           if(bytesRead >= 0) current += bytesRead;
        } while(bytesRead > -1);

        bos.write(mybytearray, 0 , current);
        bos.flush();
        bos.close();
  }
}
4

4 回答 4

4

让接收者知道文件名,或者:

a) 它必须假设它知道这个名字,因为它要求它,

b) 服务器首先将名称作为流的一部分发送。

如果您发明了一种无需实际发送即可发送信息的方法,请告诉我,我们可以成为亿万富翁。我们可以称之为“计算机心灵感应”。

于 2011-10-08T11:06:06.910 回答
2

是的,只需myFile.getName()在实际文件内容之前传输元数据(在您的情况下),并让客户端和服务器读取并发出该元数据。使用已建立的协议是个好主意,例如HTTP及其Content-Disposition标头。

于 2011-10-08T11:08:14.017 回答
1

有一种更简单的方法可以做到这一点。只需将输入流包装在 DataInputStream 中并使用 .writeUTF(myFile.getName()) 之类的方法。同样,您可以通过在 DataInputStream 上应用 .readUTF 在接收器处读取文件名。这是一个示例代码: 发件人:

FileInputStream fis = new FileInputStream(myFile);  
    BufferedInputStream bis = new BufferedInputStream(fis);
    DataInputStream dis = new DataInputStream(bis);
    OutputStream os;
    try {
        os = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeUTF(myFile.getName());  
.............////// catch exceptions

接收者:

InputStream in;
    try {
        bufferSize=socket.getReceiveBufferSize();
        in=socket.getInputStream();
        DataInputStream clientData = new DataInputStream(in);
        String fileName = clientData.readUTF();
        System.out.println(fileName);
................../////// catch exceptions
于 2013-06-26T19:29:24.653 回答