Ну, я знаком с программированием сокетов в среде c, iOS. Но сейчас пытаюсь соединить мой android и мой удаленный сервер через сокеты ... В качестве запуска я написал простую серверную программу на C и запустил ее на мой рабочий стол, который терпеливо ждет запроса на соединение, принимает соединение, затем ждет какую-то строку запроса, и при получении строки запроса возвращает некоторую строку ответа, затем снова ждет следующий запрос и продолжает ... Ну, вы поняли идею ...
Пока
- Я установил соединение с моим android и сервером
- отправленные и полученные данные
А это мой код клиента ..
public class SocketMaster {
private Socket clientSocket = null;
BufferedReader socketReadStream = null;
public boolean connectToHost(String ip, int port){
try {
InetAddress serverAddr = InetAddress.getByName(ip);
try {
clientSocket = new Socket(serverAddr, port);
socketReadStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String line = null;
String stringToSend = "This is from client ...Are you there???";
//Write to server..stringToSend is the request string..
this.writeToServer(stringToSend);
//Now read the response..
while((line = socketReadStream.readLine()) != null){
Log.d("Message", line);
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
} catch (UnknownHostException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean writeToServer(String stringToSend){
DataOutputStream dos = null;
try {
dos = new DataOutputStream(clientSocket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
return false;
}
try {
dos.write(stringToSend.getBytes());
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
}
Я создаю объект SocketMaster из другого действия и вызывает connectToHost, передавая ip и порт сервера .. Все работает нормально, и я могу подключаться, отправлять и получать данные ..
Теперь мой вопрос касается этих строк
//Now read the response..
while((line = socketReadStream.readLine()) != null){
Log.d("Message", line);
}
Из того, что я понимаю, поток, который выполняет этот код
- блокируется, пока нет данных для чтения
- если данные доступны, прочитайте их, потому что цикл снова блокируется до
приходит следующий кусок данных
Просто я не могу запустить этот код в главном потоке, так как он заблокирует мои действия пользовательского интерфейса. Я могу подумать о запуске этого в фоновом потоке, который является одним из вариантов ...
Но в идеале я хочу ...
A callback (я думаю, слушатель в терминах Android, любой, кто знаком с iOS CFSocket и callback ), метод, который вызывается при наличии данных доступны для чтения, так что я могу просто прочитать данные и затем вернуться ..
Есть ли такой механизм в android / java ... Если нет (:-(), может кто-нибудь связать меня с примером, где обработка сокетов выполняется в фоновом режиме ...
EDIT:
Я не спрашивал о создании механизма обратного вызова сам ... Я просто спрашивал, есть ли присутствующий слушатель, который уведомляет вас, когда есть данные для чтения, когда соединение было разорвано ... Таким образом, я могу устранить вышеупомянутое данное в то время как цикл ... Если обратного вызова нет, я готов переместить этот сокет в другой поток, который зацикливается и читает данные (что я уже сделал) ...
**
РЕДАКТИРОВАТЬ Щедрость снова ..
**
Ну, я 2 слабых старых android / java разработчика с хорошим 3,5-летним опытом разработки c / c ++ / target c за этим ... Так что я видел низкоуровневые нативные сокеты c (которые блокируют (настраиваются) при использовании read () и recv ()) и Apple CFSocket (который сам по себе является C-сокетом, но предоставляет обертку для обеспечения механизма обратного вызова) .. Я не спрашиваю о кодировании механизма обратного вызова самостоятельно здесь (что я от всей души) готов сделать, если нет готового альтернативного подарка, но зачем снова изобретать колесо?) ... Я начинаю понимать java как очень продвинутую и высокоуровневую платформу .. Я подумал, что должна быть какая-то библиотека-оболочка более высокого уровня, скрывающаяся вокруг. . Так что я думаю об увеличении аудитории в этой теме, начав вознаграждение ..