2012-02-16 4 views
11

간단한 클라이언트 서버 프로그램이 있습니다. 서버는 여러 클라이언트의 연결을 받아 들일 수 있습니다. 현재 이것은 내 고객에게 일어나는 일입니다.
1) 클라이언트에 LIST를 입력하십시오. 서버는 현재 디렉토리의 모든 파일을 클라이언트로 다시 보냅니다. 2) 클라이언트에 "Hello"를 입력하십시오. 서버는 "Hello"를 다시 보내야합니다. 그러나 클라이언트에서 클라이언트는 공백을 읽습니다.
클라이언트에 "QUIT"를 입력합니다. Hello 메시지를 서버에서 다시 볼 수 있습니다.
서버가 다시 보낸 후 클라이언트가 Hello 메시지를 읽지 않는 이유를 알 수 없습니다.클라이언트 소켓을 서버 소켓에서 데이터를 기다리는 방법

클라이언트 코드

import java.net.*; // Contains Socket classes 
import java.io.*; // Contains Input/Output classes 
import java.nio.CharBuffer; 

class ClntpracticeSandbox{ 

    public static void main(String argv[]){ 


    try{ 
//  
     Socket client=new Socket("localhost", 7777); 
     System.out.println("Connected to server " + client.getInetAddress() 
      + ": " + client.getPort()); 
     System.out.println("local port is " + client.getLocalPort()); 

     BufferedReader kbreader; 
     BufferedWriter writer; 
     BufferedReader reader; 

     kbreader = new BufferedReader(new InputStreamReader(System.in)); 
     writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
     reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 

     String data = "", datakb, line=null; 

     do{ 
      System.out.print("Text to the server? "); 
      datakb = kbreader.readLine(); 
      writer.write(datakb); 
      writer.newLine(); 
      writer.flush(); 

      System.out.print("Received from the Server: "); 
      line = reader.readLine(); 
      while (line.equals("")==false){ 
       System.out.println(line); 
       line = reader.readLine(); 
      } 
     } while (datakb.trim().equals("QUIT")==false);   
     client.close(); 
     System.exit(0); 

     }catch(Exception e){ 
      System.err.println("Exception: " + e.toString()); 
     } 
    } 
} 

서버 코드

import java.net.*; // Contains Socket classes 
import java.io.*; // Contains Input/Output classes 
import java.nio.file.*; 

class SrvrpracticeSandbox{ 
    public static void main(String argv[]) throws IOException { 
     ServerSocket s = new ServerSocket(7777); 

     System.out.println("Server waiting for client on port " + s.getLocalPort()); 
     int count = 0; 
     do { 
      count = count + 1; 
      Socket connected = s.accept(); 
      new clientThread(connected, count).start(); 
     } while (true); 

    } 
} 

class clientThread extends Thread { 

    Socket myclientSocket = null; 
    int mycount; 
    DataInputStream is = null; 
    PrintStream os = null; 


    public clientThread(Socket clientSocket, int count) { 
     this.myclientSocket = clientSocket; 
     this.mycount = count; 
    } 

    public void run() { 
     try { 

      System.out.println("New connection accepted " + myclientSocket.getInetAddress() + ": " + myclientSocket.getPort()); 

      BufferedReader reader; 
      BufferedWriter writer; 

      reader = new BufferedReader(new InputStreamReader(myclientSocket.getInputStream())); 
      writer = new BufferedWriter(new OutputStreamWriter(myclientSocket.getOutputStream())); 

      String data; 
      String testdirectory = "file1.txt\nfile2.txt\nfile3.txt"; 
      do{ 
       data = reader.readLine(); 
       System.out.println("Received from " +mycount + ":" + data); 
       if (data.equals("LIST")) { 
        writer.write(mycount + "\n"+"150 - Transfer Initiated."+"\n"+ 
          "DATA " +returnDirectoryList().getBytes().length + "\n" + 
          returnDirectoryList() + "\r\n"); 
       } else { 
        writer.write("Server Echos to " + mycount + ":"+ data + "\n"+"This is a new line."+"\r\n"); 
       }     
       writer.newLine(); 
       writer.flush(); 

      }while (data.equals("QUIT") == false); 

      myclientSocket.close(); 
      System.exit(0); 
     } catch (IOException ex) { 
     } 
    } 
    private String returnDirectoryList() 
    { 
     String files = ""; 
     Path dir = Paths.get("."); 
     try { 
      DirectoryStream<Path> stream = 
      Files.newDirectoryStream(dir); 
      for (Path file: stream) { 
       files = files + file.getFileName() +"\n"; 
      } 
     } catch (IOException | DirectoryIteratorException x) { 
      System.err.println("returnDirectoryList "+x.toString()); 
     } 
     return files;   
    } 
} 

답변

0

당신은 서버에 모든 명령을 전송하고 서버는 특별한 명령으로, 다른 모든이에 의해 처리 될 것 "LIST"를 찾습니다 "에코"부분.

if (data == null) { 
    continue; 
} 
if (data.equals("LIST")) { 
    writer.write(mycount + "\n" + "150 - Transfer Initiated." + "\n" + 
    "DATA " + returnDirectoryList().getBytes().length + "\n" + 
    returnDirectoryList() + "\r\n"); 
} else { 
    writer.write("Server Echos to " + mycount + ":" + data + "\n" + "This is a new line." + "\r\n"); 
} 

난 당신의 코드를 시도하고 위의 작은 변화 (나는 NPE를 가지고 있기 때문에) 및 출력 보이는

서버 측

같은 :

Server waiting for client on port 7777 
New connection accepted /127.0.0.1: 52889 
Received from 1:peter 
Received from 1:LIST 

클라이언트 측 :

Connected to server localhost/127.0.0.1: 7777 
local port is 52889 
Text to the server? peter 
Received from the Server: Server Echos to 1:peter 
This is a new line. 
Text to the server? LIST 
Received from the Server: 1 
150 - Transfer Initiated. 
DATA 6 
Files 
Text to the server? 

예상되는 동작이 아닙니까?

+0

안녕하세요, 필자는 클라이언트가 QUIT를 보낼 때까지 서버가 클라이언트의 요청을 계속 처리하기를 원합니다. 주요 문제는 클라이언트가 서버에서 요청을 읽을 때 클라이언트 측에서 발생합니다. 클라이언트에서 보낸 QUIT를 제외한 요청의 경우 클라이언트는 서버에서 ""읽습니다. – shresthaal

+0

위의 코드 및 출력보기 –

-1

clientThread의 실행 방법에서 System.exit(0); 문이 문제입니다.

하나의 클라이언트를 서비스 한 후 시스템이 종료되고 있습니다.

8

죄송합니다. 영어로 말하지 않습니다. 내 첫 번째 답변입니다. 서버 응답을 기다리십시오.

do{ 
     System.out.print("Text to the server? "); 
     datakb = kbreader.readLine(); 
     writer.write(datakb); 
     writer.newLine(); 
     writer.flush(); 

     System.out.print("Received from the Server: "); 

     DataInputStream dataInputStream = new DataInputStream(client.getInputStream()); 

     int attempts = 0; 
     while(dataInputStream.available() == 0 && attempts < 1000) 
     { 
      attempts++; 
      Thread.sleep(10) 
     } 

     reader = new BufferedReader(dataInputStream); 
     line = reader.readLine(); 

     while (line.equals("")==false){ 
      System.out.println(line); 
      line = reader.readLine(); 
     } 
    } while (datakb.trim().equals("QUIT")==false);   
    client.close(); 
    System.exit(0); 

    }catch(Exception e){ 
     System.err.println("Exception: " + e.toString()); 
    } 
    ... 
관련 문제