Простой TCP-клиент Java

У меня есть протестированный сервер на ESP8266 с обратной связью и клиентское приложение tcp, которое не отправляет сообщения. Я также протестировал его на сервере, который сообщает вам, подключен ли кто-нибудь, и сообщает, что он подключается.

"Чат" textView показывает сообщение, когда я нажимаю "Отправить".

Например: Client: message, но он не отправляет его на сервер, чтобы он вернул его обратно.

Что я должен изменить для этого, чтобы отправлять и получать сообщения?

Клиент

package com.example.tinemasilo.researchgate_sockettut;

import android.app.Activity;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;

public class MainActivity extends Activity
{

static EditText serverIp,smessage;
static TextView chat;
static Button connectPhones,disconnectPhones,sent;
static String serverIpAddress = "",msg = "",str;
Handler handler = new Handler();
//static InetAddress serverAddr;
static Socket socket;
static DataOutputStream os;
//static DataInputStream in;
static BufferedReader in;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    chat = (TextView) findViewById(R.id.chat);
    serverIp = (EditText) findViewById(R.id.server_ip);
    smessage = (EditText) findViewById(R.id.smessage);

    sent = (Button) findViewById(R.id.sent_button);
    connectPhones = (Button) findViewById(R.id.connectPhones);
    disconnectPhones = (Button) findViewById(R.id.disconnectPhones);

    connectPhones.setEnabled(true);
    connectPhones.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            connectPhones.setEnabled(false);
            disconnectPhones.setEnabled(true);
            serverIpAddress = serverIp.getText().toString();
            //try
            //{
            //    InetAddress.getByName(serverIpAddress);
            //    serverAddr.getByName(serverIpAddress);
            //    socket = new Socket(serverAddr, 10000);
            //}
            // catch (IOException e)
            //{
            //}

            if (!serverIpAddress.equals(""))
            {
                Thread clientThread = new Thread(new ClientThread());
                clientThread.start();
            }

        }
    });

    sent.setOnClickListener(new View.OnClickListener()
     {
        public void onClick(View v)
        {
             Thread sentThread = new Thread(new sentMessage());
             sentThread.start();
         }
     });

      disconnectPhones.setEnabled(false);
      disconnectPhones.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v)
         {
            connectPhones.setEnabled(true);
            disconnectPhones.setEnabled(false);
                try
                {
                 socket.close();
                }
                catch (IOException e)
                {
                }
          }
      });
}

public class ClientThread implements Runnable
{
    public void run()
    {
        try
        {

            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            //serverAddr.getByName(serverIpAddress);
            socket = new Socket(serverAddr, 502);


            while(true)
            {
                //InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                //serverAddr.getByName(serverIpAddress);
                //socket = new Socket(serverAddr, 10000);
                //in = new DataInputStream(socket.getInputStream());
                in = new BufferedReader( new InputStreamReader(socket.getInputStream()));
                String line = null;
                while ((line = in.readLine()) != null)
                {
                    msg = msg + "Server : " + line + "\n";
                    handler.post(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            chat.setText(msg);
                        }
                    });
                }
                in.close();
                Thread.sleep(100);
            }
        }
        catch (Exception e)
        {
        }
    }
}

class sentMessage implements Runnable
{
    @Override
    public void run()
    {
        try
        {

            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            //serverAddr.getByName(serverIpAddress);
            socket = new Socket(serverAddr, 502);

            os = new DataOutputStream(socket.getOutputStream());
            str = smessage.getText().toString();
            str = str + "\n";
            msg = msg + "Client : " + str;
            handler.post(new Runnable()
            {
                @Override
                public void run()
                {
                    chat.setText(msg);
                }
            });
            os.writeBytes(str);
            os.flush();
            os.close();
            }
        catch(IOException e)
        {
        }
    }
}
}

Уточните, пожалуйста, в чем ваш вопрос.

Mikhail Kholodkov 07.06.2018 11:37

ваш сервер поддерживал множественное соединение?

Abu Yousuf 07.06.2018 11:38
socket = new Socket(serverAddr, 502); У вас есть это дважды. При втором вызове вы отбрасываете ссылку на свой первый сокет. Итак, вы создаете двух клиентов. Теперь сервер может обрабатывать двух клиентов? (Спрашивали раньше).
greenapps 07.06.2018 11:44

Почему вы объявляете все поля статическими? Сделайте их приватными.

greenapps 07.06.2018 11:45

Значит, мне нужно поставить сокет как глобальный?

Omnos 07.06.2018 11:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
643
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь создать новое соединение Socket на том же порту в sentThread. Первое соединение создается в классе ClientThread, и когда вы нажимаете кнопку sent, вы создаете другое соединение Socket на том же порте 502. Думаю, это основная проблема.

Попробуйте использовать существующее соединение Socket в классе sentThread.

class sentMessage implements Runnable
{
  @Override
  public void run()
  {
    try
    {

        //InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
        //serverAddr.getByName(serverIpAddress);
       // socket = new Socket(serverAddr, 502);

       // os = new DataOutputStream(socket.getOutputStream());
        str = smessage.getText().toString();
        str = str + "\n";
        msg = msg + "Client : " + str;
        handler.post(new Runnable()
        {
            @Override
            public void run()
            {
                chat.setText(msg);
            }
        });
        os.writeBytes(str);
        os.flush();
        //os.close();
        }
    catch(IOException e)
    {
    }
}
}

Редактировать: Если вы хотите отправить несколько сообщений, не закрывайте DataOutputStream. Удалите линии os.close(); и os = new DataOutputStream(socket.getOutputStream()); из класса sentMessage. Инициализируйте os при первом подключении. Затем каждый раз, когда вы хотите отправить сообщение, используйте этот экземпляр os.

В классе ClientThread инициализировать os после создания соединения

   socket = new Socket(serverAddr, 502);
   os = new DataOutputStream(socket.getOutputStream());

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

Omnos 07.06.2018 11:56

Попробуйте отладить, чтобы найти проблему

Abu Yousuf 07.06.2018 12:09

Обновленный ответ, пожалуйста, проверьте

Abu Yousuf 07.06.2018 12:25

Я изменил код, как вы сказали при редактировании, и теперь он работает. Спасибо!

Omnos 07.06.2018 12:30

Другие вопросы по теме