Java Web服务器在android中不工作

Java Web服务器在android中不工作,java,android,webserver,Java,Android,Webserver,我正在尝试在android中创建一个简单的多线程服务器。我使用的代码不会给我任何错误,但会发出警告。请查看我的代码并告诉我的错误。如果将代码作为java应用程序运行,则代码可以正常工作。代码如下: package dolphin.developers.com; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept

我正在尝试在android中创建一个简单的多线程服务器。我使用的代码不会给我任何错误,但会发出警告。请查看我的代码并告诉我的错误。如果将代码作为java应用程序运行,则代码可以正常工作。代码如下:

 package dolphin.developers.com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import android.app.Activity;
import android.os.Environment;
import android.os.Looper;
import android.util.Log;


public   class AnroidWebServerActivity extends Activity  {
     ServerSocket serverSocket;

{





    try {

        runserver();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
    public void runserver() throws Exception {


        serverSocket = new ServerSocket(8080);
        acceptRequest();

    }

    private void acceptRequest() throws Exception{

        while(true){

            Socket s = serverSocket.accept();
            Log.v("tag", "server is ruunning!!");

            ConnectionHandler ch = new ConnectionHandler(s);
            ch.start();
        }

    }


       public class ConnectionHandler extends Thread {

           PrintWriter pw;
           BufferedReader br;

           Socket s;
           public ConnectionHandler(Socket s) throws Exception{
               this.s = s;

               br = new BufferedReader(new InputStreamReader(s.getInputStream()));
               pw = new PrintWriter(s.getOutputStream());



           }

           @Override
        public void run() {
             Looper.loop();
               try{

               String reqS = "";


               while (br.ready() || reqS.length() == 0){

                   reqS += (char) br.read();
        }

               System.out.println(reqS);

               HttpRequest req = new HttpRequest(reqS);
               HttpResponse res = new HttpResponse(req);


               pw.write(res.response.toCharArray());
               pw.close();
               br.close();
               s.close();


               }
               catch (Exception e) {
                   e.printStackTrace(); 
                   }
               }


       }


       public class HttpRequest{
           public String filename ;

        public HttpRequest(String request){

               String lines[] = request.split("\n");
               lines = lines[0].split(" ");
               filename = lines[1];


           } 

       }
             public class HttpResponse{

                 HttpRequest req;

                 String root;

                 String response;

                 public HttpResponse(HttpRequest request){
                     req=request;

                     root = Environment.getExternalStorageDirectory() + "/";

                     File f  = new File(root + req.filename);


                     try{


                     response+= "HTTP/1.1 200 \r\n";
                     response+= "Apache Server /1.0";
                     response+= "Content-Type: text/html \r\n";
                     response+="Connection: close \r\n";
                     response+= "Content-Length:" + f.length() + "\r\n";
                     response+= "\r\n";

                     FileInputStream fis = new FileInputStream(f);


                     int s;

                     while ((s = fis.read()) != -1){

                         response += (char)s ;


                     }

                     fis.close(); 


                 }catch(FileNotFoundException fg){
                     response = response.replace("200", "404");

                 }

                     catch(IOException e ){

                         response  = response.replace("200", "500");

                         e.printStackTrace();
                     }
             }

}

}
日志:

07-18 14:34:23.367: W/System.err(1249): android.os.NetworkOnMainThreadException
07-18 14:34:23.388: W/System.err(1249):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-18 14:34:23.398: W/System.err(1249):     at libcore.io.BlockGuardOs.accept(BlockGuardOs.java:54)
07-18 14:34:23.398: W/System.err(1249):     at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:98)
07-18 14:34:23.398: W/System.err(1249):     at java.net.ServerSocket.implAccept(ServerSocket.java:202)
07-18 14:34:23.398: W/System.err(1249):     at java.net.ServerSocket.accept(ServerSocket.java:127)
07-18 14:34:23.407: W/System.err(1249):     at dolphin.developers.com.AnroidWebServerActivity.acceptRequest(AnroidWebServerActivity.java:47)
07-18 14:34:23.407: W/System.err(1249):     at dolphin.developers.com.AnroidWebServerActivity.runserver(AnroidWebServerActivity.java:40)
07-18 14:34:23.407: W/System.err(1249):     at dolphin.developers.com.AnroidWebServerActivity.<init>(AnroidWebServerActivity.java:30)
07-18 14:34:23.407: W/System.err(1249):     at java.lang.Class.newInstanceImpl(Native Method)
07-18 14:34:23.407: W/System.err(1249):     at java.lang.Class.newInstance(Class.java:1319)
07-18 14:34:23.407: W/System.err(1249):     at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
07-18 14:34:23.407: W/System.err(1249):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
07-18 14:34:23.407: W/System.err(1249):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-18 14:34:23.407: W/System.err(1249):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-18 14:34:23.407: W/System.err(1249):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-18 14:34:23.427: W/System.err(1249):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-18 14:34:23.447: W/System.err(1249):     at android.os.Looper.loop(Looper.java:137)
07-18 14:34:23.447: W/System.err(1249):     at android.app.ActivityThread.main(ActivityThread.java:5039)
07-18 14:34:23.447: W/System.err(1249):     at java.lang.reflect.Method.invokeNative(Native Method)
07-18 14:34:23.447: W/System.err(1249):     at java.lang.reflect.Method.invoke(Method.java:511)
07-18 14:34:23.447: W/System.err(1249):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-18 14:34:23.447: W/System.err(1249):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-18 14:34:23.447: W/System.err(1249):     at dalvik.system.NativeStart.main(Native Method)
07-18 14:34:23.367:W/System.err(1249):android.os.NetworkOnMainThreadException
07-18 14:34:23.388:W/System.err(1249):在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-18 14:34:23.398:W/System.err(1249):位于libcore.io.BlockGuardOs.accept(BlockGuardOs.java:54)
07-18 14:34:23.398:W/System.err(1249):位于java.net.PlainSocketImpl.accept(PlainSocketImpl.java:98)
07-18 14:34:23.398:W/System.err(1249):位于java.net.ServerSocket.implacpt(ServerSocket.java:202)
07-18 14:34:23.398:W/System.err(1249):位于java.net.ServerSocket.accept(ServerSocket.java:127)
07-18 14:34:23.407:W/System.err(1249):在dolphin.developers.com.AnroidWebServerActivity.acceptRequest(AnroidWebServerActivity.java:47)
07-18 14:34:23.407:W/System.err(1249):在dolphin.developers.com.AnroidWebServerActivity.runserver(AnroidWebServerActivity.java:40)
07-18 14:34:23.407:W/System.err(1249):在dolphin.developers.com.AnroidWebServerActivity.(AnroidWebServerActivity.java:30)
07-18 14:34:23.407:W/System.err(1249):位于java.lang.Class.newInstanceImpl(本机方法)
07-18 14:34:23.407:W/System.err(1249):位于java.lang.Class.newInstance(Class.java:1319)
07-18 14:34:23.407:W/System.err(1249):位于android.app.Instrumentation.newActivity(Instrumentation.java:1054)
07-18 14:34:23.407:W/System.err(1249):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
07-18 14:34:23.407:W/System.err(1249):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-18 14:34:23.407:W/System.err(1249):在android.app.ActivityThread.access$600(ActivityThread.java:141)
07-18 14:34:23.407:W/System.err(1249):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-18 14:34:23.427:W/System.err(1249):位于android.os.Handler.dispatchMessage(Handler.java:99)
07-18 14:34:23.447:W/System.err(1249):在android.os.Looper.loop(Looper.java:137)
07-18 14:34:23.447:W/System.err(1249):位于android.app.ActivityThread.main(ActivityThread.java:5039)
07-18 14:34:23.447:W/System.err(1249):位于java.lang.reflect.Method.invokenactive(本机方法)
07-18 14:34:23.447:W/System.err(1249):位于java.lang.reflect.Method.invoke(Method.java:511)
07-18 14:34:23.447:W/System.err(1249):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-18 14:34:23.447:W/System.err(1249):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-18 14:34:23.447:W/System.err(1249):在dalvik.System.NativeStart.main(本机方法)

看起来您正试图直接从活动的主线程运行服务器。这将阻止应用程序运行,并最终导致其崩溃。您需要在后台线程上运行服务器


正确的方法是将您的服务器线程移动到服务中,您可以在此处阅读有关该服务的更多信息:。本文将为您提供一些直接在活动中使用线程的其他选项:。

如果您显示警告消息,对我们来说会更容易。很抱歉,我忘记了。请现在查看,似乎缺少一些代码。try{runserver();是否发生在构造函数内部?取决于您是否只是想了解这一点,您可能希望跳过重新发明轮子,而只使用现有的HTTP服务器?Android包括可用于此目的的HttpServerConnection,并且有许多第三方库(搜索Android HTTP服务器)@user2589896启动将执行web服务器的新线程这是正确的新线程(new runnable(){public void run(){runserver()});@user2589896如果答案正确,请接受我的问题:)我想问,假设我运行的是api级别17的avd,那么主机和avd的ip将不同或相同。