Не работает клиент сокет Java Android Studio

187
10 декабря 2019, 19:40

Написал простой сервер с помощью сокетов. Его цель принимать данные от пользователя и отправлять их обратно Клиент я написал в Android Studio, прием-передача (общение с сервером) вынесены в отдельные потоки Thread. По отдельности и отправка и прием сообщений работают, но когда хочу и слушать сервер (в бесконечном цикле) и отправлять ему данные - приложение вылетает. Вот код клиента (без импортов):

public class MainActivity extends AppCompatActivity {

Handler h;
public String message;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    el = (EditText) findViewById(R.id.editText);
    h = new Handler(); //Handler нужен для вывода ответа сервера на экран
    t.start(); //Запуск потока прослушивания ответа
}

По нажатию на кнопку вызывается этот метод, который запускает поток send в котором и должна происходить отправка сообщения на сервер:

public void sendmsg (View v) {
    send.start();
}

Здесь выполняется поток в котором прослушивается ответ сервера, он запускается сразу при запуске приложения

 Thread t = new Thread(new Runnable() {
    public void run() {
        try {
            Socket s = new Socket("IP ADRESS", 8000);
               while(true) {
                   InputStreamReader listen = new InputStreamReader(s.getInputStream());
                   BufferedReader buff = new BufferedReader(listen);
                   final String message = buff.readLine();

После получения сообщения от сервера я присваиваю его в переменную и с помощью Handler пытаюсь вывести на экран

                   h.post(new Runnable() {
                       public void run() {
                           Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                       }
                   });
               }
                     }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
});

Поток ниже должен становится активным во время вызова метода sendmsg, он отвечает за отправку сообщения серверу, сразу после отправки он должен становится неактивным

Thread send = new Thread(new Runnable() {
    public void run() {
        try {
            Socket ssend = new Socket("IP ADRESS", 8000);
            PrintWriter writer = new PrintWriter(ssend.getOutputStream());
            writer.write("Сообщение серверу");
            writer.flush();
            writer.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
});
}   

По техническому заданию сначала сервер должен принять сообщение "Сообщение клиенту", после чего отправить его обратно, клиент это сообщение должен принять и вывести на экран через Toast.makeText, к серверу я подключаюсь но после отправки сообщения ничего дальше не происходит. Я думаю, может быть проблема в том что я в разных потоках обьявляю переменную сокета с одним и тем же адресом, но как исправить эту проблему я не понимаю. Помогите пожалуйста.

READ ALSO
Как правильно писать аргументы к методу Main в Java

Как правильно писать аргументы к методу Main в Java

Как правильно писать аргументы к методу Main? Мой друг изучает java и пишет public static void Main(String args[]), хотя я пишу public static void Main(String[] args) (но на C#)Не можем...

182
Exception in thread “main” java.lang.ClassNotFoundException: org.h2.Driver

Exception in thread “main” java.lang.ClassNotFoundException: org.h2.Driver

я новичок в Java, мне в универе надо сделать приложение, связаное с бдя на одном сайте нашел код, скопировал его, но он не заработал (выдал мне...

116