【问题标题】:Java Custom Server, Works mostly but randomly failsJava 自定义服务器,主要工作但随机失败
【发布时间】:2017-09-08 00:58:18
【问题描述】:

所以我一直在尝试更多地了解网站和 http 请求等,所以我一直在做的一个项目是用纯 java 设置我自己的服务器。在大多数情况下,它是成功的,我学到了很多东西,而且效果很好,但是似乎在它空闲了一段时间后,它就不再听请求了。这是适用的代码,处理请求的部分相对简单。我还摆脱了用于记录的 println 语句:

public class Server{
public static void main(String args[]){
    Socket clientSocket = null;
    ServerSocket server = null;
    try{
        server = new ServerSocket(5555);
    }//end of try
    catch(Exception e){
        System.out.println("Error setting up listener");
        e.printStackTrace();
        System.exit(0);
    }//end of catch
    while(true){
        try{
            clientSocket = server.accept();
            InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
            BufferedReader reader = new BufferedReader(isr);
            new HandleRequest(reader.readLine(),clientSocket).start();
        }//end of try
        catch(Exception e){
            //send 500 error header and error message
        }//end of catch
    }//end of while
  }//end of main
}//end of Server class

HandleRequest 是一个扩展 Thread 的类,它确定要发送回客户端的内容并将其写回发送给它的套接字。但问题是,在某些情况下,当尝试连接时,server.accept() 部分甚至不会触发(尽管并非总是如此,一天晚上我启动了服务器,早上它仍然工作,但这通常情况并非如此)。有时,如果我尝试第二次连接,这将导致服务器同时处理两个请求,这对我来说有点奇怪。我在这里做错了吗?

编辑:我也知道这是一种糟糕的做法,只阅读请求的第一行并且它只适用于 GET 请求。如前所述,这对我来说是一个学习项目,并不打算用于任何重要的事情,尽管这可能是我接下来尝试实施的事情。

【问题讨论】:

    标签: java http server


    【解决方案1】:

    客户端处理线程应该自己处理readLine()。目前如果你有一个行为不端的客户端,它会阻塞接受线程。

    【讨论】:

    • 哦,这真的很有意义,我会试试的。知道什么会导致客户“行为不端”吗?
    • 错误或恶意行为者。例如,连接但不发送任何内容。常见的 DOS 攻击。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多