jerry0003312 发表于 2007-9-23 16:55

[原创]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]

编辑01 发表于 2007-9-28 16:15

<DIV align=center><STRONG>编程中国原创计划及声明</STRONG></DIV>
<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]

缘吇弹 发表于 2007-10-9 17:23

LS想必是老静的马甲[em05]

页: [1]

编程论坛