Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Really simple TCP client

Tags:

I want with my app to enter in the url of my server e.g. http://192.168.1.8/ and the port e.g. 1234. When my server receives the TCP Request message, it sends back a file (the server is already implemented).

I think that I don't need something complicated like an AsyncTask, as I do not want to keep the connection. Receiving the answer from the server, my connection must be closed.

Any indication for a way forward or a tip is highly appreciated.

like image 289
G.V. Avatar asked Jul 02 '16 17:07

G.V.


People also ask

What is a TCP client?

The TcpClient class provides simple methods for connecting, sending, and receiving stream data over a network in synchronous blocking mode. In order for TcpClient to connect and exchange data, a TcpListener or Socket created with the TCP ProtocolType must be listening for incoming connection requests.

How do I send a message through TCP IP?

With these functions, you are now able to convert a Message into a simple char-array and back at will. So now all you have to do is send the char-array over the TCP connection, receive it at the far end, and then Deserialize the array back into a Message struct there.

What is TCP server and TCP client?

A TCP server listens on a well-known port (or IP address and port pair) and accepts connections from TCP clients. A TCP client initiates a connection request to a TCP server in order to setup a connection with the server. A real TCP server can accept multiple connections on a socket.


1 Answers

Here is a simple TCP client that uses Sockets that I got working based on code in this tutorial (the code for the tutorial can also be found in this GitHub repository).

Note that this code is geared to sending strings back and forth between the client and server, usually in JSON format.

Here is the TCP client code:

import android.util.Log; 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;  public class TcpClient {      public static final String TAG = TcpClient.class.getSimpleName();     public static final String SERVER_IP = "192.168.1.8"; //server IP address     public static final int SERVER_PORT = 1234;     // 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 = false;     // used to send messages     private PrintWriter mBufferOut;     // used to read messages from the server     private BufferedReader mBufferIn;      /**      * 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(serverAddr, SERVER_PORT);              try {                  //sends the message to the server                 mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);                  //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) will must be implemented in the Activity     //class at on AsyncTask doInBackground     public interface OnMessageReceived {         public void messageReceived(String message);     }  } 

Then, declare a TcpClient as a member variable in your Activity:

public class MainActivity extends Activity {      TcpClient mTcpClient;      //............ 

Then, use an AsyncTask for connecting to your server and receiving responses on the UI thread (Note that messages received from the server are handled in the onProgressUpdate() method override in the AsyncTask):

public class ConnectTask extends AsyncTask<String, String, TcpClient> {      @Override     protected TcpClient doInBackground(String... message) {          //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....  } 

To start the connection to your server, execute the AsyncTask:

new ConnectTask().execute(""); 

Then, sending a message to the server:

//sends the message to the server if (mTcpClient != null) {     mTcpClient.sendMessage("testing"); } 

You can close the connection to the server at any time:

if (mTcpClient != null) {     mTcpClient.stopClient(); } 
like image 57
Daniel Nugent Avatar answered Oct 08 '22 13:10

Daniel Nugent