2015-01-17 3 views
0

클라이언트가 파일을 요청하고, 파일이 서버에 존재하면 서버가 파일을 보내고 확인 메시지를 보냅니다. 그래서 내가 주 동안 루프를 사용하여 입력을 먹고 싶어하지만, 첫 번째 반복 후 작동이 중지루프가 작동하지 않는 동안

클라이언트 측

import java.io.*; 
import java.net.*; 
import java.util.Scanner; 

public class WebClient { 

    public static void main(String[] args) throws Exception { 

     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 

     String req; 

     System.out.println("Do you want to search? (Y/N): "); 
     Scanner user_input = new Scanner(System.in); 

     req = user_input.next(); 

     while (req.equals("Y")) { 

      Socket clientSocket = new Socket("localhost", 2000); 

      System.out.println("Enter the file name: "); 

      String file = inFromUser.readLine(); 
      DataOutputStream serverOutput = new DataOutputStream(clientSocket.getOutputStream()); 

      serverOutput.writeBytes(file + '\n'); 

      BufferedReader serverInput = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

      System.out.println("Text from the file: "); 

      while (true) { 
       String data = serverInput.readLine(); 
       if (data == null) { 
        break; 
       } 
       System.out.println(data); 
      } 

      clientSocket.close(); 

      System.out.println("Do you want to search again? (Y/N): ");   
      req = user_input.next(); 


     } 

    } 

} 

어떤 도움을 이해할 수있을 것이다

import java.io.*; 
import java.net.*; 

public class WebServer { 

    public static void main(String[] args) throws Exception 
    { 
     ServerSocket welcomeSocket = new ServerSocket(2000); 
     while (true) 
     { 
      Socket connectionSocket = welcomeSocket.accept(); 

      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      String file = inFromClient.readLine(); 

      System.out.println("Client Request: " + file); //Show The Client Request File 

      String path = ("E://From Varsity//4.2//Lab//Network Programming//Java trying//New TCP-Client+Server//tcp")+ "/" + file ; 
      File objfile = new File(path); 

      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      if (objfile.exists()) 
      { 
       String readfile = rfile(path); 
       outToClient.writeBytes("\n" +readfile + "200 ok \n"); // when exact file find 
      } 
      else 
      { 
       outToClient.writeBytes("404 The Requested File not found \n"); // file not found 
      } 

     } 
    } 

    public static String rfile(String file_N) throws Exception 
    { 
     StringBuilder app = new StringBuilder(); 
     BufferedReader bufferR = new BufferedReader(new FileReader(file_N)); 
     try 
     { 
      String line = bufferR.readLine(); // read file from buffer 
      while (line != null) { 
       app.append(line); // append the line 
       app.append("\n"); 
       line = bufferR.readLine(); 
      } 
     } 
     finally 
     { 
      bufferR.close(); 
     } 
     return app.toString(); 
    } 
} 

서버 측 , 미리 감사드립니다

답변

2

java.net.Socket is blocking. 그것은 (더 많은 데이터를 사용할 수있을 때까지 내의 readLine() 호출 블록)가 가까운를받을 때까지 차단

3 솔루션 수 있습니다 :

간단한 : 쓰기 후 outToClient.close()를 추가합니다.

비 차단 : 사용 java.nio.SocketChannel/java.nio.ServerSocketChannel

스레드 : 새 스레드를 (가) 동의에서 Socket 객체로 발사 때마다 ServerSocket.accept을 만듭니다.

+1

나는 exacly를 쓰려고했다. +1. :) –

+0

당신이 자세히 설명해 주시겠습니까 간단하게 솔루션을 ??? 다음을 정의하십시오. "작성 후" – IS2057

관련 문제