Я не получаю сообщения от сервера на моем клиенте - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь, чтобы мой сервер был создан на vb.net и отправлял сообщения моему клиенту на Android.У меня есть клиент и сервер, сделанные на vb.net, я могу отправлять и получать сообщения (текст) между ними без проблем.Но когда я пытаюсь заставить клиента работать так же на Android, я не могу получать сообщения клиенту (android), но если я смог получить его, чтобы отправить сообщение на сервер (vb.net) .. Они застряли сЭто, и я не понимаю, как продолжитьвозвращается, это всегда пусто.Сообщение, отправленное с сервера, не приходит

Извините, мой плохой английский

=========================================

РЕДАКТИРОВАТЬ: Это класс, который я использую для отправки сообщений от клиента (Android) на сервер (vb.net)

package com.example.app_test_client;

import android.os.AsyncTask;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class MessageSender extends AsyncTask<String, Void, Void> {

    Socket socket;
    PrintWriter pw;
    @Override
    protected Void doInBackground(String... voids) {
        String mensaje_enviar = voids[0];
        try {
            socket = new Socket("192.168.1.8",1371);
            pw = new PrintWriter(socket.getOutputStream());
            pw.write(mensaje_enviar);
            pw.flush();
            pw.close();
            socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }
}

КОД ОСНОВНОЙ ДЕЯТЕЛЬНОСТИ (КЛИЕНТ АНДРОИД)

package com.example.app_test_client;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity{
    EditText mensaje_enviar;
    TextView mensaje_recibido;


    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mensaje_enviar = (EditText)findViewById(R.id.txtTexto);
        mensaje_recibido = (TextView)findViewById(R.id.lblMensaje);
    }

    public void enviar(View v){
        MessageSender MensajeRemitente = new MessageSender();
        MensajeRemitente.execute(mensaje_enviar.getText().toString());
    }
}

Пустой "enviar" У меня это есть в кнопке "onClick".Все это для отправки сообщений с клиента (android) на сервер (vb.net) у меня работает.

Основываясь на этом классе «MessageSender», я сделал еще один равный для приема сообщений на клиенте (android)но это не сработало

1 Ответ

1 голос
/ 02 июня 2019

Если вы пытаетесь получить сообщение на устройстве Android, значит, вы пропускаете чтение самого сообщения с помощью String messageReceived = input.readLine();.Ваш код будет выглядеть так:

...
socket = new Socket("192.168.1.8",1371);
InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
input = new BufferedReader(streamReader);
String messageReceived = input.readLine();
...

Вам будет отправлено сообщение с сервера в messageReceived.

РЕДАКТИРОВАТЬ

Не вдаваясь в подробности, когдавы читаете данные, отправленные с сервера, вам нужно знать, когда отправленные данные «заканчиваются», и самый простой способ, которым вы пользуетесь в своей текущей реализации, - это напечатать «конец строки» (символ vbCrLf в VB), когда выотправить сообщение.Таким образом, в вашем Sub btnEnviar_Click вам нужно добавить vbCrLf следующим образом:

tcpservercliente.Client.Send(decode.GetBytes(txtMensajeEnviar.Text & vbCrLf))

Дополнительные примечания

  1. Когда данные читаются с сервера, сокет нуждаетсязнать, когда заканчиваются данные.Есть несколько способов добиться этого, но в вашем случае проще всего прочитать «конец строки» с String messageReceived = br.readLine();.Если сервер не отправляет какой-либо «конец строки» (как в текущей реализации), он будет ждать его и, следовательно, кажется, что программы работают.Это то, что происходит в вашем случае, когда вы замечаете, что после прочтения сообщения вы больше ничего не можете сделать - он просто ждет чего-то, что никогда не придет.
  2. Не обязательно проверять input.ready(), когдачтение с сервера.Это будет верно только тогда, когда данные были полностью отправлены с сервера, и есть большая вероятность того, что данные все еще отправляются, когда они вызываются.
  3. Если вы хотите лучше узнать, как работают сокеты TCP этот вопрос содержит хорошие примеры, которые вы можете попробовать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...