2011-08-18 67 views
1

我正在开发适用于android应用程序的多线程Web服务器,并且在使用外部.css文件和.js文件的页面上遇到了一些问题,但只与Google Chrome浏览器有关!使用Firefox和Opera时,页面呈现良好,Google Chrome有时会加载.css,有时会加载.js,有时甚至都不加载。适用于Android的多线程Web服务器

这是我的应用程序的结构:

WebServer.java

class WebServer implements Runnable{ 
protected boolean ON; 

public void start(){ 
      if(!ON){ 
      ON=true; 
      thread=new Thread(this,"WebServer"); 
      thread.start(); }} 

public void run(){ 
while(ON){ 
listenSocket = new ServerSocket(port); 
Socket connectionSocket = listenSocket.accept(); 
Thread t = new Thread(new Client(connectionSocket)); 
t.start(); 
listenSocket.close();} 
}} 

Client.java

class Client implements Runnable { 
public void start(){ 
     thread=new Thread(this,"Client"); 
     thread.start();} 

public void run(){ 
//parse the request and send a file 
} 
} 

myApp.java

public class myApp extends Activity{ 

onCreate(){ 
WebServer ws=new WebServer(8080); 
} 

onClick(){ 
... 
ws.start(); 
}} 

当我点击活动按钮时,它调用webserver.start();在我看来,谷歌浏览器同时发送更多请求,并且线程出现问题... 你能帮助我吗?

[编辑] 我忘了写在run()方法中的循环中的问题

[编辑2] 我只是想与其他电脑,有问题也与火狐..

+1

将ServerSocket创建移出循环。这是行不通的。 – ZeissS

+0

Thank'youuu !!!现在它的作品总是:) – supergiox

回答

3

有一个在您的代码线程机制的一般误解。

runnable必须覆盖运行。不开始。 runnable的run()方法将在嵌套线程启动时调用。换句话说,你的客户端的启动方法将永远不会被使用,并且完全希望,因为它会在一个线程中创建一个线程..不是非常有用的。

重新设计你的webser,使得:

  • 它的启动方法开始像你一样
  • 它的运行方法的新嵌套线程执行以下
    • 您的Web服务器绑定到一个端口
    • 在一个循环中:接受新的连接并为每个连接启动新的客户端线程。
    • 回路可以通过一个布尔标志,你可以上升到停止服务器进行控制(ON会适合,即使这个变量的名称不符合java naming conventions和比较差semanticly说)

然后每个客户端将在它的运行(不启动法):

  • 读取从套接字输入流数据
  • 上插座的OutputStream答复
  • 简单地说,执行http protocole。

你可以找到一些java代码来激励你on the web,some examples are well documented。另外,您可以考虑使用对于单个请求可能不太有效的java.nio包,但在处理大量多个连接时更有效。但代码更难。

你应该考虑阅读更多关于runnables,也可以阅读一些东西有关synchronized关键字,以确保您的Web服务器不启动两次相同的客户端连接或获得的并发请求的情况下迷茫。

Regards, Stéphane

+1

我认为你误解了代码。他使用'start()'启动Web服务器线程。他的代码实际上是“好的”,但他忘了将accept()函数放入循环中,因此可以接受多个连接。 – ZeissS

+1

我正在谈论客户端类的开始。 – Snicolas

+0

@ZeissS我编辑了答案,因为我忘了写一段时间,但我的代码已经有一段时间了。 – supergiox