내 제목은 아마도 가장 설명 적이 지 않지만 가능한 한 많은 코드를 표시하여 모든 사람들이 내 질문을 더 잘 이해할 수 있도록 노력하겠습니다. 내 프로젝트의 클라이언트 측에서 서버에 정보를 쿼리하는 방법은 다음과 같습니다.다른 요청을 차단하지 않고 소켓 입력을 청취하는 방법
이private String GENERATEGROUPKEY()
{
/* `out` is a PrintWriter using the sockets output stream */
out.println("GENERATEGROUPKEY");
try
{
/* `in` is a BufferedReader using the sockets input stream */
String response = in.readLine();
String[] temp = response.split(" ");
return temp[1];
}
catch (IOException ex)
{
return null; // throw connection error to client
}
}
내 문제는 언제든지, 서버 정보와 같은 소켓을 통해 클라이언트에 원치 않는 메시지를 보낼 수 있다는 것입니다 (채팅 클라이언트가 수신처럼 생각 : 이것은 일반적인 요청의 예입니다 메시지). 저의 실패한 아이디어는 우리가 다른 쿼리의 중간에 있지 않는 한 그러한 메시지를 수신하는 스레드를 만드는 것이 었습니다.하지만 그 스레드를 방해하더라도 메시지를 계속해서 보내야하기 때문에 실패했습니다. 클라이언트 쿼리로 이동했습니다. 여기
private String GENERATEGROUPKEY()
{
out.println("GENERATEGROUPKEY");
listenThread.interrupt(); // block listenThread from recieving response
try
{
String response = in.readLine();
String[] temp = response.split(" ");
listenThread = new PulseThread(in); // we're done, so allow
listenThread.start();
return temp[1];
}
catch (IOException ex)
{
listenThread = new PulseThread(in); // we're done, so allow
listenThread.start();
return null; // throw connection error to client
}
}
는 listenThread
가
public class PulseThread extends Thread
{
private BufferedReader in;
public PulseThread(BufferedReader in)
{
this.in = in;
}
@Override
public void run()
{
while (true)
{
if (Thread.currentThread().isInterrupted())
{
break;
}
try
{
String line = in.readLine();
System.out.println(line);
String[] params = line.split(" ");
if (params[0].equals("PULSED"))
{
NotificationManager.sendNotification("You have been pulsed!", "Pulsed by: " + params[1]);
}
}
catch (Exception ex)
{
}
}
}
}
내가 BufferedReader
의 중간에 스레드를 중단 '나는하지 않는 readLine()
와의 차단 호출하면 바로 차단 호출을 취소 할 것'이라는 인상을 이전했다 정확히 무엇 다른 일을 잘못하고있어.
도움을 주시면 감사하겠습니다.
편집 : 그래서이 문장 위에 단지 몇 줄 내 가정을 찾고 스레드를 방해하지 않는 것 같습니다 readLine()
취소합니다. 나는 인터럽트 스레드 아이디어가 없다고 생각합니다. 이 작업을 수행하는 올바른 방법은 무엇입니까?
함께, 오류 : [태그 : 멀티 스레딩]? 그리고 스레드가 인터럽트되면 I/O 작업이 취소 될 것입니다. – EJP
@EJP이 질문은 다중 스레드 질문이 아닙니까?합법적이고 고유 한 질문에 대한 -1이 적절한 지 확실하지 않지만 나는 빗나갑니다. Javadocs는 "인터럽트 가능 채널에서이 스레드가 I/O 작업에서 차단되면 채널이 닫힙니다."라고 말합니다. 이것은 나에게 적용되지 않습니까? 만약 내가해야 할 일을 모르고 있기 때문에 나는 가능한 해결책이 될 수 없다. – Headline
@Headline 실제 클래스에는 Java 클래스와 마찬가지로 [InterruptibleChannel] (https://docs.oracle.com/javase/8/docs/api/java/nio/channels/InterruptibleChannel.html)이 있습니다. BufferedReader *는 예외를 던질 수도 있지만 아무 것도하지 않으면 알 수 없습니다. – matt