Обработка других AJAX запросов от клиента во время длительного опроса. Сервер: Java, HTTP, Клиент: vue, js, машинопись, axios - PullRequest
0 голосов
/ 07 апреля 2020

Я делаю простой сервис социальных сетей. Я хотел бы реализовать длинный опрос для системы уведомлений. Кажется, это работает, но после длинного запроса на опрос клиент не может отправлять другие запросы AJAX, пока сервер не ответит на длинный запрос. Эти другие AJAX запросы находятся в состоянии ожидания.

Я написал сервер HTTP Java с нуля, используя классы ServerSocket, Socket, InputStreaming, OutputStreaming. Клиент получает подтверждение от сервера, и сервер создает новый поток для этого клиента. Существует простая система, которая обрабатывает события. Если было вызвано событие Long-polling, текущий поток засыпает на 15 секунд. Но если этот спящий клиент пытается отправить другие запросы, он имеет статус ожидания и не поступает на сервер до тех пор, пока не будет выполнен длинный опрос.

Я попытался отменить ожидающий запрос на длинный опрос на стороне клиента, используя ax ios отмена, как и ожидалось, не прервала поток этого клиента на стороне сервера.

Пара снимков экрана и фрагментов кода:

Длинный опрос и другие запросы ожидают

Время ответа

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

Сервер:

package com.server.app;

import java.net.ServerSocket;
import java.net.Socket;

import com.google.gson.Gson;
import com.server.helpers.debugging.Debug;

public class Server {
    public static Gson gson;

    public static void run() {
        try (ServerSocket server = new ServerSocket(ServerConfig.port)) {
            gson = new Gson();

            ServerConfig.display();

            while (true) {
                try (Socket socket = server.accept()) {
                    new Thread(new SocketThread(socket)).run();
                } catch (Exception e) {
                    Debug.log("Socket hasn't been created: " + e.getMessage());
                }
            }
        } catch (Exception e) {            
            Debug.log("Error occurred while starting the server: " + e.getMessage());
        }
    }
}

Модуль, который обрабатывает события длинного опроса:

package com.server.modules;

import com.server.helpers.communications.Connection;
import com.server.helpers.communications.Response;

public class LongPolling extends Module {
    public LongPolling() {
        accessor = "/long-polling";
    }

    public Response longPollingEvent(Connection connection, String data) {        
        try {
            Thread.currentThread().sleep(5000);
        } catch (Exception e) {

        }

        // Response(event: String, data: Object);
        return new Response("log", "Long polling request has been handled");
    }

    public Response anotherEvent(Connection connection, String data) {
        return new Response("log", "This is another request.");
    }
}

Класс соединения из второго примера кода:

package com.server.helpers.communications;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Connection {
    public Socket socket;
    public InputStream inputStream;
    public OutputStream outputStream;

    public void close() {
        try { socket.close(); } catch (Exception e) { }
    }

    public void write(byte[] message) {
        try { outputStream.write(message); } catch (Exception e) { }
    }

    public Connection(Socket socket, InputStream inputStream, OutputStream outputStream) {
        this.socket = socket;
        this.inputStream = inputStream;
        this.outputStream = outputStream;
    }
}
...