В настоящее время я разрабатываю связь сокетов между Android и сервером, которая представляет собой простую программу java, запущенную в терминале. Дела идут хорошо, за исключением есть предупреждение появляется всегда в LogCat, когда я закрыть приложение:Внедрение передачи и приема сокета в Android
IInputConnectionWrapper showStatusIcon on inactive InputConnection
Я ищу в Интернете, чтобы выяснить проблему, я нашел пост в StackOverflow Similar Problem. Разница в том, что я могу хорошо отправлять и получать информацию в своей программе. Ответ на эту аналогичную проблему заключается в том, что соединение не закрыто. Означает ли это, что я не звонил socket.close();
после операции? Это приводит к более сложной проблеме реализации.
Прежде всего, я хочу, чтобы один, статический сокет прослушивал и отправлял на сервер. Поскольку я не могу закрывать сокет каждый раз, когда я что-то передаю, поэтому я просто закрываю его после того, как слушатель завершает работу.
Подробный коды размещены ниже
Я инициализировать соединение в конструкторе, как:
client = new Socket(mServerName, mport);
out = new DataOutputStream(client.getOutputStream());
inFromServer = new InputStreamReader(client.getInputStream());
reader = new BufferedReader(inFromServer);
И пусть они будут там в течение всего процесса.
Я писал передачи от андроида к серверу в функцию следующим образом:
public void sendRequest(int type, int what1, int what2, Object data)
{
try{
if(client.isConnected())
{
out.writeUTF(encoded(type,what1,what2,data) + "\n");
}
}catch(IOException e){
Log.e(TAG, "IOException at SendRequest");
e.printStackTrace();
}
}
Слушатель в новом потоке:
try {
String line = null;
while ((line = reader.readLine()) != null)
{
ReceiveHandler(line);
}
} catch (IOException e) {
Log.e(TAG, "IOException at StartListen");
e.printStackTrace();
}finally{
try {
// The Only Place that I close the Socket
inFromServer.close();
out.close();
reader.close();
client.close();
} catch (IOException e) {
Log.e(TAG, "Close Socket with IOException " + e.toString());
e.printStackTrace();
}
}
Мой вопрос:
Есть ли что-то неправильно с моей реализацией или есть ли лучшие способы сделать это?
Большое вам спасибо за помощь!
Большое спасибо за вашу помощь! Но в вашей программе вы отправляете информацию, слушая консоль. Я хочу, чтобы я мог вызывать функцию отправки сообщения из других классов. У вас есть идеи об этом? Все же разрешите поблагодарить вас! – Fei