繁体   English   中英

适用于Android的多线程Web服务器

[英]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命名约定并且从语义上来讲也很差),ON仍然合适。

那么每个客户端都将在运行中(不再需要start方法):

  • 从套接字输入流读取数据
  • 回复套接字输出流
  • 简要地,实现http协议。

您可以在网络上找到一些Java代码来激发您灵感, 一些示例已被充分记录在案 另外,您可以考虑使用java.nio包,该包对于单个请求可能无效,但是在处理大量的多个连接时效率更高。 但是代码更难。

您应该考虑阅读有关可运行对象的更多信息,还应考虑阅读有关同步关键字的一些知识,以确保您的Web服务器不会为同一客户端启动两次连接或在同时请求的情况下感到困惑。

此致,Stéphane

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM