当前位置: 首页 > 知识库问答 >
问题:

Java -客户机-服务器程序- http响应

司徒兴思
2023-03-14

我是编码和Java的新手,我已经创建了一个简单的客户端-服务器程序,客户端可以请求一个文件。它的内容将显示在浏览器页面中,还有一些细节,如数据类型和长度。我现在有一个问题,我不确定如何在浏览器中显示正确连接的服务器响应,如“HTTP/1.1 200 OK”和关闭的连接,如“Connection: close”。我有一个处理响应的方法,如下所示:

import java.io.*;
import java.net.*;
import java.util.*;
public class ReadRequest {

    private final static int LISTENING_PORT = 50505;
    protected static Socket client;
    protected static PrintStream out;
    static String requestedFile;


    
    @SuppressWarnings("resource")
    public static void main(String[] args) {    
        ServerSocket serverSocket;
        try {
            serverSocket = new ServerSocket(LISTENING_PORT);
        }
        catch (Exception e) {
            System.out.println("Failed to create listening socket.");
            return;
        }
        System.out.println("Listening on port " + LISTENING_PORT);

        try {
            while (true) {
                Socket connection = serverSocket.accept();
                System.out.println("\nConnection from "+ connection.getRemoteSocketAddress());
                ConnectionThread thread = new ConnectionThread(connection);
                thread.start();
            }
        }
        catch (Exception e) {
            System.out.println("Server socket shut down unexpectedly!");
            System.out.println("Error: " + e);
            System.out.println("Exiting.");
        }
    }
    

    private static void handleConnection(Socket connection) {

        String username = System.getProperty("user.name");
        String httpRootDir = "C:\\Users\\"+(username)+"\\Downloads\\";
        client = connection;
        try {
            
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            out = new PrintStream (client.getOutputStream());

            String line = null;     
            String req = null;      

            
            req = in.readLine();
            
            line = req;
            while (line.length() > 0)
            {
                line = in.readLine();
            }
            
            StringTokenizer st = new StringTokenizer(req);

            if (!st.nextToken().equals("GET"))
            {                                      
            
                sendErrorResponse(501);                                       
                return;
            }

            
            requestedFile = st.nextToken();

            File f = new File(httpRootDir + requestedFile);

    
            if (!f.canRead())
            {
                
                sendErrorResponse(404);                                       
                return;
            }
            
            sendResponseHeader(getMimeType(requestedFile),(int) f.length());
            
            sendFile(f,client.getOutputStream());

        }
        catch (Exception e) {
            System.out.println("Error while communicating with client: " + e);
        }
        finally {  
            try {
                connection.close();
            }
            catch (Exception e) {
            }
            System.out.println("Connection closed.");
        };
    }
    

    private static void sendResponseHeader(String type,int length)
    {
           
          out.println("Content-type: " +type+"\r\n");
          out.println("Content-Length: " +length+"\r\n");
 
    }
    
    
    private static void sendErrorResponse(int errorCode)
    {
        switch(errorCode) {
        case 404:
            out.print("HTTP/1.1 404 Not Found");    
            out.println("Connection: close " ); 
            out.println("Content-type: text/plain" +"\r\n");              
            out.println("<html><head><title>Error</title></head><body> <h2>Error: 404 Not Found</h2> <p>The resource that you requested does not exist on this server.</p> </body></html>");
            break;
        case 501:
            out.print("HTTP/1.1 501 Not Implemented");    
            out.println("Connection: close " ); 
            out.println("Content-type: text/plain" +"\r\n");                                     
            break;
        }                               
    }


    private static String getMimeType(String fileName) {
        int pos = fileName.lastIndexOf('.');
        if (pos < 0)  
            return "g-application/x-unknown";
        String ext = fileName.substring(pos+1).toLowerCase();
        if (ext.equals("txt")) return "text/plain";
        else if (ext.equals("html")) return "text/html";
        else if (ext.equals("htm")) return "text/html";
        else if (ext.equals("css")) return "text/css";
        else if (ext.equals("js")) return "text/javascript";
        else if (ext.equals("java")) return "text/x-java";
        else if (ext.equals("jpeg")) return "image/jpeg";
        else if (ext.equals("jpg")) return "image/jpeg";
        else if (ext.equals("png")) return "image/png";
        else if (ext.equals("gif")) return "image/gif";
        else if (ext.equals("ico")) return "image/x-icon";
        else if (ext.equals("class")) return "application/java-vm";
        else if (ext.equals("jar")) return "application/java-archive";
        else if (ext.equals("zip")) return "application/zip";
        else if (ext.equals("xml")) return "application/xml";
        else if (ext.equals("xhtml")) return"application/xhtml+xml";
        else return "g-application/x-unknown";
        
    }

    
    private static void sendFile(File file, OutputStream socketOut) throws IOException {
        try (InputStream infile = new BufferedInputStream(new FileInputStream(file))) {
            OutputStream outfile = new BufferedOutputStream(socketOut);
            while (true) {
                int x = infile.read(); 
                if (x < 0)
                    break; 
                outfile.write(x);  
            }
            outfile.flush();
        }
    }
    
    private static class ConnectionThread extends Thread {
        Socket connection;
        ConnectionThread(Socket connection) {
            this.connection = connection;
        }
        public void run() {
            handleConnection(connection);
        }
    }
}

对我如何做到这一点有什么建议吗?非常感谢。

共有1个答案

邢同
2023-03-14

如果您试图重新发明实现请求/响应通信的轮子,您的方法就太复杂了。最好只使用Spring MVC。

 类似资料:
  • 问题内容: 我正在尝试编写一个简单的Java http客户端,该客户端仅打印出服务器响应的一行。我的问题是服务器没有响应。这是我所拥有的,正在编译并且没有明显错误地运行,只是在键入主机名(例如“ www.google.com”)后挂起: 有什么建议?请注意,这假设存在一个“ index.html”-即使为true,它仍会挂起。 问题答案: 我认为我可以通过对代码进行少量更改来重现该问题,因此现在它

  • 我在做一个客户端/服务器应用程序。目前它的功能很好,但我需要添加一个“选项”。 server类如下所示: 因此许多客户端都能够连接到服务器。我的观点是:我希望一个连接的客户机(比如说,Client1)能够向他选择的另一个连接的客户机(Client2)发送一些东西。 我的问题是:Client1如何找到/拥有/检索Client2的套接字,因为所有的Client1都通过这个clientSocket在不同

  • 我正在尝试使用HTTP请求/响应用Java编写一个简单的客户机-服务器应用程序。我想客户端是一个桌面程序发送(张贴)请求到服务器。该服务器是一个网页,将被托管在Apache Tomcat服务器上。服务器必须能够读取信息并将其显示在浏览器上,并且必须能够用状态代码200响应客户端。我正在使用eclipse和Apache tomcat服务器。到目前为止,我已经尝试了各种资源,但我所能找到的是一个可以从

  • 我想在java上创建一个客户机/服务器应用程序,服务器的IP地址为192.168.1.100,在端口4500上等待客户机请求。 客户端从键盘上读取字符串,向服务器发送连接请求。一旦建立了连接,它就会将字符串发送到服务器。 这是我尝试的代码: 对于服务者: 对于客户端: 但这段代码有一个问题:

  • 我在Java开发了一个客户端-服务器游戏(称为“Set”)。 在调试过程中遇到了一个非常尴尬的问题: 如果在同一台机器上同时运行客户端和服务器(客户端连接到localhost),这个游戏工作得很棒(如果我运行服务器和大量客户端的话也是如此)。 但是,如果我在两台不同的机器上运行客户端和服务器,那么客户端和服务器都挂起了Inputstream readLine方法。 我会提到我正在使用writeBy