开发者

Requesting specific file from a server via socket in java

I found some code that transfers files between a client and a server. But the file location and port numbers are hard coded. I was wondering if there is a way in which a client can specify what file s/he needs from the server - so that when the server receives the request, it can send that particular file to the client. Thank you.


Edit [1]: Code snippet and context description:

I am adding the code I have so far, based on the feedbacks and comments. Hopefully, this answers some questions in the comment section.

import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Original coder adapted from:
 * http://www.rgagnon.com/javadetails/java-0542.html
 *
 * Best intentions:
 * This program runs both as server and client.
 * 
 * The client asks for a specific file from _
 * the server x number of times in a loop.
 * 
 * Server simply serves the file requested.
 */

public class FileServer extends Thread {

    public static void server() throws IOException {
        ServerSocket servsock = new ServerSocket(13267);
        while (true) {
            System.out.println("Waiting...");

            Socket sock = servsock.accept();
            System.out.println("Accepted connection : " + sock);

            //Retrieve filename to serve
            InputStream is = sock.getInputStream();
            BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
            String fileName = bfr.readLine();
            bfr.close();

            System.out.println("Server side got the file name:" + fileName);

            //Sendfile
            File myFile = new File(fileName);
            byte[] mybytearray = new byte[(int) myFile.length()];
            FileInputStream fis = new FileInputStream(myFile);
            BufferedInputStream bis = new BufferedInputStream(fis);
            bis.read(mybytearray, 0, mybytearray.length);
            OutputStream os = sock.getOutputStream();
            System.out.println("Sending...");
            os.write(mybytearray, 0, mybytearray.length);
            os.flush();
            sock.close();
        }
    }

    public static void client(int index) throws IOException {
        int filesize = 6022386; // filesize temporary hardcoded

        long start = System.currentTimeMillis();
        int bytesRead;
        int current = 0;
        //Localhost for testing
        Socket sock = new Socket("127.0.0.1", 13267);

        System.out.println("Connecting...");

        //Ask for specific file: source1
        String fileName = "source1";
        OutputStream os = sock.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.println(fileName);


        //Receive file
        byte[] mybytearray = new byte[filesize];
        InputStream is = sock.getInputStream();
        FileOutputStream fos = new FileOutputStream("source1-copy" + index);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bytesRead = is.read(mybytearray, 0, mybytearray.length);
        current = bytesRead;

        // thanks to A. Cádiz for the bug fix
        do {
            bytesRead =
                    is.read(mybytearray, 
                            current, (mybytearray.length - current));
            if (bytesRead >= 0) {
                current += bytesRead;
            }
        } while (bytesRead > -1);

        bos.write(mybytearray, 0, current);
        bos.flush();

        long end = System.currentTimeMillis();
   开发者_如何转开发     System.out.println(end - start);
        os.flush();

        bos.close();
        sock.close();
    }

    public static void main(String[] args) throws IOException {

        FileServer fs = new FileServer();
        fs.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            Logger.getLogger(
                   FileServer.class.getName()).log(Level.SEVERE, null, ex);
        }

        for (int i = 0; i < 5; i++) {
            client(i);
        }

    }

    @Override
    public void run() {
        try {
            server();
        } catch (IOException ex) {
            Logger.getLogger(
                   FileServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

When I run this code, it is getting stuck at "Connecting ..." line. Here is the output:

Waiting...

Accepted connection : Socket[addr=/127.0.0.1,port=44939,localport=13267]

Connecting...


@moejoe I think you're over thinking this.

If you have it in place to send a file already, then the first thing to do is abstract that functionality out so you can run it as a method and supply a pathname/filename.

Then you can use the socket (which is two way) to send a message from the client to the server asking for what file you want. Beyond that, it's a matter of how to get the file you want from the UI. You may need to have the server supply a method of "list available files", i.e. ls functionality.

This is all fairly trivial to implement.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜