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编辑过]