Java Android多线程Web服务器

Java Android多线程Web服务器,java,android,multithreading,sockets,Java,Android,Multithreading,Sockets,我正在为android应用程序开发一个多线程的web服务器,我在一个使用外部.css文件和.js文件的页面上遇到了一些问题,但只使用Google Chrome!使用Firefox和Opera,页面呈现良好,使用Google Chrome,有时加载.css,有时加载.js,有时加载两者或两者都加载 这是我的应用程序的结构: WebServer.java class WebServer implements Runnable{ protected boolean ON; public void s

我正在为android应用程序开发一个多线程的web服务器,我在一个使用外部.css文件和.js文件的页面上遇到了一些问题,但只使用Google Chrome!使用Firefox和Opera,页面呈现良好,使用Google Chrome,有时加载.css,有时加载.js,有时加载两者或两者都加载

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

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();}
}}
class Client implements Runnable {
public void start(){
        thread=new Thread(this,"Client");
        thread.start();}

public void run(){
//parse the request and send a file
}
}
public class myApp extends Activity{

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

onClick(){
...
ws.start();
}}
Client.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();}
}}
class Client implements Runnable {
public void start(){
        thread=new Thread(this,"Client");
        thread.start();}

public void run(){
//parse the request and send a file
}
}
public class myApp extends Activity{

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

onClick(){
...
ws.start();
}}
myApp.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();}
}}
class Client implements Runnable {
public void start(){
        thread=new Thread(this,"Client");
        thread.start();}

public void run(){
//parse the request and send a file
}
}
public class myApp extends Activity{

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

onClick(){
...
ws.start();
}}
当我单击活动上的按钮时,它将调用webserver.start();在我看来,google chrome会同时发送更多的请求,线程也有问题。。。 你能帮我吗

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

[编辑2]
我刚用另一台电脑试过,firefox也有问题。

对代码中的线程机制有一个普遍的误解

runnable必须覆盖run。没有开始。启动嵌套线程时,将调用runnable的run()方法。换句话说,您的客户机的start方法永远不会被使用,希望它能在线程中创建一个线程。。不是很有用

重新设计您的webser,以便:

  • 它的start方法像您一样启动一个新的嵌套线程
  • 它的run方法执行以下操作
    • 您的Web服务器绑定到一个端口
    • 在循环中:接受新连接并为每个连接启动新的客户端线程
    • 循环可以由一个布尔标志控制,您可以使用该标志来停止服务器(ON将合适,即使该变量的名称不在后面,并且从语义上讲相当糟糕)
然后,每个客户机在运行时(不再使用启动方法):

  • 从套接字输入流读取数据
  • 对套接字输出流的回复
  • 简单地说,实现http协议
您可以找到一些java代码来启发您。此外,您可以考虑使用JavaNIO包,它对于单个请求可能不太有效,但在处理大量多个连接时更有效。但代码更难

你应该考虑更多的阅读,并考虑阅读一些关于关键字的东西,以确保你的Web服务器不启动两次同一个客户端的连接,或者在同时请求的情况下变得混乱。 问候,,


我想你误解了密码。他使用
start()
来启动Web服务器线程。他的代码实际上是“ok”,但他忘了将'accept()'东西放入循环中,因此他可以接受多个连接。我在客户端类中谈到start。@Zeiss我编辑了答案,因为我忘记了写while,但我的代码已经有while。@Snicolas我不明白Web服务器是否必须实现Runnable,如果它应该重写start(),就像我所做的那样。重写方法时使用注释@override,这有助于强调重写。然后,您将看到您的start方法不是overide,因为没有名为super class的方法。请将ServerSocket创建移出循环。这行不通。谢谢你!!!现在它总是起作用:)