TCP-соединение между приложением Android и терминалом Visual Studio

#android #visual-studio #tcp #communication

#Android #visual-studio #tcp #Информационные материалы

Вопрос:

Я пытаюсь реализовать tcp-связь с моим приложением для Android, являющимся клиентской стороной. Сервер уже реализован в Visual Studio на c с использованием библиотеки WS2tcpip.h . Затем клиентская сторона должна отправить строку для получения сервером, а затем снова вернуть. Я уже протестировал сервер с помощью клиента, который также был реализован в Visual Studio, и я смог отправить сообщение, которое сервер получил, а затем вернул. Смотрите изображение ниже

Связь между клиентом и сервером TCP

ОБНОВЛЕННЫЙ КОД

ControlFragment.java

 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_control, container, false); //This inflates the control_fragment layout to this java class.

    startBtn = view.findViewById(R.id.startBtn);
    socketString = view.findViewById(R.id.socketString);

    startBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            BackgroundTask b = new BackgroundTask();
            b.execute("Hello");
        }
    });

    return view;
}

class BackgroundTask extends AsyncTask<String, Void, Void> {
    Socket s;
    DataOutputStream dos;
    String ip, message;


    @Override
    protected Void doInBackground(String... params) {
        ip = "192.168.87.103";
        message = params[0];
        try {
            s = new Socket(ip, 9700);
            dos = new DataOutputStream(s.getOutputStream());
            dos.writeUTF(message);
            dos.close();
            s.close();

        } catch (UnknownHostException e) {
            Log.d(TAG, "doInBackground: UnknownHostException"   e.toString());
        } catch (IOException e) {
            Log.d(TAG, "doInBackground: IOexception"   e.toString());
        } catch (Exception e) {
            Log.d(TAG, "doInBackground: Exception"   e.toString());
        }

        return null;
    }
}
  

Теперь я вижу, что клиент подключен к серверу после того, как я нажал кнопку, но он немедленно отключается, как показано на рисунке ниже.

TCP-соединение

Я думаю, что ошибка в приведенном ниже коде. Кажется, сервер ничего не получает.

 int bytesReceived = recv(clientSocket, buf, 4096, 0); //Returns the number of bytes received
    if (bytesReceived == SOCKET_ERROR)
    {
        cerr << "Error in recv(). Qutting" << 'n' << endl;
        closesocket(clientSocket);
        WSACleanup();
    }
    if (bytesReceived == 0)
    {
        cout << "Client disconnected " << 'n' << endl;
        break;
    }
  

Я уже включил разрешение доступа в Интернет в манифест. Надеюсь, это имеет смысл, и заранее благодарю вас.

Комментарии:

1. String message = voids[0]; Это нам ничего не говорит. Мы не знаем, что вы отправляете. Пожалуйста, используйте реальный текст.

2. socketString.getText().toString() Здесь это начинается. Мы знаем, отмечая, что было введено. Или какой будет строка socketstring.

3. Если вам не удалось подключиться, возникает исключение IOException. Пожалуйста, опубликуйте соответствующую часть из logcat.

4. Я не получал никаких исключений IOException при запуске. И то, что я пытаюсь отправить, — это строка, которую пользователь вводит из EditText. Извините, но я впервые пытаюсь реализовать TCP-соединение между приложением и терминалом Visual Studio

5. То, что вы пытаетесь отправить строку, которую вводит пользователь, понятно. Только мы не знаем, что вводится. Поэтому, если вы обратитесь за помощью, вы могли бы гораздо лучше опубликовать код, например messageSender.execute("Now we know what you are doing"); , но если вы даже не можете подключиться, это не имеет значения, и у вас должно быть какое-то исключение.