Итак, я покопался в сети (в основном это так, Google), чтобы найти хорошие примеры программирования сокетов под Android.Я сделал много Android разработчика (только не с сокетами).Я не понимаю, почему мой readLine () ВСЕГДА ВОЗВРАЩАЕТСЯ НУЛЬ.И, пожалуйста, не обращайте внимания на отвратительный код, это быстрый и грязный прототип для друга.Моя общая цель - установить соединение с сервером, отправить данные заголовка (GET / MOUNTPOINT Content-Type: ... и т.д ...) и получить ответ, основанный на ответе, который мне нужен, чтобы продолжить поток или закрытьЭто.Вот мой код последней попытки:
String userPass = new String(Base64.encodeToString("user:password".getBytes(), Base64.DEFAULT));
boolean connected = false;
String requestmsg = "GET /MOUNTPOINT" + " HTTP/1.0\r\n";
requestmsg += "User-Agent: MYCUSTOMAGENT\r\n";
requestmsg += "Accept: */*\r\n";
requestmsg += "Connection: close\r\n";
requestmsg += "Authorization: Basic " + userPass;
requestmsg += "\r\n";
DataOutputStream dos = null;
DataInputStream dis = null;
try {
Log.d("ClientActivity", "Connecting...");
Socket socket = new Socket("1.2.3.4", 9000);
connected = true;
String data = "";
while (connected) {
try {
Log.d("ClientActivity", "C: Sending command.");
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
dos.write(requestmsg.getBytes());
Log.i("ClientActivity", "RequestMsg Sent");
StringBuilder sb = new StringBuilder();
while ((data = dis.readLine()) != null)
{
sb.append(data);
}
Log.i("ClientActivity", "C: Sent.");
} catch (Exception e) {
Log.e("ClientActivity", "S: Error", e);
}
}
socket.close();
Log.d("ClientActivity", "C: Closed.");
} catch (Exception e) {
Log.e("ClientActivity", "C: Error", e);
connected = false;
}
Я пытался использовать HttpClient API, но он вставляет сообщение «GET /» в заголовок, и мне нужно указать «GET / MOUNTPOINT».Плюс я не знаю, позволяет ли HttpClient потоковую передачу.Я также пробовал URLConnection, но он также вставляет GET или POST по умолчанию.Спасибо за любую помощь!
Также я попробовал следующее:
SocketAddress sockaddr = new InetSocketAddress("1.2.3.4", 9000);
nsocket = new Socket();
nsocket.connect(sockaddr, 10 * 1000); // 10 second connection timeout
if (nsocket.isConnected()) {
//nsocket.setSoTimeout(20 * 1000); // 20 second timeout once data is flowing
nis = nsocket.getInputStream();
nos = nsocket.getOutputStream();
Log.i(NTAG, "Socket created, streams assigned");
// Build request message
requestmsg = "GET /MOUNTPOINT" + " HTTP/1.0\r\n";
requestmsg += "User-Agent: MYANDROIDAGENT\r\n";
requestmsg += "Accept: */*\r\n";
requestmsg += "Connection: close\r\n";
requestmsg += "Authorization: Basic " + userPass;
requestmsg += "\r\n";
nos.write(requestmsg.getBytes());
nos.write(genGPGGA().getBytes());
Log.i(NTAG, "Waiting for inital data...");
byte[] buffer = new byte[4096];
int read = nis.read(buffer); // This is blocking
//Log.i("ReadNTRIP", tempdata.toString());
String test = "TESTING";
while (read != -1) {
tempdata = new byte[read];
System.arraycopy(buffer, 0, tempdata, 0, read);
read = nis.read(buffer, 0, 4096); // This is blocking
}
}
} catch (SocketTimeoutException ex) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
nis.close();
nos.close();
nsocket.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Log.i(NTAG, "Finished");
}
Но чтение всегда возвращает -1.Я готов вырвать свои волосы.
РЕДАКТИРОВАТЬ: Я добавил награду (стоит очень мало) - у меня не так много представителей, чтобы дать, но эта проблема стала для меня ограничением показа.Чтобы получить награду, напишите простую андроид-программу для подключения к thor.lsu.edu, порт 9000, отправьте простую команду GET / HTTP / 1.0 и фактически верните данные (используя сокеты - не может быть с URLConnection или HttpClient).Разместите программу и снимок экрана с результатами.Я пробовал так много разных способов, я не знаю, что еще делать (используя InputStreams, BufferedInputStreams, InputStreamReaders и т. Д ...).Я даже использовал пример программы для Android (ЭТО РАБОТАЕТ), но я до сих пор не вернул данные в своей реализации.Я не знаю, проблема с синхронизацией или что.
Спасибо
Редактировать: я заметил, что даже не могу просмотреть http://thor.lsu.edu:9000 в браузере Android.Это дает проблему со связью данных.Есть идеи, почему этот порт может быть заблокирован?