Действительно простой TCP-клиент

Я хочу, чтобы с моим приложением введите URL-адрес моего сервера, например, http://192.168.1.8/ и порт, например, 1234 . Когда мой сервер получает сообщение «Запрос TCP», он отправляет обратно файл (сервер уже реализован).

Я думаю, что мне не нужно что-то сложное, как AsyncTask, поскольку я не хочу поддерживать соединение. Получив ответ с сервера, мое соединение должно быть закрыто.

Любое указание на способ продвижения вперед или отзыв заслуживает высокой оценки.

Вот простой TCP-клиент, который использует сокеты, которые я получил на основе кода в этом учебнике (код учебника также можно найти в этом репозитории GitHub ).

Обратите внимание, что этот код предназначен для отправки строк назад и вперед между клиентом и сервером, обычно в формате JSON.

Вот код клиента TCP:

 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); } } 

Затем объявите TcpClient в качестве переменной-члена в вашей деятельности:

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

Затем используйте AsyncTask для подключения к вашему серверу и получения ответов в streamе пользовательского интерфейса (обратите внимание, что сообщения, полученные с сервера, обрабатываются в переопределении метода onProgressUpdate() в AsyncTask):

 public class ConnectTask extends AsyncTask { @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.... } 

Чтобы запустить соединение с вашим сервером, выполните команду AsyncTask:

 new ConnectTask().execute(""); 

Затем отправьте сообщение на сервер:

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

Вы можете закрыть соединение с сервером в любое время:

 if (mTcpClient != null) { mTcpClient.stopClient(); } 

Спасибо за код. В моем случае у меня были проблемы с получением данных, поскольку я не использую линейный протокол. Я написал альтернативную реализацию, которая работает с моей конкретной настройкой сервера:

  1. В файле TcpClient.java, команде «run ()» вы должны заменить fragment кода ниже

    public void run () {

     mRun = true; try { InetAddress serverAddr = InetAddress.getByName(SERVER_IP); Log.e("TCP Client", "C: Connecting..."); Socket socket = new Socket(serverAddr, SERVER_PORT); try { mBufferOut = new PrintWriter(socket.getOutputStream()); Log.e("TCP Client", "C: Sent."); mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); int charsRead = 0; char[] buffer = new char[1024]; //choose your buffer size if you need other than 1024 while (mRun) { charsRead = mBufferIn.read(buffer); mServerMessage = new String(buffer).substring(0, charsRead); if (mServerMessage != null && mMessageListener != null) { mMessageListener.messageReceived(mServerMessage);} mServerMessage = null; } Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'"); 

// остальная часть кода в порядке, см. оригинал

  1. doInBackgroud в вашем сообщении MainActivity.java, полученном на onProgressUpdate, вы можете отобразить его в другом объекте, например TextView

     @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); Log.d("test", "response " + values[0]); response.setText(response.getText() + "/n" +values[0]); } 

// «response» – объект TextView, объявленный в вашей функции

 public class MainActivity extends AppCompatActivity { TextView response; //...so on 

и функция

protected void onCreate(Bundle savedInstanceState) { response = (TextView) findViewById(R.id.textView); //..so on

  • Это тот же порт, что и клиент и сервер?
  • TCP: могут ли два разных сокета совместно использовать порт?
  • Как обходить ограничения IP через работу DNS в случае hulu.com?
  • Java TCP-сокет: передача данных медленная
  • Как работает прокси?
  • Как обнаружить разъединение сокета TCP (с гнездом C Berkeley)
  • Параметр TCP SO_LINGER (ноль) - когда требуется
  • Содержит ли соединение сокетов TCP «поддерживать»?
  • Несколько клиентов асинхронного сервера
  • BOOST ASIO - Как написать консольный сервер
  • Двойной маршрутизатор OpenVpn Port Forwarding
  • Давайте будем гением компьютера.