HttpURLConnection 服务端后台demo

本文详细介绍了使用HttpURLConnection在Android客户端与服务端进行交互的步骤,包括创建子线程、设置请求头部信息、建立TCP连接、发送正文及接收响应。此外,还提供了一个使用异步任务下载服务端文件并显示进度的Demo,服务端采用Node.js实现。相关代码和界面布局资源一并给出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpURLConnection_总结 加上 服务端的小demo
我将android与服务端建立连接 分为了以下几个步骤。
1、创建子线程
一般来说与服务端创建连接存在很多不确定性,所以最好新建子程序来完成这个动作。

2、使用URL封装访问的服务器地址。
URL url = new URL(“http://10.0.2.2:1234“)(android 模拟器访问本地127.0.0.1的代理地址)

3、创建用于接收和发送http的对象 HttpURLConnection
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
需要注意的是 这句话并没有开始于服务器连接 仅仅新建一个对象而已。

4、设置http请求头部信息
新建HttpURLConnection连接对象就是为了设置http请求头,这里我们可以使用很多方法类似
//设置是否向连接中写入数据(POST必须设置) getOutputStream()
conn.setDoOutput(true);
//是否可以从httpurlconnection中读入数据 默认是true getInputStream
conn.setDoInput(true);
//post请求不能使用缓存 GET请求(url)可以被缓存
conn.setUseCaches(false);
conn.setRequestProperty(“Content-Type”, “application/json”);
conn.setRequestMethod(“POST”);
conn.setConnectTimeout(5000);//连接时间为5秒。
/
5、建立连接 connect()
一般使用connect()进行显示的网络连接,值得强调的是 这里的连接并不涉及到http头部信息等等,connect()进行的连接是tcp连接 即是建立的三次握手连接。 并没有到应用层的接口部分。所以后台的接口并不会接收到数据(正文数据部分也并没有发送)。connect()方法会被许多其他方法隐式调用 例如 getOutputStream() /getResponseCode 等等。
/
6、发送正文部分和接收后台返回的数据
conn.getInputStream() ,调用这个函数会将http请求头 和 正文部分发送給服务端 ,并且得到服务端返回的数据,该函数返回的是正文部分,返回的网络码状态可以使用getResponseCode 获得。
至此结束。

结合HttpURLConnection 我做了一个小demo
使用 异步asynctask 下载服务端文件 并使用progressbar显示进度。

服务端代码(nodejs ):(这里并没有对登录名和密码进行验证)

var http = require('http');
var queryString = require('querystring');
var url = require('url');
var fs = require("fs");
function create(req,res) {
    var pathname = url.parse(req.url).pathname;
    if(pathname === "/upload"){
        //读取文件
        console.log("当前路径"+__dirname);
        fs.open(__dirname+'/test.txt',"r",(err,fd) => {
            if(err){
                if(err.code === "ENOENT"){
                    console.error('myfile does not exist');
               }else{
                    throw  err;
                }
                res.write("读取文件失败");
                res.end();
            }else{
                console.log("文件打开成功!");
                console.log("准备读取文件:");
                var buf = new Buffer(102400);
                fs.read(fd, buf, 0, buf.length, 0, (err, bytes) => {
                    if (err){
                        console.log(err);
                        res.write("读取文件失败");
                        res.end();
                    }
                    console.log(bytes + "  字节被读取");

                    // 仅输出读取的字节
                    if(bytes > 0){
                        console.log(buf.slice(0, bytes).toString());
                    }
                    res.writeHead(200, {
                        'Content-Length': bytes,
                        'Content-Type': 'text/plain' });
                    res.write(buf.toString());
                    res.end();
                });
            }
        });
    }else {
        var postData = '';
        req.on("data", function (chunk) {
            postData += chunk;
        });
        req.on('end', function () {
            postData = queryString.parse(postData);
            console.log(postData);
            res.writeHead(200, '{content-type:text/html;charset=utf-8}');

            if (!postData) {
                res.write("请求参数为null");
            } else {
                console.log("end");
                res.write("200");
            }
            res.end();
        })
    }
}
http.createServer(create).liste
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值