Отправка и получение данных в Websockets для Java / Android - PullRequest
0 голосов
/ 28 апреля 2020

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

Я читаю, что клиент и сервер обмениваются информацией во фрейме данных, но ничего не говорится о том, как создать или спроектировать фрейм данных где-либо.

Я не совсем понимаю, как соединение остается открытым прослушивать, если поступают данные, и как, когда в компьютер приходит сообщение DOES , начинает обращать внимание и говорит: «О, это следующая вещь ». Я тестировал свой код с помощью надстройки «Simple Web Socket» для Mozilla Firefox и тестером под номером https://www.websockets.org. Они оба работают и соединяются и удерживают связь. Кажется, что сообщение, которое я посылаю через них, отправляется на мой сервер, но только когда я закрываю соединение со стороны клиента. Конечно, он все еще в байтах, поэтому он отображается как gibberi sh.

Существует механизм декодирования, который, как я предполагаю, предназначен для декодирования входящих сообщений, но в примере с веб-сайта Mozilla он не ' если бы байтовый массив был инициализирован для входящего значения, мне кажется, что байтовый массив должен быть декодирован с идентификатором, установленным на какое-то произвольное значение.

Мне бы очень хотелось иметь некоторую документацию, чтобы помочь мне понять функции и такой, на которую я смотрю. Я просто нахожу что-нибудь прямо. Если бы я мог найти что-то, что говорит здесь, как отправить сообщение клиенту, сделайте: A, B, C ... Это было бы круто, но буквально ничего такого нет.

Итак, три вопросы в основном

  1. Как отправлять последующие сообщения
  2. Как получать и хранить последующие сообщения
  3. Нужно ли начинать "сеанс" для каждого соединение?

Не стесняйтесь добавлять НИЧЕГО дополнительно, в том числе, где я могу найти ресурсы

Вот мой код:

import android.os.Build;

import androidx.annotation.RequiresApi;

import java.io.Console;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class WebSocket {
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static void main (String[] args) throws IOException, NoSuchAlgorithmException{
        ServerSocket server = new ServerSocket(80);
        try {
            System.out.println("Server has started on 127.0.0.1:80.\r\nWaiting for a connection...");
            Socket client = server.accept();
            System.out.println("A client connected.");
            InputStream in =client.getInputStream();
            //DataInputStream dis = new DataInputStream(in);
            OutputStream out = client.getOutputStream();
            Scanner s = new Scanner(in, "UTF-8");
            try {
                //while(client != null) {
                String data = s.useDelimiter("\\r\\n\\r\\n").next();
                //The carrot mean 'match the beggining of an input'
                Matcher get = Pattern.compile("^GET").matcher(data);
                System.out.println("We get here 1");
                System.out.println(get);
                if (get.find()) {
                    Matcher match;
                    match = Pattern.compile("Sec-WebSocket-Key: (.*)").matcher(data);
                    match.find();
                    System.out.print("We get here 2\r\n");

Если Я не ошибаюсь, это сообщение, которое мой сервер отправляет обратно клиенту, чтобы сказать «Эй, да, мы говорим о веб-сокетах».

                    byte[] response = ("HTTP/1.1 101 Switching Protocols\r\n"
                            + "Connection: Upgrade\r\n"
                            + "Upgrade: websocket\r\n"
                            + "Sec-WebSocket-Accept: "
                            + Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-1").digest((match.group(1) + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes("UTF-8")))
                            + "\r\n\r\n").getBytes("UTF-8");

Следующая строка - это то, что отправляет сообщение клиенту, если я не ошибаюсь

                    out.write(response, 0, response.length);

Я думаю, что эта следующая часть - часть, предназначенная для декодирования входящего сообщения, но нигде учебник не установил его для входящего объекта Scanner, поэтому я Я предполагаю, что я не прав в том, что он делает.

                    byte[] decoded = new byte[6];
                    byte[] encoded = new byte[]{(byte) 198, (byte) 131, (byte) 130, (byte) 182, (byte) 194, (byte) 135};
                    byte[] key = new byte[]{(byte) 167, (byte) 225, (byte) 225, (byte) 210};
                    for (int i = 0; i < encoded.length; i++) {
                        decoded[i] = (byte) (encoded[i] ^ key[i & 0x3]);
                        //this is just me checking what the values are
                        System.out.print(decoded[i]);
                    }
                    System.out.println("We get here 3");

Я также не уверен, если я с для входящих данных также может использоваться тот же разделитель, но это такой строковый разделитель (о котором я ничего не могу найти в inte rnet), что я предполагаю, что это важно.

                    //get next input from client and print it if not, print a period
                    while(client!=null){
                        System.out.println("We get here 4");
                        data= s.useDelimiter("\\r\\n\\r\\n").next();
                        if(data == null){
                            System.out.print(".");
                        }
                        else {
                            System.out.println(data);
                            System.out.print("\n");
                        }
                    }
                }
                //}
            } catch(Exception e) {
                if(in == null){
                    s.close();
                }
                else{
                    System.out.println(e);
                }
            }
        } catch(Exception x){
            System.out.print(x);
            server.close();
        }
    }
}

//https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_a_WebSocket_server_in_Java ```


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