2009-08-17 101 views
0

我想实现一个仅服务于静态页面的web服务器。 这是我的超迷你网络服务器的代码。mozilla firefox意外的行为

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个数字。

我GOOGLE了很多,但没有得到一个满意的答案。

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

+0

它是否必须是Java?这是一个Ruby中的超小型Web服务器,可以从Mac,Windows和Linux上的USB驱动器运行。 Pinky:http://yellosoft.us/index.php?id=86 – mcandre 2009-08-17 17:44:01

+0

是的,我正在使用java。任何java链接:-)。 – mogli 2009-08-17 18:01:29

回答

1

首先,我假设你正在做这个作为一个练习,以了解插座/ HTTP /等...因为如果你真的试图实现一个Web服务器,你应该认真考虑使用现有的或至少看看它的来源 - 即使是最简单的HTTP服务器实现也涉及很多东西。

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

+0

任何简单的java实现的网络服务器与源代码的在线参考。 :-)。 – mogli 2009-08-17 18:04:30

+0

下面是一个OS Java Web服务器的列表:http://java-source.net/open-source/web-servers。而这里的写上一个(相当陈旧,但仍然有用)教程:http://java.sun.com/developer/technicalArticles/Networking/Webserver/ 谷歌与不少环节出现,以及:HTTP:/ /www.google.com/search?source=ig&hl=zh-CN&rlz=&q=simple+java+web+server – ChssPly76 2009-08-17 18:17:50

+0

thnx ChssPly。我已经完成了第二个链接。它也不能正确实现HTTP。 – mogli 2009-08-17 18:33:17