Сервер отправляет сообщение на клиентские сокеты - PullRequest
0 голосов
/ 18 февраля 2020

Я начал работать с сокетами на этой неделе, и мне трудно. Моя цель - когда клиент отправил сообщение, сервер ответил уведомлением. На стороне клиента отправка на сервер не имеет проблем, но когда сервер отправляет клиенту, ничего не появляется. Кто-нибудь может мне помочь с этой проблемой?

Клиент:

    Thread thread = new Thread(new myServerThread());
    thread.start();

class myServerThread implements Runnable {
    Socket socket;
    ServerSocket serverSocket;
    InputStreamReader inputStreamReader;
    BufferedReader bufferedReader;
    String message;
    Handler handler = new Handler();

    @Override
    public void run() {
        try {
            serverSocket = new ServerSocket(5000);
            while (true){
                socket = serverSocket.accept();
                inputStreamReader = new InputStreamReader(socket.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader);
                message = bufferedReader.readLine();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), message,Toast.LENGTH_LONG).show();
                        }
                    });
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
}

СЕРВЕР:

 String EMAIL = "Email";

   try {        
       serverSocket = new ServerSocket(6000);
       while(true){
       socket = serverSocket.accept();
       inputStreamReader = new InputStreamReader(socket.getInputStream());
       bufferedReader = new BufferedReader(inputStreamReader);
       email = bufferedReader.readLine();


       System.out.println(email);

       if(email.equals(EMAIL)){
           jTextArea1.setText(email);
           try {
            socket = new Socket("localHost", 5000);
            PrintWriter  printWriter = new PrintWriter(socket.getOutputStream());
            printWriter.write(message);
            printWriter.flush();
            printWriter.close();
            System.out.println("connected");


        } catch (IOException e) {
            e.printStackTrace();
        }

       }else{
       }

       }

   } catch (IOException ex) {
   }
    etEmail = findViewById(R.id.etvEmail);

1 Ответ

0 голосов
/ 18 февраля 2020

Сначала краткий ответ: оба ваших кода Java работают почти нормально.

В любом случае, вы всегда должны проверять свое приложение на соответствие другой программе, о которой известно, что она в порядке. Протестировав одну написанную саму программу против другой, написанной самостоятельно, трудно сказать, какая из них не работает. Похоже, вы тестируете его с некоторыми GUI (Android?). Преобразование соответствующей части в простое консольное приложение, которое вы запускаете на обычном P C, значительно упрощает поиск неисправностей.

Итак, позвольте мне показать, как я проверял ваш код на моем Linux ноутбуке:

Сначала скопируйте ваш "клиентский" код в шаблон "Hello-World". Я добавил несколько сообщений отладки и al oop, который позволяет клиенту получать более одной строки текста:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

class Main
{

    static class myServerThread implements Runnable
    {
        Socket socket;
        ServerSocket serverSocket;
        InputStreamReader inputStreamReader;
        BufferedReader bufferedReader;
        String message;

        @Override
        public void run()
        {
            try
            {
                serverSocket = new ServerSocket(5000);
                while (true)
                {
                    System.out.println("Accepting...");
                    socket = serverSocket.accept();
                    System.out.println("Connected...");
                    inputStreamReader = new InputStreamReader(socket.getInputStream());
                    bufferedReader = new BufferedReader(inputStreamReader);
                    String message = bufferedReader.readLine();
                    while (message!=null)
                    {
                        System.out.println("Received:" + message);
                        message = bufferedReader.readLine();
                    }
                    System.out.println("Closing...");
                    socket.close();
                }

            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
        Thread thread = new Thread(new myServerThread());
        thread.start();
    }
}

Я запустил «client» и открыл другое командное окно, чтобы открыть сетевое соединение с Netcat и отправьте две строки текста:

nc localhost 5000
Hallo
Test

Связанный вывод программы "client" был:

Accepting...
Connected...
Received:Hallo
Received:Test
Closing...
Accepting...

Таким образом, часть "client", очевидно, работает нормально.

Затем я скопировал ваш «серверный» код в шаблон «Hello World»:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

class Main
{

    static class myServerThread implements Runnable
    {
        Socket socket;
        ServerSocket serverSocket;
        InputStreamReader inputStreamReader;
        BufferedReader bufferedReader;
        String message;

        @Override
        public void run()
        {
            String EMAIL = "Email";

            try
            {
                serverSocket = new ServerSocket(6000);
                while (true)
                {
                    System.out.println("Accepting...");
                    socket = serverSocket.accept();
                    System.out.println("Connected...");
                    inputStreamReader = new InputStreamReader(socket.getInputStream());
                    bufferedReader = new BufferedReader(inputStreamReader);

                    String message = bufferedReader.readLine();
                    while (message != null)
                    {
                        System.out.println("Received:" + message);

                        if (message.equals(EMAIL))
                        {
                            System.out.println("Sending...");
                            try
                            {
                                socket = new Socket("localHost", 5000);
                                PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                                printWriter.write(message);
                                printWriter.flush();
                                printWriter.close();
                                System.out.println("sending done");

                            }
                            catch (IOException e)
                            {
                                e.printStackTrace();
                            }

                        }
                        message = bufferedReader.readLine();
                    }
                    System.out.println("Closing...");
                    socket.close();
                }
            }
            catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
        Thread thread = new Thread(new myServerThread());
        thread.start();
    }
}

Снова я добавил несколько сообщений отладки и все oop, чтобы сервер мог получать несколько строк текста , Поскольку эта Java программа обрабатывает два соединения, мне пришлось открыть две команды windows.

В первом командном окне я говорю NetCat принять (прослушать) соединение через порт 5000. Именно здесь ваш «сервер» отправит сообщение «Email» на:

nc -lp 5000

In во втором командном окне я говорю Netcat подключиться к вашему «серверу» через порт 6000, затем отправляю две строки текста и затем нажимаю Ctrl- C, чтобы остановить его:

nc localhost 6000
Test
Email
^C

Соответствующий вывод "серверной" программы:

Accepting...
Connected...
Received:Test
Received:Email
Sending...
sending done
Closing...
Accepting...

И мой прослушивающий Netcat в другой (первой) команде windows выдал такой вывод:

stefan@stefanpc:/hdd/stefan$ nc -lp 5000
Emailstefan@stefanpc:/hdd/stefan$ 

Так что на моем все выглядит нормально машина. Кроме одной маленькой детали: после «электронной почты», которую ваш «сервер» отправляет клиенту, нет разрыва строки (в данном случае NetCat). Итак, исправить это просто:

printWriter.write(message+"\n"); 

Этот окончательный разрыв строки необходим, потому что ваш клиент использует ввод от readLine().

NetCat - очень полезный инструмент для тестирования простого текстового сокета TCP коммуникации. Он включен во все Linux дистрибутивов. Если у вас возникли трудности с поиском Windows исполняемого файла, тогда возьмите его с моей домашней страницы: http://stefanfrings.de/avr_tools/netcat-win32-1.12.zip

Пожалуйста, прокомментируйте, было ли это полезно для вас.

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