пример веб-сокета не получает - PullRequest
0 голосов
/ 04 августа 2020

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

введите описание изображения здесь

сообщение появляется только на сервере после закрытия клиента или в клиенте после закрытия сервера,

сцена C: запуск сервера и клиента

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

Записать сообщение клиента, отправить

Конечный клиент: сообщение появится на сервере.

тоже идет в другую сторону:

сцена S: запуск сервера и клиента

Запись сообщения сервера, отправка кнопки

Запись сообщения клиента, отправка кнопки

Выход из сервера: сообщение появляется в клиенте.

Я уже несколько дней искал рабочий код, не повезло

server: MainActivity. java

[[

    package com.server.myapplication.server;

    import android.annotation.SuppressLint;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;

    @SuppressLint("SetTextI18n")
    public class MainActivity extends AppCompatActivity {

        ServerSocket serverSocket;
        Thread Thread1 = null;

        TextView tvIP, tvPort;
        TextView tvMessages;

        EditText etMessage;
        Button btnSend;

        public static String SERVER_IP = "";
        public static final int SERVER_PORT = 8080;

        String message;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            tvIP = findViewById(R.id.tvIP);
            tvPort = findViewById(R.id.tvPort);




            tvMessages = findViewById(R.id.tvMessages);
            etMessage = findViewById(R.id.etMessage);
            btnSend = findViewById(R.id.btnSend);

            try {
                SERVER_IP = getLocalIpAddress();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }

            Thread1 = new Thread(new Thread1());
            Thread1.start();


            btnSend.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    message = etMessage.getText().toString().trim();
                    if (!message.isEmpty()) {
                        new Thread(new Thread3(message)).start();
                    }
                }
            });
        }
        // end on create

        private String getLocalIpAddress() throws UnknownHostException {
            WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
            assert wifiManager != null;
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            int ipInt = wifiInfo.getIpAddress();
            return InetAddress.getByAddress(
                    ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(ipInt).array())
                    .getHostAddress();
        }

        private PrintWriter output;
        private BufferedReader input;

        class Thread1 implements Runnable {

            @Override
            public void run() {
                Socket socket;
                try {
                    serverSocket = new ServerSocket(SERVER_PORT);
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            tvMessages.setText("Not connected");
                            tvIP.setText("IP: " + SERVER_IP);
                            tvPort.setText("Port: " + String.valueOf(SERVER_PORT));
                        }
                    });
                    try {
                        socket = serverSocket.accept();

                        output = new PrintWriter(socket.getOutputStream());
                        input = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                tvMessages.setText("Connected\n");
                            }
                        });
                        new Thread(new Thread2()).start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        private class Thread2 implements Runnable {
            @Override
            public void run() {
                while (true) {
                    try {
                        final String message = input.readLine();
                        if (message != null) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    tvMessages.append("client:" + message + "\n");
                                }
                            });
                        } else {
                            Thread1 = new Thread(new Thread1());
                            Thread1.start();
                            return;
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        class Thread3 implements Runnable {
            private String message;

            Thread3(String message) {
                this.message = message;
            }

            @Override
            public void run() {
                output.write(message);
                output.flush();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvMessages.append("server: " + message + "\n");
                        etMessage.setText("");
                    }
                });
            }
        }
    }

]]

клиент: MainActivity. java

[[

    package com.client.myapplication.client;

    import android.annotation.SuppressLint;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;

    @SuppressLint("SetTextI18n")
    public class MainActivity extends AppCompatActivity {

        Thread Thread1 = null;

        EditText etIP, etPort;
        TextView tvMessages;

        EditText etMessage;
        Button btnSend;

        String SERVER_IP;
        int SERVER_PORT;




        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            etIP = findViewById(R.id.etIP);
            etPort = findViewById(R.id.etPort);
            //test
            etIP.setText("192.168.188.93");
            etPort.setText("8080");
            //
            tvMessages = findViewById(R.id.tvMessages);
            etMessage = findViewById(R.id.etMessage);
            btnSend = findViewById(R.id.btnSend);


            // only client
            Button btnConnect = findViewById(R.id.btnConnect);
            btnConnect.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    tvMessages.setText("");
                    SERVER_IP = etIP.getText().toString().trim();
                    SERVER_PORT = Integer.parseInt(etPort.getText().toString().trim());
                    Thread1 = new Thread(new Thread1());
                    Thread1.start();
                }
            });  // only client end


            btnSend.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String message = etMessage.getText().toString().trim();
                    if (!message.isEmpty()) {
                        new Thread(new Thread3(message)).start();
                    }
                }
            });
        }
        // end on create

        //only server
        private String getLocalIpAddress() throws UnknownHostException {
            WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
            assert wifiManager != null;
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            int ipInt = wifiInfo.getIpAddress();
            return InetAddress.getByAddress(
                    ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(ipInt).array())
                    .getHostAddress();
        }
        // only server end

        private PrintWriter output;
        private BufferedReader input;

        class Thread1 implements Runnable {

            @Override
            public void run() {
                Socket socket;
                try {
                    socket = new Socket(SERVER_IP, SERVER_PORT);

                    output = new PrintWriter(socket.getOutputStream());
                    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            tvMessages.setText("Connected\n");
                        }
                    });
                    new Thread(new Thread2()).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        class Thread2 implements Runnable {
            @Override
            public void run() {
                while (true) {
                    try {
                        final String message = input.readLine();
                        if (message != null) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    tvMessages.append("server: " + message + "\n");
                                }
                            });
                        } else {
                            Thread1 = new Thread(new Thread1());
                            Thread1.start();
                            return;
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        class Thread3 implements Runnable {
            private String message;

            Thread3(String message) {
                this.message = message;
            }

            @Override
            public void run() {
                output.write(message);
                output.flush();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvMessages.append("client: " + message + "\n");
                        etMessage.setText("");
                    }
                });
            }
        }
    }

]]

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