| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2373 人关注过本帖
标题:[原创]j2me大字节文件上传!请教!
只看楼主 加入收藏
jerry0003312
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-9-23
收藏
 问题点数:0 回复次数:2 
[原创]j2me大字节文件上传!请教!

1、手机客户端联网代码(j2me,使用http连接):
public static byte[] netCommunicate(byte[] command) {//这个是手机和服务器通行的方法
byte[] resp = null;
String url="";
//创建HttpConnection,并且向服务器发送一个字节数组command
try {
hc = (HttpConnection)Connector.open("http://"+url, Connector.READ_WRITE);
hc.setRequestMethod(HttpConnection.POST);
hc.setRequestProperty("Content-Language", "zh-cn");
hc.setRequestProperty("Accept","*/*");
hc.setRequestProperty("Content-Type", "application/OCTET-STREAM");//application/OCTET-STREAM
hc.setRequestProperty("Connection", "keep-alive");
hc.setRequestProperty("Cache-Control", "no-cache");

hc.setRequestProperty("Content-Length", command.length + "");

dos.write(command);
dos.flush();(1)
dos.close();

//接受服务器返回
int code = hc.getResponseCode();
Debug.print("code:"+code);
if (code == HttpConnection.HTTP_OK ) {
InputStream dis = hc.openDataInputStream();
int dataLength = (int) hc.getLength();
Debug.print("dataLength="+dataLength);
if (dataLength == -1) {
ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
int ch;
while (-1 != (ch = dis.read())) {
bStrm.write(ch);
}
resp = bStrm.toByteArray();
bStrm.close();
} else {
resp = new byte[dataLength];
new DataInputStream(dis).readFully(resp);
}

}
} catch (IOException e) {
e.printStackTrace();
}
break;
}
return resp;
}

2、服务器端代码(tomcat做服务器,典型的servlet程序)
DataInputStream dis = new DataInputStream(request.getInputStream());
int size = 0;
size = request.getContentLength();
byte[] buffer = new byte[size]; // 用于缓存每次读取的数据

while (true) {
int i = dis.read(buffer, 0, size);
if (i == -1)
break;
}

String content = new String(buffer);
System.out.println(content);

疑惑:
1、服务器端在接收手机传过来的字节流的时候,当传来的头里面含有transfer-encoding chunked属性,服务器将无法得到字节流。有些朋友建议将上

面(1)处去掉即可。没错,这样是可行的,但是当字节流的长度大于2016个字节的时候客户端将自动设置transfer-encoding chunked属性,这样服

务器还是无法得到。因为我是用来上传file的,所以肯定会超过2016Byte,所以这个问题还是没有解决。我查了一下transfer-encoding chunked属

性,他是HTTP/1.1用来大字节流分块传输的,servlet的这种处理方法确实无法得到。如果手工将流切成小于2016Byte的块来传输的话,也是可行的,

但是增加网络连接的次数,从效率角度来讲是不可行的。

我曾经用C和j2se模仿上传大文件,在http header属性中不会自动加上transfer-encoding chunked,所以这个应该是j2me客户端的问题。换句话说

j2me+tomcat/resin(等)是无法实现将大于2016Byte的文件上传的,呵呵,我希望我这个说法是错误的,所以希望大家给我提点意见。

2、我用java.nio、线程池写了一个性能不错的基于socket的服务器来做手机的服务器,但是有一个奇怪的问题,当我手机客户端(j2me)和服务器在我

本机调试的时候,一切OK,也能够得到chunked传输编码的大字节流,但是当我把服务器程序传到另外一台服务器的时候,却什么也接受不到,我也用c

和j2se连到这个服务器测试了,都是好的,唯独j2me的手机客户端和这个服务器程序通信的时候服务器无法得到。唉,我现在真是恨透了j2me。

希望大家给我提点意见,谢谢!

[此贴子已经被作者于2007-9-23 16:59:24编辑过]

搜索更多相关主题的帖子: 字节 手机 服务器 Connector 
2007-09-23 16:55
编辑01
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2007-9-28
收藏
得分:0 
编程中国原创计划及声明
  • 严肃性
    不求文章要写的多么经典,但一定要是自己的原创。求助、转载、广告等其他类型帖子冒充原创者,视用户等级禁言一段时间或封ID。

  • 本站首发
    原创帖必须是本站首发,在其他站点发布以后在本论坛发布的,我们拒绝承认为原创,一律视为转载。

  • 鼓励原创
    原创帖在发布以后,管理员通过网上划词搜索辨别是否为原创,如确定为原创,只要文章不是过于简陋就会推荐为本版精华,优秀的同时收录至本站技术教程频道。

[此贴子已经被作者于2007-9-29 9:50:49编辑过]

2007-09-28 16:15
缘吇弹
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:43
帖 子:3038
专家分:27
注 册:2007-7-2
收藏
得分:0 
LS想必是老静的马甲

Repeat  Life=Study;Until (death);
2007-10-09 17:23
快速回复:[原创]j2me大字节文件上传!请教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016883 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved