3

私はJavaでサーバーソケットの概念を使用して、画像やビデオなどのファイルを転送しました。しかし、クライアント側で受信するときは、ファイル名をカスタマイズしています。ファイルの元の名前をそのまま取得できますか?

例えば:

サーバー側から転送するファイルが「abc.txt」の場合、この同じ名前をクライアント側に反映させる必要があります(名前を個別に渡す必要はありません)。

サーバー側:

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();
  }
}

クライアント側:

    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

この参考文献を参照してください、役立つかもしれません...

http://www.rgagnon.com/javadetails/java-0542.html

http://www.java2s.com/Code/Java/Network-Protocol/TransferafileviaSocket.htm

http://www.artima.com/forums/flat.jsp?forum=1&thread=34857

于 2011-10-08T11:05:48.963 に答える
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 に答える