之前用
C#和
Java实现过简单的web服务器,这里用android模拟web服务器。
一开始理所当然地认为,把Java实现的代码拷过来就可以了,但事实则不然,浏览器无法接收到数据。
后来发现有几点不同,这里把代码粘上:
- int PORT = 8010;
- ServerSocket server = null;
- try {
- server = new ServerSocket(PORT);
- Log.i("WS", "服务器已启动,监听:" + server.getLocalPort());
- for (;;) {
- Socket client = server.accept(); // 接受客户机的连接请求
-
- try {
- String destIP = client.getInetAddress().toString(); // 客户机IP地址
- int destport = client.getPort(); // 客户机端口号
- Log.i("WS", "connected to " + destIP + " on port " + destport + ".");
-
- OutputStream out = client.getOutputStream();
- PrintStream outstream = new PrintStream(out);
-
- DataInputStream instream = new DataInputStream(client.getInputStream());
- String inline = instream.readLine(); //读取Web浏览器提交的请求信息
- Log.i("WS", "request:" + inline);
-
- outstream.println("HTTP/1.1 200 OK");//返回的状态,必须加入,否则浏览器显示无法加载
- outstream.println("Content-Type:text/html;");//返回的类型
- outstream.println();//响应头与主体内容之间必需空一行,否则浏览器无法读取内容
-
- String body = "<html><head><title>android WebServer</title></head><body><h1>Hello world.<h1></body></html>";
- outstream.println(body);
- outstream.flush();
-
- client.shutdownInput();//必需关闭流,否则浏览器将无法打开
- client.shutdownOutput();
- client.close();
- } catch (Exception err) {
- Log.i("WS", err.getMessage());
- }
- }
- } catch (Exception err) {
- Log.i("WS", err.getMessage());
- }
把代码粘到android应用中的线程里就行,线程可以在activity中,也可以在service中。
测试路径:
与JAVA Web服务器不同的是:
1:响应头中必须包含"HTTP/1.1 200 OK",否则浏览器显示无法加载
2:响应头与主体内容之间必需
空一行,否则浏览器无法读取内容(这点很容易忽略)
3:在关闭流前必需shutdown流,否则浏览器将无法打开,测试时,由于服务器没有shutdown,客户端一直无法返回-1,也就一直阻塞中,当服务器close时,客户端直接报网络异常。
4:在响应内容大时(如图片),在shutdown前,需加上线程休眠时间,否则浏览器无法完全接收,这点没找到原因。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。