Я разрабатываю программу сокетов TCP / IP для соединения моего телефона Android с моим серверным ПК.
Я создал простую эхо-программу.
После подключения к серверу я могу отправить свойКоманда регистрации без каких-либо проблем / задержек / зависаний.
После того, как я получаю с помощью буферизованного считывателя, я передаю данные в свою функцию в основном действии, которое интерны отправляет эти данные на сервер, записывая в OutputStream.Пока мой клиент отправляет эти данные, мой сервер зависает (занято-ожидание -> мое предположение), но через 5 секунд он возобновляет нормальную работу и успешно получает данные.Даже мой рабочий поток (AsyncTask) зависает, что очевидно, поскольку они представляют собой заметную задержку отображения сообщения в Logcat по сравнению с другими сообщениями.
Android Studio 3.3.1
Target API Level:> =26 (8.0 Oreo)
Тестовый сервер TCP - Hercules
@SuppressLint("StaticFieldLeak")
public void connect(){
new AsyncTask<Void, Void, Boolean>(){
@Override
protected Boolean doInBackground(Void... voids) {
try {
socket = new Socket(ip, portNo);
out = socket.getOutputStream();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socketAlive.set(true);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
if(result){
sendData("RegisterDevice:<ip>:<mac>");
readerThread();
}
else{
socketAlive.set(false);
reconnect();
}
}
}.execute();
}
@SuppressLint("StaticFieldLeak")
public void sendData(final String data){
if(this.socket == null || this.socket.isClosed() )
{
//Unable to send data as output is closed returning
return;
}
new AsyncTask<String, Void, Boolean>(){
@Override
protected Boolean doInBackground(String... writeString) {
try {
out.write (writeString [0] .getBytes ());// - >> Casuing Server Socket для зависания
//out.flush();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
if(!result) {
reconnect();
sendData(data);
}
}
}.execute(data);
}
@SuppressLint("StaticFieldLeak")
public void readerThread(){
if(this.socket.isClosed())
{
//Unable to recieve data as output is closed returning
return;
}
new AsyncTask<Void, Void, Boolean>(){
@Override
protected Boolean doInBackground(Void... voids) {
try {
Arrays.fill(readBuffer, '\0');
//in.read(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE);//8192
in.read(readBuffer);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
if(result) {
//dataRead = String.copyValueOf(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE);
String str = String.copyValueOf(readBuffer);
str.trim();
Log.i("Test", "Test");
mainActivity.processEthernetData(String.copyValueOf(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE));
Log.i("ReadInfo", String.copyValueOf(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE));
readerThread();
}
else {
reconnect();
}
}
}.execute();
}
public void processEthernetData(final String protcol){
eth.sendData(protcol);
}