打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
android模拟web服务器
  之前用C#Java实现过简单的web服务器,这里用android模拟web服务器。
一开始理所当然地认为,把Java实现的代码拷过来就可以了,但事实则不然,浏览器无法接收到数据。
后来发现有几点不同,这里把代码粘上:
  1. int PORT = 8010;  
  2. ServerSocket server = null;  
  3. try {  
  4.     server = new ServerSocket(PORT);  
  5.     Log.i("WS", "服务器已启动,监听:" + server.getLocalPort());  
  6.     for (;;) {  
  7.         Socket client = server.accept(); // 接受客户机的连接请求  
  8.   
  9.         try {  
  10.             String destIP = client.getInetAddress().toString(); // 客户机IP地址  
  11.             int destport = client.getPort(); // 客户机端口号  
  12.             Log.i("WS", "connected to " + destIP + " on port " + destport + ".");  
  13.   
  14.             OutputStream out = client.getOutputStream();  
  15.             PrintStream outstream = new PrintStream(out);  
  16.   
  17.             DataInputStream instream = new DataInputStream(client.getInputStream());  
  18.             String inline = instream.readLine(); //读取Web浏览器提交的请求信息  
  19.             Log.i("WS", "request:" + inline);  
  20.   
  21.             outstream.println("HTTP/1.1 200 OK");//返回的状态,必须加入,否则浏览器显示无法加载  
  22.             outstream.println("Content-Type:text/html;");//返回的类型  
  23.             outstream.println();//响应头与主体内容之间必需空一行,否则浏览器无法读取内容  
  24.   
  25.             String body = "<html><head><title>android WebServer</title></head><body><h1>Hello world.<h1></body></html>";  
  26.             outstream.println(body);  
  27.             outstream.flush();  
  28.   
  29.             client.shutdownInput();//必需关闭流,否则浏览器将无法打开  
  30.             client.shutdownOutput();  
  31.             client.close();  
  32.         } catch (Exception err) {  
  33.             Log.i("WS", err.getMessage());  
  34.         }  
  35.     }  
  36. } catch (Exception err) {  
  37.     Log.i("WS", err.getMessage());  
  38. }  

把代码粘到android应用中的线程里就行,线程可以在activity中,也可以在service中。
测试路径:
  1. http://手机IP:8010/  

与JAVA Web服务器不同的是:
1:响应头中必须包含"HTTP/1.1 200 OK",否则浏览器显示无法加载
2:响应头与主体内容之间必需空一行,否则浏览器无法读取内容(这点很容易忽略)
3:在关闭流前必需shutdown流,否则浏览器将无法打开,测试时,由于服务器没有shutdown,客户端一直无法返回-1,也就一直阻塞中,当服务器close时,客户端直接报网络异常。
4:在响应内容大时(如图片),在shutdown前,需加上线程休眠时间,否则浏览器无法完全接收,这点没找到原因。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
手把手教你uiautomator_android自动化测试第一个示例
Android上传文件至服务器
HttpClient中使用代理连接
beego websocket 向页面推送数据(一)
JAXB(Java Architecture for XML Binding)新手學習筆記
atx-agent minicap、minitouch源码分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服