클라이언트 클래스와 서버 클래스가 있습니다. 클라이언트가 서버에 메시지를 보내면 서버는 클라이언트에 응답을 보내고 클라이언트는받은 모든 메시지를 인쇄합니다. 예를 들어Java 서버 클라이언트의 readLine() 메소드
, 클라이언트가 서버에 "A"를 보내는 경우
, 다음 서버는 "1111"클라이언트 에 응답을 보냅니다. 그래서 클라이언트 클래스에서 readLine()을 사용하여 서버에서 메시지를 읽은 다음 클라이언트에서 "1111"을 콘솔에 인쇄합니다.
클라이언트가 서버에 "B"를 보내면 서버가 클라이언트에게 응답을 보냅니다. "2222 \ n 3333". 따라서 클라이언트에서 예상되는 인쇄 출력은 다음과 같습니다
"2222"
"3333"
그래서 서버에서 클라이언트로 응답 메시지는 클라이언트에서 보내는 메시지에 따라 1 개 라인 2 개 라인을 가질 수있다 서버에.
제 질문은 어떻게 readLine()을 사용하여 서버에서 클라이언트로 보내는 메시지를 읽을 수 있는지입니다. 보다 구체적으로, 나는 다음과 같은 코드를 사용하는 경우,
String messageFromServer;
while((messageFromServer = inputStreamFromServer.readLine()) != null) {
println(messageFromServer);
}
그것은 첫 번째 라인을 출력합니다, 나는 내의 readLine()는 것이다 그것은 일단 정지하기 때문에, 클라이언트에서 서버로 메시지를 보내는 유지하더라도 아무것도 인쇄되지 않습니다 첫 번째 줄을 읽었습니다.
업데이트 : 이보다 구체적으로는, 내가 한 번에 서버에서 하나 또는 여러 줄이 포함 된 메시지를 읽을 수있는 클라이언트 클래스에 몇 가지 방법을 찾고 있어요. 서버에서 클라이언트로 보낸 메시지의 형식을 변경하고 싶지 않은 경우 클라이언트 측에서이 작업을 수행 할 수있는 방법이 있는지 궁금합니다. 나는 몇 가지 샘플 코드를 넣어 것입니다
갱신이 내 질문이 더 명확하게하려면, 다음
이 서버입니다 :
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(1234);
} catch (IOException e) {
System.err.println("Could not listen on port: 1234.");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
}
System.out.println("Connected");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String textFromClient =null;
String textToClient =null;
textFromClient = in.readLine(); // read the text from client
if(textFromClient.equals("A")){
textToClient = "1111";
}else if (textFromClient.equals("B")){
textToClient = "2222\r\n3333";
}
out.print(textToClient + "\r\n"); // send the response to client
out.flush();
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
클라이언트 :
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
try {
socket = new Socket("localhost", 1234);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection");
}
System.out.println("Connected");
String textToServer;
while((textToServer = read.readLine())!=null){
out.print(textToServer + "\r\n"); // send to server
out.flush();
String messageFromServer =null;
while((messageFromServer = textToServer=in.readLine()) != null){
System.out.println(messageFromServer);
}
}
out.close();
in.close();
read.close();
socket.close();
}
private static void debug(String msg)
{
System.out.println("Client: " + msg);
}
}
서버 코드와 클라이언트 코드를 게시했습니다. 이것을 봐주세요. – Joey
몇 가지 컴파일러 오류를 수정해야했지만 버그가있는 부분은'if (textFromClient == "A")'및'if (textFromClient == "B")'부분입니다. 그것들은'if ("A".equals (textFromClient))와 if ("B".equals (textFromClient))'로 변경 될 필요가있다. 그런 다음 원래의 게시물에서했던 것처럼 반복적으로 하나의 readLine() 호출 인'System.out.println (in.readLine());'을 대체했습니다 : while ((messageFromServer = inputStreamFromServer.readLine())! = null)'예상대로 작동했습니다. 클라이언트에서 "B"를 보내면 서버가 2 개의 예상 줄을 보냈습니다. – Blake
위의 수정 된 수업을 포함하도록 지금 내 대답을 편집했습니다. – Blake