Java Android多线程Web服务器
我正在为android应用程序开发一个多线程的web服务器,我在一个使用外部.css文件和.js文件的页面上遇到了一些问题,但只使用Google Chrome!使用Firefox和Opera,页面呈现良好,使用Google Chrome,有时加载.css,有时加载.js,有时加载两者或两者都加载 这是我的应用程序的结构: WebServer.javaJava 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
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协议
你应该考虑更多的阅读,并考虑阅读一些关于关键字的东西,以确保你的Web服务器不启动两次同一个客户端的连接,或者在同时请求的情况下变得混乱。 问候,,
我想你误解了密码。他使用
start()
来启动Web服务器线程。他的代码实际上是“ok”,但他忘了将'accept()'东西放入循环中,因此他可以接受多个连接。我在客户端类中谈到start。@Zeiss我编辑了答案,因为我忘记了写while,但我的代码已经有while。@Snicolas我不明白Web服务器是否必须实现Runnable,如果它应该重写start(),就像我所做的那样。重写方法时使用注释@override,这有助于强调重写。然后,您将看到您的start方法不是overide,因为没有名为super class的方法。请将ServerSocket创建移出循环。这行不通。谢谢你!!!现在它总是起作用:)