Ожидание ответа сокета на внешний класс - PullRequest
0 голосов
/ 26 ноября 2018

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

Давайте получимЗапущено:

Это мой класс IPCSocket, который подключается к серверу c ++ через свой собственный сокет

package com.socket;
import java.io.*;
import java.net.*;
import java.util.concurrent.ConcurrentLinkedQueue;

public class IPCSocket implements Runnable {
    private Socket m_socket;
    private static ConcurrentLinkedQueue<String> send_queue = new ConcurrentLinkedQueue<String>();
    private static ConcurrentLinkedQueue<String> rcv_queue = new ConcurrentLinkedQueue<String>();

    PrintWriter out;
    BufferedReader in;

    public void run() {
        try {
            m_socket = new Socket("127.0.0.1", 7070);
            System.out.println("The client is running.");

            out = new PrintWriter(m_socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));

            while(true) {
            //System.out.println("Sending:");
            send(out);

            //System.out.println("Receiving:");
            receive(in);
        }
    } catch (IOException | InterruptedException e) {
        System.out.println("IOException on java client : " + e.getMessage());
        if(e.getMessage().contains("Connection refused")) {
            System.out.print("impossibile comunicare con l'urna\n");
            }

    }
    finally {
        try {
            out.close();
            in.close();
            m_socket.close();
        } catch (IOException e) {
            System.out.println("IOException on java client: " + e.getMessage());

        }
    }
}

public synchronized void send(PrintWriter out) throws IOException, InterruptedException {
    while(send_queue.isEmpty()) {
        System.out.println("Queue is empty, waiting for it to be filled");
        Thread.sleep(5000);
    }
    String message = send_queue.poll();
    System.out.println("Sending >:" + message);
    out.println(message);
}

public synchronized void receive(BufferedReader in) throws IOException, InterruptedException {
    String str;
    while((str = in.readLine()) == null) 
        Thread.sleep(500);
    System.out.println("Receiving <:" + str);
    rcv_queue.add(str);
}


public void pushInSendQueue(String message) {
    send_queue.add(message);
}


public String pullFromRcvQueue() throws InterruptedException {
    return rcv_queue.poll(); 
}

public String peekFromRcvQueue() {
    return rcv_queue.peek(); 
}
}

У меня также есть веб-сервер в том же Java-проекте, который создает экземпляр класса IPCSocket для извлеченияданные с сервера c ++ и отображать их на веб-странице

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page import="com.eVotingOnline.*" %>
<%@ page import="com.socket.*" %>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="js/index.js"></script>
    <title>eVoting Online</title>
</head>
<body>
<%

    IPCSocket conn = new IPCSocket();
    new Thread(conn).start();

    //invio token
    String token = (String) request.getParameter("token");
    conn.pushInSendQueue("1:"+token);

    String fileScheda = conn.pullFromRcvQueue();
    System.out.println("result:" + fileScheda); 
    .... // other stuff

Проблема заключается в том, что pullFromRcvQueue возвращает пустую строку, поскольку rcv_queue еще не заполнен должным образом, но добавляет задержку между pushInSendQueue и pullFromrcvQueueочевидно, не делает трюк.Я читал об интерфейсе FutureTask и Callable (который, я думаю, мне следует реализовать), но когда я пытаюсь использовать объект Future внутри моего index.jsp, появляется сообщение «Future не может быть разрешено для типа», даже если я правильно импортирую пакет Java.util.Concurrent. *

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

...