필자는 클라이언트가 먼저 통신하고 서버가 응답하면서 앞뒤로 작동하는 다중 스레드 클라이언트 - 서버 시스템을 보유하고 있습니다.Java - 사용자가 입력을 계속하기 전까지 InputStream을 읽으려면 어떻게 루프합니까?
그러나 두 개의 특정 클라이언트의 경우 사용자가 입력 할 때 진행하기 전에 입력 스트림에 데이터가 있는지 여부를 지속적으로 확인해야합니다.
프로그램은 주차장 관리 시스템입니다. 주차장이 가득 차고 (0 개의 공간이 있음) 입구 차량에 차가 도착하면, 시스템은 입국을 기다리는 고객 대기열을 형성합니다. 자동차가 주차장을 떠나면 대기열의 첫 번째 클라이언트가 제거되고 해당 특정 입구 클라이언트에 대한 BlockingQueue에 추가됩니다. 각 입구 클라이언트에 대해 직접 출력 출력 스트림을 만들었습니다. 따라서 BlockingQueue가 비어 있지 않으면 데이터는이 큐에서 가져오고 출력은 해당 특정 클라이언트의 스트림으로 전송됩니다.
그러나 문제는 큐에있는 입구 클라이언트가 자동으로 InputStream을 읽고 액세스 권한을 부여하기 위해 데이터를 인쇄하지만 대신 오류가 발생하고 충돌합니다. 나는 시스템이 처음 시작될 때 클라이언트가 처음에는 존재하지 않는 데이터를 읽으려고 기다리는 걸 멈췄다 고 생각합니다. 이는 첫 번째 단계에서 일종의 입력이 필요하기 때문에 오류가 발생합니다.
클라이언트가 입력 스트림을 읽거나 인쇄하도록 "큐"라는 단어가 포함 된 특정 데이터이든간에 입력 스트림을 읽고 인쇄 할 수 있도록 수정하려면 어떻게해야합니까? 사용자가 입력하는 경우 계속 사용할 수있는 데이터가있는 경우.
나는 이것이 의미가 있기를 바란다. 가능한 한 명확하게하려고 노력했다.
서버 클래스 :
public class Server {
public static void main(String[] args) throws IOException {
//Create the shared objects in the global scope...
int groundFloor = 0; //SET TO 0 FOR TESTING
int firstFloor = 0;
SharedState SharedStateObject = new SharedState(groundFloor,firstFloor);
//Sets up the server socket on port 4444
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(4444);
System.out.println("Car Park Server started." + "\n");
}
catch (IOException e) {
System.err.println("Could not start server on specified port.");
System.exit(-1);
}
//Got to do this in the correct order with only four clients!
ServerThread GroundFloorEntrance = new ServerThread(serverSocket.accept(), "GroundFloorEntrance", SharedStateObject);
ServerThread FirstFloorEntrance = new ServerThread(serverSocket.accept(), "FirstFloorEntrance", SharedStateObject);
ServerThread GroundFloorExit1 = new ServerThread(serverSocket.accept(), "GroundFloorExit1", SharedStateObject);
ServerThread GroundFloorExit2 = new ServerThread(serverSocket.accept(), "GroundFloorExit2", SharedStateObject);
GroundFloorEntrance.start();
FirstFloorEntrance.start();
GroundFloorExit1.start();
GroundFloorExit2.start();
serverSocket.close();
//Loop for granting queued clients access
while(true)
{
BlockingQueue<String> queuedGroundAccess = SharedStateObject.getQueuedGround();
BlockingQueue<String> queuedFirstAccess = SharedStateObject.getQueuedFirst();
if(!queuedGroundAccess.isEmpty())
{
Socket clientSocket = GroundFloorEntrance.clientSocket();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
try
{
out.println(queuedGroundAccess.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(!queuedFirstAccess.isEmpty())
{
Socket clientSocket = FirstFloorEntrance.clientSocket();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
try
{
out.println(queuedFirstAccess.take());
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
클라이언트
public class GroundFloorEntrance {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
// Set up the socket, in and out variables
Socket clientSocket = null;
PrintWriter out = null;
BufferedReader in = null;
int port = 4444;
String serverName = "localhost";
String clientID = "Ground Floor Entrance";
try {
clientSocket = new Socket(serverName, port);
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + serverName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: "+ port);
System.exit(1);
}
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer = null;
String fromUser = null;
System.out.println("Initialised " + clientID + " client and IO connections");
//I THINK THE ISSUE IN THE FOLLOWING STRUCTURE:
while (true) {
fromServer = in.readLine();
if(fromServer != null && fromServer.contains("Queue: "))
{
System.out.println(fromServer);
}
fromUser = stdIn.readLine();
if (fromUser != null) {
out.println(fromUser);
}
fromServer = in.readLine();
System.out.println(fromServer);
}
}
}
'오류 발생 및 오류'는 문제가되지 않습니다. – EJP