소켓을 사용하는 양방향 통신 프로그램을 작성 중입니다. 클라이언트 프로그램은 사용자에게 옵션을 제공합니다. 옵션을 선택하면 서버 프로그램에 의해 처리되고 결과가 다시 클라이언트 프로그램에 반환됩니다. 당신이 볼 수 있듯이 내 조건문 안에 넣으면 PrintWriter 문을 처리하지 않기 때문에 서버 프로그램에 문제가 있습니다.Java 소켓 프로그램의 PrintWriter
클라이언트 :
Socket socket = null;
try
{
System.out.println("Connecting to Server");
socket = new Socket("192.168.0.104", 7003);
socket.setSoTimeout(10000);
System.out.println("Connected");
DataOutputStream os = new DataOutputStream(socket.getOutputStream());
InputStreamReader userInput = new InputStreamReader(System.in);
BufferedReader userBuffer = new BufferedReader(userInput);
InputStreamReader serverInput = new InputStreamReader(socket.getInputStream());
BufferedReader serverBuffer = new BufferedReader(serverInput);
PrintWriter print = new PrintWriter(socket.getOutputStream(), true);
System.out.println("Option 1");
System.out.println("Option 2");
System.out.println("Option 3");
String userOption = userBuffer.readLine();
os.writeBytes(userOption);
if (userOption.equals("1"))
{
String line = serverBuffer.readLine();
System.out.println(line);
}
System.out.println("Closing Client Connection");
serverBuffer.close();
serverInput.close();
print.close();
socket.close();
os.close();
System.exit(0);
}
서버 :
ServerSocket serverSock = null;
Socket standSock = null;
try
{
serverSock = new ServerSocket(7003);
standSock = serverSock.accept();
InputStreamReader input = new InputStreamReader(standSock.getInputStream());
BufferedReader read = new BufferedReader(input);
PrintWriter print = new PrintWriter(standSock.getOutputStream(), false);
String dateTime = (Calendar.getInstance()).getTime().toString();
if (read.readLine().equals("1"))
{
System.out.println("Option 1");
print.println("You're connected to the Server at: " + dateTime);
}
System.out.println("Closing Server Connection");
read.close();
input.close();
print.close();
standSock.close();
}
나는 클라이언트 프로그램에서 사용자 입력을 테스트 한하고 올바르게를 받고,하지만 난
print.println("You're connected to the Server at: " + dateTime);
를 이동하는 경우 문제가
조건문 안에 프로그램이 멈추고 결국 타임 아웃됩니다. 조건문 밖에서는 작동하지 않습니다. 조건문에 넣으면 왜 작동하지 않을까요?
버퍼되지 않은 DataOutStream이 아니라 송신을 지연시키는 것은 PrintWriter입니다. – EJP
DataWindow가 버퍼링되지 않고 PrintWriter가 기본적으로 연기되지만 PrintWriter 객체의 생성자에서 autoflush를 true로 설정할 때가 아니라는 것에 동의합니다. –