服务器返回客户端想要的任何文件

时间:2016-03-06 12:09:16

标签: java sockets

我正在使用linux,我的服务器从客户端接收输入流,只返回客户端要求的文件。

它编译完美但没有返回任何内容,我列出了我在结束时遵循的所有步骤来运行服务器并获取文件。

服务器

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;

        try {
            serverSocket = new ServerSocket(9999);
        } catch (IOException ex) {
            System.out.println("Can't setup server on this port number. ");
        }

        Socket socket = null;
        InputStream in = null;
        OutputStream out = null;

        try {
            socket = serverSocket.accept();
        } catch (IOException ex) {
            System.out.println("Can't accept client connection. ");
        }

        try {
            in = socket.getInputStream();
        } catch (IOException ex) {
            System.out.println("Can't get socket input stream. ");
        }

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String line = br.readLine();
            System.out.println("File name = " + line);

            //Deixem nomes el nom del File o fitxer
            String fileName = line.replace("GET /", "");
            fileName = fileName.replace(" HTTP/1.1", "");
            System.out.println("File name is" + fileName);          

            out = new FileOutputStream(fileName);
        } catch (FileNotFoundException ex) {
            System.out.println("File not found. ");
        }

        byte[] bytes = new byte[16*1024];

        int count;
        while ((count = in.read(bytes)) > 0) {
            out.write(bytes, 0, count);
            System.out.println("Bytees "+count);
        }

        out.close();
        in.close();
        socket.close();
        serverSocket.close();
    }
}

正如您所看到的,我使用方法replace()只保留fileName。客户端将是要求提供文件的浏览器,例如:

  • 客户需要文件hello.txt localhost:9999/hello.txt
  • 服务器位于文件夹java / bin中,名称为 Server.class
  • 文件 hello.txt 位于java / files

这是我如何从控制台执行我的服务器:

  • cd java / files
  • java -cp ../bin Server [-p 9999]

但我没有收到任何文件为什么?我做错了吗?

1 个答案:

答案 0 :(得分:0)

首先,请遵循Jon Skeet的建议

其次,如果你正在学习,那么请遵循这个 writing and reading using socket

问题是您尝试不写入套接字输出流而是写入文件  当然,如果你想做http服务器。你可以查看simple http server question

其他问题:  你必须阅读你的文件以进行流式传输,最好编写一个responce标头。 您的服务器将只处理一个不正确的请求。您应该忽略路径并且只允许下载特定格式。你的try catch块误用了。