Сегодня я расскажу о проблеме реализации J2ME в Nokia S40 3rd edition (Nokia 6270 и.т.д.) скачивать файлы размером более 300 кб.
Классическая реализация скачивания предусматривает следующий код:
HttpConnection hc=(HttpConnection)Connector.open("
http://www.somehost.com/file.mp4");
hc.setRequestMethod(HttpConnection.GET);
hc.setRequestProperty("Connection", "close");
hc.setRequestProperty("User-agent", System.getProperty("microedition.platfor
m"));
int ResponseCode=hc.getResponseCode();
String ResponseMessage=hc.getResponseMessage();
Downloads[i].ByteSize=Long.parseLong(hc.g
etHeaderField("Content-Length"))+StartFr
om;
Соответственно, в идеале, после этого момента можно открывать поток и производить чтение,
однако добрая нокия выдает ошибку: Error in http operation. После поисков выяснилось, что такой ответ будет на любой файл свыше 300 кб.
Чтобы обойти ограничение сделать нужно вот что. Нужно использовать сокеты и эмулировать протокол HTTP.
Делается это так:
SocketConnection hc=(SocketConnection)Connector.open("soc
ket://"+ServerName+":80");
OutputStream oss=hc.openOutputStream();
oss.write(("GET
http://somehost.com/file.mp4 HTTP/1.0\r\n").getBytes());
oss.write(("Host: somehost.com\r\n").getBytes());
oss.write(("Accept: */*\r\n").getBytes());
oss.write(("User-Agent: "+System.getProperty("microedition.platf
orm")+"\r\n\r\n").getBytes());
oss.flush();
oss.close();
И после чего, принять входные данные
InputStream is = hc.openInputStream();
int ch,last_ch=0;
OutputStream os = fc.openOutputStream();
Однако, помимо самих данных будет еще и ответ сервера.
В данном случае, я его просто пропускаю.
while ((ch = is.read()) != -1)
{
if((last_ch=='\n')&&(ch=='\n'))
break;
if((last_ch=='\n')&&(ch=='\r'))
break;
if(ch!=last_ch)
last_ch=ch;
}
Все, казалось бы можно читать данные. Но не тут то было. Выясняется, что неподписанным приложениям запрещен доступ по портам 80,8080,443.
В своем приложении, я переназначил на сервере порт на 9898, при отсутствии такой возможности предлагаю читателю поискать прокси сервер работаюший через отличный от перечисленных порт, и осуществлять коммуникации через него.
Удачной разработки!