Я создаю мобильное приложение для отправки чего-либо в мой веб-браузер и наоборот. Я ничего не могу найти о том, как отправить клиенту последующее сообщение или получить его на сервере. Сервер уже собран, так как я использовал учебник из Mozilla , чтобы помочь построить сервер, и, хотя он подключается и удерживает соединение, я не могу отправлять и получать любые сообщения, кроме оригинальных заголовков, которые являются обменами, когда начальное соединение установлено.
Я читаю, что клиент и сервер обмениваются информацией во фрейме данных, но ничего не говорится о том, как создать или спроектировать фрейм данных где-либо.
Я не совсем понимаю, как соединение остается открытым прослушивать, если поступают данные, и как, когда в компьютер приходит сообщение DOES , начинает обращать внимание и говорит: «О, это следующая вещь ». Я тестировал свой код с помощью надстройки «Simple Web Socket» для Mozilla Firefox и тестером под номером https://www.websockets.org. Они оба работают и соединяются и удерживают связь. Кажется, что сообщение, которое я посылаю через них, отправляется на мой сервер, но только когда я закрываю соединение со стороны клиента. Конечно, он все еще в байтах, поэтому он отображается как gibberi sh.
Существует механизм декодирования, который, как я предполагаю, предназначен для декодирования входящих сообщений, но в примере с веб-сайта Mozilla он не ' если бы байтовый массив был инициализирован для входящего значения, мне кажется, что байтовый массив должен быть декодирован с идентификатором, установленным на какое-то произвольное значение.
Мне бы очень хотелось иметь некоторую документацию, чтобы помочь мне понять функции и такой, на которую я смотрю. Я просто нахожу что-нибудь прямо. Если бы я мог найти что-то, что говорит здесь, как отправить сообщение клиенту, сделайте: A, B, C ... Это было бы круто, но буквально ничего такого нет.
Итак, три вопросы в основном
- Как отправлять последующие сообщения
- Как получать и хранить последующие сообщения
- Нужно ли начинать "сеанс" для каждого соединение?
Не стесняйтесь добавлять НИЧЕГО дополнительно, в том числе, где я могу найти ресурсы
Вот мой код:
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 ```