Mozilla Firefox的意外行为

时间:2009-08-17 17:40:08

标签: java

我正在尝试实现仅提供静态页面的Web服务器。 这是我的超迷你网络服务器的代码。

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

class MyWebServer{

    static ServerSocket serSocket = null ;

    static{
        try {
            serSocket = new ServerSocket(80) ;
            System.out.println("Server started successfully....\n\n") ;
        } catch (IOException io) {
            System.out.println( io.getMessage() );
            System.exit(1) ;
        }
    }

    public static void main(String []args){

        while(true){
            try {
                new Thread( new ServingThread( serSocket.accept() ) ).start() ;
            } catch (IOException io) {
                System.out.println(io.getMessage());
            }
        }
    }
}

class ServingThread implements Runnable{
    private Socket socket ;

    public ServingThread(Socket socket){
        this.socket = socket ;
        System.out.println("Receives a new browser request from " + socket);
    }

    public void run() {
        BufferedReader in = null ;
        PrintWriter out = null ;

        try {

            //reading request headers from browser starts here
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String str = ".";
            while (!str.equals("")){
                str = in.readLine();
                //System.out.println(str);
            }
            System.out.println("\n\n");
            //reading request headers from browser ends here


            //writing output on outputstream starts here
            out = new PrintWriter( socket.getOutputStream(), true ) ;

            int i = (int) ( Math.random() * 10) ;
            out.println(i) ;
            System.out.println(i) ;
            //writing output on outputstream ends here

            socket.close() ;
            System.out.println("Request successfully fulfilled.\n") ;
        }
        catch (IOException io) {
            System.out.println(io.getMessage());
        }
    }
}

一切正常,但有时(并非总是)

  • 我的mozilla firefox客户端 我自动发送请求 添加新标签(Ctrl + T)或关闭 现有标签。
  • 当我要求时 http://localhost/ ,我的浏览器会显示单个数字。但是 服务器的控制台显示它得到2 或3个请求,因此,它显示2或3个数字 相应地。

我搜索了很多内容,但没有得到满意的答案。

非常感谢任何想法/解释。 :)

1 个答案:

答案 0 :(得分:1)

首先,我假设你这样做是为了练习套接字/ http /等等...因为如果你真的试图实现一个Web服务器,您应该认真考虑使用现有的或者至少查看其来源 - 即使是最简单的HTTP服务器实现也会涉及很多内容。

那就是说,你的“服务器”:-)没有正确实现HTTP(没有返回状态代码,因此)浏览器的行为在这里确实未确定 - 它可能会尝试重试相同的请求多次或不是。缓存问题也可能在这里发挥作用 - 一旦实现HTTP,如果您不希望“新标签”重复请求,则需要发送适当的缓存标头。