Как отправить строку по нажатию кнопки, когда я подключен к сокету? - PullRequest
0 голосов
/ 05 июня 2018

Я хочу отправлять данные через сокет по нажатию кнопки, пока я подключен к серверу.Я попытался вызвать setOnClickListener внутри своего класса ConnectTask, а также в моем классе TcpClient, но это показывает мне ошибку.Хотя я создаю его внутри ConnectTask, он не показывает ошибку, но он не работает.Как мне это сделать?Ниже приведены мои классы.

Вот мой основной класс:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.util.Log;
import android.widget.EditText;

import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
    Button btn;
    EditText edt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn=(Button)findViewById(R.id.button);
        edt=(EditText)findViewById(R.id.editText);
        ConnectTask connectTask=new ConnectTask();
        connectTask.execute("testing");
    }
    public class ConnectTask extends AsyncTask<String, String, TcpClient> {


        @Override
        protected TcpClient doInBackground(String... message) {
            Log.d("TCP Client", "checking");
            TcpClient mTcpClient;
            //we create a TCPClient object
            mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() {
                @Override
                //here the messageReceived method is implemented
                public void messageReceived(String message) {
                    //this method calls the onProgressUpdate
                    publishProgress(message);
                }
            });
            mTcpClient.run();


            return null;
        }
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            //response received from server
            Log.d("test", "response " + values[0]);
            //process server response here....

        }
    }
}    

А вот мой класс TcpClient:

import android.app.Activity;
import android.content.Context;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import android.os.Handler;

import static android.os.Looper.*;

public class TcpClient extends MainActivity{

    public static final String TAG = TcpClient.class.getSimpleName();
    public static final String SERVER_IP = "10.0.2.2"; //server IP address
    public static final int SERVER_PORT = 9000;
    // message to send to the server
    private String mServerMessage;
    // sends message received notifications
    private OnMessageReceived mMessageListener = null;
    // while this is true, the server will continue running
    private boolean mRun = true;
    // used to send messages
    private PrintWriter mBufferOut;
    // used to read messages from the server
    private BufferedReader mBufferIn;

    Context context=getApplicationContext();

    /**
     * Constructor of the class. OnMessagedReceived listens for the messages 
received from server
     */
    public TcpClient(OnMessageReceived listener) {
        mMessageListener = listener;
    }

    /**
     * Sends the message entered by client to the server
     *
     * @param message text entered by client
     */
    public void sendMessage(final String message) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                if (mBufferOut != null) {
                    Log.d(TAG, "Sending: " + message);
                    mBufferOut.println(message);
                    mBufferOut.flush();
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
    }

    /**
     * Close the connection and release the members
     */
    public void stopClient() {

        mRun = false;
        if (mBufferOut != null) {
        mBufferOut.flush();
            mBufferOut.close();
        }

        mMessageListener = null;
        mBufferIn = null;
        mBufferOut = null;
        mServerMessage = null;
    }

    public void run () {

        mRun = true;

        try {
            //here you must put your computer's IP address.
            //InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

            Log.d("TCP Client", "C: Connecting...");

            //create a socket to make the connection with the server
            Socket socket = new Socket(SERVER_IP, SERVER_PORT);
            if(socket.isConnected()){
                Log.d("hati","connected");
            }

            try {

                //sends the message to the server
                mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

                    sendMessage("testing");
                //receives the message which the server sends back
                mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));


                //in this while the client listens for the messages sent by the server
                while (mRun) {

                    mServerMessage = mBufferIn.readLine();

                    if (mServerMessage != null && mMessageListener != null) 
                    {
                        //call the method messageReceived from MyActivity class
                        mMessageListener.messageReceived(mServerMessage);
                    }

                }

                Log.d("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'");

            } catch (Exception e) {
                Log.e("TCP", "S: Error", e);
            } finally {
                //the socket must be closed. It is not possible to reconnect to this socket
                // after it is closed, which means a new socket instance has to be created.
                socket.close();
            }

        } catch (Exception e) {
            Log.e("TCP", "C: Error", e);
        }

    }

    //Declare the interface. The method messageReceived(String message) must be implemented in the Activity
    //class at on AsyncTask doInBackground
    public interface OnMessageReceived {
        public void messageReceived(String message);
    }

}

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

открытый класс TcpClient extends MainActivity {

Довольно плохо, если в названии класса, расширяющего действие, нет Activity.Чтобы сделать ваш код более читабельным, вы должны изменить его на

  public class TcpClientActivity extends MainActivity{

Затем вы получите

  mTcpClient = new TcpClientActivity(new TcpClientActivity.OnMessageReceived() {

, на котором каждое тело встало бы и кричало: вам не разрешено создавать экземплярактивность с оператором new.

0 голосов
/ 05 июня 2018
  1. Переместить TcpClient mTcpClient в класс MainActivity:

    public class MainActivity extends AppCompatActivity {
    
    Button btn;
    EditText edt;
    TcpClient mTcpClient;
    
  2. Удалить TcpClient mTcpClient;из защищенного TcpClient doInBackground

    protected TcpClient doInBackground(String... message) {
      Log.d("TCP Client", "checking");
      // remove this line TcpClient mTcpClient
    
  3. добавить слушателя действий для вашей кнопки и вызвать tcpClient для отправки сообщения

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       btn=(Button)findViewById(R.id.button);
       button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            mTcpClient.senMessage("get Text from text box");
          }
       });
    
    edt=(EditText)findViewById(R.id.editText);
    ConnectTask connectTask=new ConnectTask();
    connectTask.execute("testing");
    

    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...