2011-04-25 3 views
0

서버루프 후 클라이언트 서버 프로그램이 멈 춥니 다?

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.ArrayList; 


public class Client implements Runnable { 
    static final int PORT = 4444; //Change this to the relevant port 
    static final String HOST = "192.168.0.53"; //Change this to the relevant HOST,//(where Server.java is running) 

    public void run() { 

     try { 
      System.out.print("Sending data...\n"); 
      Socket skt = new Socket(HOST, PORT); 

      File fil=new File("D:/a.txt"); 
      String FileName=fil.getName(); 

      //Send required data Strings to Server 
      PrintWriter out2 = new PrintWriter(new BufferedWriter(new OutputStreamWriter(skt.getOutputStream())),true); 
      out2.println(FileName);   

      ArrayList Printers =new ArrayList(); 
      InputStream inStream = skt.getInputStream(); 
      BufferedReader inm = new BufferedReader(new InputStreamReader(inStream)); 

      while ((inm.read()) != -1) { 
       Printers.add(inm.readLine()); 

      } 
      //Create a file input stream and a buffered input stream. 
      FileInputStream fis = new FileInputStream(fil); 
      BufferedInputStream in = new BufferedInputStream(fis); 
      BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream()); 

      //Read, and write the file to the socket    
      int i; 
      while ((i = in.read()) != -1) { 
       out.write(i); 
       System.out.println(i); 
      } 

      //Close the socket and the file 
      out.flush(); 
      out.close(); 
      in.close(); 
      skt.close(); 

     } 
     catch(Exception e) {   
      System.out.print("Error! It didn't work! " + e + "\n"); 
     } 
    } 

    public static void main(String [] args){ 

     Thread cThread =new Thread(new Client()); 
     cThread.start(); 
    } 
} 

코드는 내가 서버 progarm를 중지 할 때 코드가 전체 실행 왜? 클라이언트 측 ??에서 while 루프에서 프린터 목록을받은 후 중지

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

import javax.print.PrintService; 
import javax.print.PrintServiceLookup; 


public class GetFileServer implements Runnable { 

    public static final int SERVERPORT = 4444; 
    public String FileName=null; 
    public void run() { 
     try { 
      ServerSocket svr=new ServerSocket(SERVERPORT); 
      while(true){ 
       System.out.println("S: Waiting..."); 

       Socket sktClient=svr.accept(); 
       System.out.println("S: Receiving..."); 
       try{ 

        PrintService services[] = 
         PrintServiceLookup.lookupPrintServices(null, null); 

        PrintWriter out2 = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sktClient.getOutputStream())),true); 

        for(int z=0;z<services.length;z++){ 

         out2.println(services[z]); 
        } 

        //Get All Required Strings 
        InputStream inStream = sktClient.getInputStream(); 
        BufferedReader inm = new BufferedReader(new InputStreamReader(inStream)); 
        String fileName = inm.readLine(); 


        //Read, and write the file to the socket 
        BufferedInputStream in = new BufferedInputStream(sktClient.getInputStream());   
        int i=0;      
        File f=new File("D:/data/"+fileName); 
        if(!f.exists()){ 
         f.createNewFile(); 
        } 
        FileOutputStream fos = new FileOutputStream("D:/data/"+fileName); 
        BufferedOutputStream out = new BufferedOutputStream(fos); 

        while ((i = in.read()) != -1) { 
         System.out.println(i); 
         out.write(i); 
         System.out.println("Receiving data..."); 
        } 

        out.flush(); 
        in.close(); 
        out.close(); 
        sktClient.close();   
        System.out.println("Transfer complete."); 

       File inp = new File("D:/data/"+fileName); 
      // PrintFile.fileToPrint(inp); 
       } 
       catch(Exception e){ 

        e.printStackTrace(); 
       } 
      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String [] args){ 

     Thread servThread =new Thread(new GetFileServer()); 
     servThread.start(); 
    } 
} 

클라이언트 측.

답변

1

아마도 out2.println(services[z]);으로주기가 끝나면 서버 측에서 out2 작가 (또는 플러시)를 종료하지 않았기 때문일 수 있습니다.

작성자는 데이터를 전달할 때 즉시 데이터를 보내지 않고 대신 데이터를 캐시에 저장하고 적절한 순간을 기다립니다. 그런 다음 서버는 클라이언트로부터의 입력을 기다리고 당신은 일종의 데드 록을 얻는다.

+0

실망 !!! – Harinder

3

클라이언트는 첫 번째 while 루프에서 스트림이 닫힐 때까지 서버에서 읽습니다. 서버는 결코 스트림을 닫지 않으므로 서버가 더 이상 아무 것도 말하지 않더라도 클라이언트는 계속 시도하고 읽습니다. 그래서 읽기를위한 호출은 영원히 기다립니다.

서버 측에서 스트림을 닫거나 서버에서 클라이언트로 전체 문자열 목록을 전송해야합니다. 즉, "END"와 같은 일부 제어 문자열이 전송됨을 나타냅니다. 또는 뭔가.

클라이언트와 서버 간의 통신을 비동기 적으로 수행하면 이러한 종류의 종속성이 없으므로 이런 종류의 교착 상태와 같은 문제가 발생할 수 있습니다.

관련 문제