发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA
1 2 下一页 Go 2

连接Http Server的代码

2003-01-15 09:31
赞助商链接

连接Http Server的代码很多,最近我看到一份资料中连接HTTP代码不错,
只是对于他使用ByteArrayOutputStream来in.read()没有理解,哪位能够指点?

String url = "http://www.developnet.co.uk/SerializeServlet";
HttpConnection conn = (HttpConnection) Connector.open(url);

conn.setRequestMethod(HttpConnection.POST);
conn.setRequestProperty(
"Content-Type", "application/octet-stream ");
conn.setRequestProperty(
"User-Agent","Profile/MIDP-1.0 Configuration/CLDC-1.0");
conn.setRequestProperty(
"Content-Language", "en-US");
conn.setRequestProperty(
"Accept", "application/octet-stream");
conn.setRequestProperty(
"Connection", "close"); // optional


byte[] data =.....;
//发送请求request
conn.setRequestProperty(
"Content-Length", Integer.toString(data.length));
OutputStream os = conn.openOutputStream();
os.write(data);
os.close();

//以下是接受response
int rc = conn.getResponseCode();
if (rc == HttpConnection.HTTP_OK)
{
int len = (int)conn.getLength();
InputStream in = conn.openInputStream();
if (len != -1)
{
int total = 0;
data = new byte[len];
while (total < len)
{
total += in.read(data, total, len - total);
}
}
else
{
ByteArrayOutputStream tmp = new ByteArrayOutputStream();
int ch;
while ((ch = in.read()) != -1)
{
tmp.write(ch);
}
data = tmp.toByteArray();
}

//将data处理
.............

}

2003-01-17 12:28

如果conn.getLength()返回-1,表示这个http response的content-length不确定(即response头里没有提供content-length这一属性或属性值不是valid的),则客户端必须一直接收数据,直到服务器主动关闭socket。这是HTTP协议中的东东。

所以上面的程序中用了一个字节缓冲,并且in.read()到-1值,表示服务端已经关闭连接了。

2003-01-17 17:32

关键是 tmp.write(ch);
将ch写入数组,ch是读字节的计数,应该是将读的内容写入数组啊

2003-01-17 20:39

JavaDoc 里有说明
read 和 read(...) 返回的东西是不同的

2003-01-17 22:15

同意楼上。
最近一直在弄下载的操作,其中关键代码就用了
while ((ch = in.read()) != -1)
将读的内容写到ch里面,如果读到末尾,也就是读的内容为null,就返回-1.

2Go 1 2 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系反馈 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com