[原创]j2me大字节文件上传!请教!
<P>1、手机客户端联网代码(j2me,使用http连接):<br>public static byte[] netCommunicate(byte[] command) {//这个是手机和服务器通行的方法<br> byte[] resp = null;<br> String url="";<br> //创建HttpConnection,并且向服务器发送一个字节数组command<br> try { <br> hc = (HttpConnection)Connector.open("<a href='http://"+url/' target="_blank" >http://"+url</A>, Connector.READ_WRITE);<br> hc.setRequestMethod(HttpConnection.POST);<br> hc.setRequestProperty("Content-Language", "zh-cn");<br> hc.setRequestProperty("Accept","*/*");<br> hc.setRequestProperty("Content-Type", "application/OCTET-STREAM");//application/OCTET-STREAM<br> hc.setRequestProperty("Connection", "keep-alive");<br> hc.setRequestProperty("Cache-Control", "no-cache");<br> <br> hc.setRequestProperty("Content-Length", command.length + "");<br> <br> dos.write(command);<br> dos.flush();(1)<br> dos.close();<br> <br> //接受服务器返回<br> int code = hc.getResponseCode();<br> Debug.print("code:"+code);<br> if (code == HttpConnection.HTTP_OK ) {<br> InputStream dis = hc.openDataInputStream();<br> int dataLength = (int) hc.getLength();<br> Debug.print("dataLength="+dataLength);<br> if (dataLength == -1) {<br> ByteArrayOutputStream bStrm = new ByteArrayOutputStream();<br> int ch;<br> while (-1 != (ch = dis.read())) {<br> bStrm.write(ch);<br> }<br> resp = bStrm.toByteArray();<br> bStrm.close();<br> } else {<br> resp = new byte[dataLength];<br> new DataInputStream(dis).readFully(resp); <br> }</P><P> }<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> break;<br> }<br> return resp;<br> }<br> <br>2、服务器端代码(tomcat做服务器,典型的servlet程序)<br> DataInputStream dis = new DataInputStream(request.getInputStream());<br> int size = 0;<br> size = request.getContentLength();<br> byte[] buffer = new byte[size]; // 用于缓存每次读取的数据</P>
<P> while (true) {<br> int i = dis.read(buffer, 0, size);<br> if (i == -1)<br> break;<br> }<br> <br> String content = new String(buffer);<br> System.out.println(content);<br> <br>疑惑:<br>1、服务器端在接收手机传过来的字节流的时候,当传来的头里面含有transfer-encoding chunked属性,服务器将无法得到字节流。有些朋友建议将上<br><br> 面(1)处去掉即可。没错,这样是可行的,但是当字节流的长度大于2016个字节的时候客户端将自动设置transfer-encoding chunked属性,这样服<br><br> 务器还是无法得到。因为我是用来上传file的,所以肯定会超过2016Byte,所以这个问题还是没有解决。我查了一下transfer-encoding chunked属<br><br> 性,他是HTTP/1.1用来大字节流分块传输的,servlet的这种处理方法确实无法得到。如果手工将流切成小于2016Byte的块来传输的话,也是可行的,<br><br> 但是增加网络连接的次数,从效率角度来讲是不可行的。<br><br> 我曾经用C和j2se模仿上传大文件,在http header属性中不会自动加上transfer-encoding chunked,所以这个应该是j2me客户端的问题。换句话说<br><br>j2me+tomcat/resin(等)是无法实现将大于2016Byte的文件上传的,呵呵,我希望我这个说法是错误的,所以希望大家给我提点意见。</P>
<P>2、我用java.nio、线程池写了一个性能不错的基于socket的服务器来做手机的服务器,但是有一个奇怪的问题,当我手机客户端(j2me)和服务器在我<br><br>本机调试的时候,一切OK,也能够得到chunked传输编码的大字节流,但是当我把服务器程序传到另外一台服务器的时候,却什么也接受不到,我也用c<br><br>和j2se连到这个服务器测试了,都是好的,唯独j2me的手机客户端和这个服务器程序通信的时候服务器无法得到。唉,我现在真是恨透了j2me。<br><br>希望大家给我提点意见,谢谢!<br> </P>
[align=right][color=#000066][此贴子已经被作者于2007-9-23 16:59:24编辑过][/color][/align]
<UL type=1 start="1">
<LI><B>严肃性</B>:<br>不求文章要写的多么经典,但一定要是自己的原创。<STRONG><FONT color=#ff0000>求助、转载、广告等其他类型帖子冒充原创者,视用户等级禁言一段时间或封ID。</FONT></STRONG> <br><br>
<LI><B>本站首发</B>:<br>原创帖必须是本站首发,在其他站点发布以后在本论坛发布的,我们拒绝承认为原创,一律视为转载。 <br><br>
<LI><B>鼓励原创</B>:<br>原创帖在发布以后,管理员通过网上划词搜索辨别是否为原创,如确定为原创,只要文章不是过于简陋就会推荐为本版精华,优秀的同时收录至本站技术教程频道。</LI></UL>
[align=right][color=#000066][此贴子已经被作者于2007-9-29 9:50:49编辑过][/color][/align]
LS想必是老静的马甲[em05]
页:
[1]
