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

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

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

У меня есть проверенный сервер на 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)
        {
        }
    }
}
}

1 Ответ

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

Вы пытаетесь создать новое 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());
...