Я изо всех сил пытался изменить свой код, чтобы успешно ждать ответа сокета на моем внешнем классе, но не смог этого сделать, я надеюсь, что вы можете помочь мне достичь того, чего я хочу.
Давайте получимЗапущено:
Это мой класс 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. *
Не могли бы вы помочь мне найти правильный способ достичь того, чего я хочу?Огромное спасибо