Android — TCP Java-клиент BufferedReader.readline () не возвращает буфер из C ++ TCP-сервера

У меня проблема с обменом данными между примером C ++ TCP-сервера, который я нашел в сети, и Java-приложением для Android, которое я только что скомбинировал, чтобы увидеть, как они могут общаться друг с другом.

Для клиента Android я изначально пробовал класс AsyncTask, но столкнулся с проблемой закрытия сокета Android. Это тогда нарушило бы цикл моего сервера C ++ и привело бы к успешному завершению программы сервера. Вместо этого я использовал поток, который оставлял сокет открытым, чтобы отправлять столько данных назад и вперед, пока клиент не завершит работу.

В приведенном ниже коде клиента Android, если я избавлюсь от всего кода, связанного с bufferedReader, то смогу отправлять на сервер столько строковых данных, сколько захочу, пока сокет остается живым. Если я добавлю его, как показано ниже, и попытаюсь использовать функцию readline (), то эта функция завершится ошибкой и выведет фатальное исключение.

Что касается моего вопроса, по какой причине я не смогу использовать readline () для получения данных с сервера C ++? Есть ли что-то явно очевидное, что я должен сделать?

Java-клиент Android

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
e1 = findViewById(R.id.editText);

sockThread = new Thread(sockApp = new SocketApp(ip, port));
sockThread.start();
}

public void send_text(View v) {
message = e1.getText().toString();
try {
printWriter = new PrintWriter(sockApp.s.getOutputStream());
bufferedReader = new BufferedReader(new
InputStreamReader(sockApp.s.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
printWriter.write(message);
printWriter.flush();
String line;
try {
//bufferedReader.readline() and the stacktrace is printed
while((line = bufferedReader.readLine())!= null && line.length() > 0) {
System.out.println(line);
}
} catch(IOException e) {
e.printStackTrace();
}
}
}

Все, что делает это приложение для Android, это отправляет строковые данные на мой компьютер с сервером C ++ и распечатывает их. Класс SocketApp просто создает сокет с входами ip и port.

C ++ Server Прием / Отправка на Android Клиент

char buf[4096]
while (true) {
ZeroMemory(buf, 4096);
//wait for client to send data
//After java exception is thrown, recv prints its error statement below
int bytesReceived = recv(clientsocket, buf, 4096, 0);
if (bytesReceived == SOCKET_ERROR) {
cerr << "Error in recv " << endl;
break;
}

//cout << bytesReceived << endl;

if (bytesReceived == 0) {
cout << "client disconnected" << endl;
break;
}

cout << string(buf, 0, bytesReceived) << endl;
// echo message back to client
send(clientsocket, buf, bytesReceived + 1, 0);
}

Блок while кода сокета C ++ для получения строковых данных и их последующей отправки

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …