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