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

Java 服务器返回客户端需要的任何文件,java,sockets,Java,Sockets,我使用的是linux,我的服务器接收来自客户端的输入流,并且只返回客户端从浏览器请求的文件 它可以完美地编译,但不返回任何内容。我在最后列出了运行服务器和获取文件所遵循的所有步骤 服务器 import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocke

我使用的是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()方法只保留文件名。客户端将是请求文件的浏览器,例如:

  • 客户端需要一个文件hello.txt
    localhost:9999/hello.txt
  • 服务器位于文件夹java/bin中,名称为server.class
  • 文件hello.txt位于java/files中
这是我从控制台执行服务器的方式:

  • cd/java文件
  • java-cp../bin服务器[-p 9999]

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

首先,听从Jon Skeet的建议

其次,如果您正在学习,请遵循以下步骤

问题是您试图写入的不是套接字输出流,而是文件 当然,如果您想使用http服务器。你可以查一下

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

首先,您没有在响应中写入任何HTTP头。我强烈建议不要尝试编写您自己的HTTP服务器,因为已经存在这么多的HTTP服务器。。。如果您想编写代码以按照自己的意愿进行响应,请将其放在现有HTTP服务器的上下文中,例如作为Tomcat中的servlet。(我还要指出,您编写的代码将是一个重大的安全问题……您真的不希望客户端能够请求服务器上的任何文件)。您能否在回答中告知您不喜欢的内容?虽然此链接可以回答问题,最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-@如果你读了所有你能看到的,我提到的主要问题。声明“Promblem is…”和添加链接是更好的选择,而不是重写他所有的代码,因为这些代码有许多其他错误,甚至与问题无关。但我可以同意,最好是把它写成评论