[英]Multithreaded Web Server for Android
我正在为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();}
}}
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();。 我认为google chrome会同时发送更多请求,并且线程有问题...您能帮我吗?
[编辑]我忘了在问题的run()方法中编写循环
[编辑2]我刚尝试过另一台电脑,但是Firefox也有问题。
您的代码中普遍存在对线程机制的误解。
可运行变量必须覆盖运行。 无法启动。 当嵌套线程启动时,将调用runnable的run()方法。 换句话说,您的客户端的start方法将永远不会使用,并且会完全希望,因为它将在线程内创建一个线程。不是很有用。
重新设计您的Webser,以便:
那么每个客户端都将在运行中(不再需要start方法):
您可以在网络上找到一些Java代码来激发您的灵感, 一些示例已被充分记录在案 。 另外,您可以考虑使用java.nio包,该包对于单个请求可能无效,但是在处理大量的多个连接时效率更高。 但是代码更难。
您应该考虑阅读有关可运行对象的更多信息,还应考虑阅读有关同步关键字的一些知识,以确保您的Web服务器不会为同一客户端启动两次连接或在同时请求的情况下感到困惑。
此致,Stéphane
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.