2010-09-12 61 views
2

即时尝试编写一个简单的Web服务器在Java中。java服务器来处理多个TCP连接

现在我只有一个简单的程序,但id喜欢扩展它,以便它可以通过建立多个tcp连接服务于多个浏览器。

我一直在阅读关于线程。我的理解是,你可以创建一个新的线程,并且这个线程将继续,就像其他程序完全一样。所以通过一个新的线程,它可以像2个可以服务2个浏览器的Web服务器,或者可以服务于X个Web浏览器的X个Web服务器。

即时通过在java中创建新线程并为每个新线程建立连接丢失了一点点。

我的想法是,我将有一个这样的循环,其获得新的连接,并传递到一个新的线程每一个新的连接

// make new ServerSocket 
while (true) { 
    Socket newConn = serverSocket.accept(); 
    // make new thread, and pass in newConn 
} 

能有人给我如何推进一些指导? (此外,如果香港专业教育学院的地方犯了一个错误,请你指出来进出口新的线程编程所以它完全有可能的香港专业教育学院没有正确地理解它。)

编辑:

ķ感谢所有。

我去写了一些东西,这个java教程帮了很大忙。

香港专业教育学院有一个新的问题,现在

我在其中包含10秒倒计时(使用了Thread.sleep(1000)),每当服务器收到请求新线程添加一个循环,我的run()方法一个图像,所以我可以看到哪些线程正在运行。 (index.html有4个图像)

所以我要求index.html页面和我的服务器工作正常。然后我打开了大约十几个新标签。我的期望是,对index.html页面的请求将是即时的,但要将图像发送到浏览器需要10秒(因为我放在那里的延迟),此时服务器将收到请求为下一个index.html页面,等等。总的来说,我认为一打index.html页面会立即提供,而4 * 12 = 36图片需要10秒才能在所有选项卡上提供。

实际发生的事情是,需要10秒钟才能获得前4张图像,接下来4张图像需要10秒钟等等,而不是服务多个网页,我的服务器只是排队处理请求并处理一页一次。

我认为我的程序有问题。但我觉得我可能无法正确理解浏览器如何与服务器交互。我认为浏览器在html页面被解析时请求新的对象。所以我的服务器应该会收到几十个请求,如果我打开一打网页。我试图在FF中打开几个选项卡,然后在FF中打开几个窗口,但这并没有帮助。然而,当我打开IE浏览器,FF和Chrome浏览器,并且我在不同的时间(间隔大约2秒)要求index.html时,它看起来像每个浏览器同时接收页面,换句话说,在一个点,有12个不同的图像正在服务,4对每个浏览器

所以我想即时通讯寻找一点确认,这是预期的行为?如果是这样,为什么我只能看到这种行为,当我打开3个不同的浏览器,而不是当我打开多个选项卡?

(对于那些问,我计划确定采取网络课程明年,但我尝试做一些基本的东西了。所以一半的自我学习,一半的H/W)

+0

这是作业/自学还是商业用途?如果是后者,我强烈建议使用[第三方HTTP服务器API](http://java-source.net/open-source/web-servers)而不是重新创建一个。 Jetty开始很好,它有JSP/Servlet支持。 – BalusC 2010-09-12 13:56:10

回答

1

您也可以考虑Netty和Java NIO。有多种方法可以做到这一点。

5

如果您正在寻找一些可靠的在线工作解决方案。
如果是为了学习的目的,然后创建自己的。
有几种方法可以做到这一点。最简单的是这样做,因为从Java Tutorial采取:

import java.net.*; 
import java.io.*; 
public class MultiServer { 
    public static void main(String[] args) throws IOException { 
     ServerSocket serverSocket = null; 
     boolean listening = true; 

     try { 
      serverSocket = new ServerSocket(4444); 
     } catch (IOException e) { 
      System.err.println("Could not listen on port: 4444."); 
      System.exit(-1); 
     } 

     while (listening) 
     new MultiServerThread(serverSocket.accept()).start(); 

     serverSocket.close(); 
    } 
} 




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

public class MultiServerThread extends Thread { 
    private Socket socket = null; 
public MultiServerThread(Socket socket) { 
super("MultiServerThread"); 
this.socket = socket; 
} 

public void run() { 

try { 
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader(
       new InputStreamReader(
       socket.getInputStream())); 

    String inputLine, outputLine; 
    KnockKnockProtocol kkp = new KnockKnockProtocol(); 
    outputLine = kkp.processInput(null); 
    out.println(outputLine); 

    while ((inputLine = in.readLine()) != null) { 
    outputLine = kkp.processInput(inputLine); 
    out.println(outputLine); 
    if (outputLine.equals("Bye")) 
     break; 
    } 
    out.close(); 
    in.close(); 
    socket.close(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 
} 

}

你会实现你的逻辑在处理您的请求:

KnockKnockProtocol kkp = new KnockKnockProtocol(); 
outputLine = kkp.processInput(null); 

你可以通过把优化你的代码你线程池中的线程,所以你不需要每次都创建一个新线程。

下面的部分是主观的,取决于请求的类型以及您对每个请求的处理方式。 如果你有很多并发的客户端请求,那么NIO就是要走的路。
如果您的请求很短,并且您有超过10个并发请求创建池。
如果你的请求超过100,那么我会开始看NIO。

0

Web服务器不过是一个带消息传递的荣耀套接字服务器。自从第一次建立网络连接以来,高科技就一直存在。大约一年半前,我有一个项目与你想要做的类似。 Java NIO是最好的选择,具有连接和线程池以及Web服务器所需的所有高级功能,但它有点复杂。如果你想要一个非常好的基准开始,检查出http://www.quickserver.org/我写的系统是基于此,现在它处理了一台服务器上的大约45,000个设备,最后我听到了。

+0

Java NIO不*具有'连接和线程池',最好的开始是java.net。 – EJP 2010-09-13 00:25:58