文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» Java » j2me上传大字节文件       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: [求助] j2me上传大字节文件  ( 查看:594  回复:0 )   
 
jerry00033127
新新人类  点击可查看详细



帖子 1
精华 0
无忧币 15
积分 5
阅读权限 20
注册日期 2007-9-23
最后登录 2007-9-23 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-9-23 17:29   标题: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.

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

[ 本帖最后由 jerry00033127 于 2007-9-23 17:31 编辑 ]



网络虽虚拟,技术无边界,来看看大家“真面目”!
2007-9-23 17:291楼
[ 顶部 ]
     
论坛跳转:  

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号