2017-12-17 7 views
0

매우 기본적인 클라이언트 - 서버 응용 프로그램에도 문제가 있습니다. 클라이언트가 데이터를 보내지 않거나 서버가 수신하지 않습니다. 나는 문제가 어디 있는지 이해할 수 없다. 나는 심지어 내가 소켓에 대해 아무 것도 이해하지 못했다고 생각하기 시작했다.클라이언트가 서버에 데이터를 보내지 않습니다.

public class Server 
{ 
public static void main(String args[]) 
{ 
    try{ 
     ServerSocket serverSocket = new ServerSocket(3000); 

     Socket socket = serverSocket.accept(); 

     System.out.println("Client connected: "+socket.getInetAddress.toString()); 

     Scanner scanner = new Scanner(socket.getInputStream()); 

     while(true) 
     { 
      System.out.println(scanner.nextLine()); 
     } 
    }catch(IOException e) 
    { 
     System.out.println("error"); 
    } 
} 
} 

이 클라이언트 코드 :

는 서버 코드 나는 모두가 동일한 시스템에서 실행하는 경우

public class Client 
{ 
public static void main(String args[]) 
{ 
    Socket socket; 
    PrintWriter printWriter; 


    try { 
     socket = new Socket("127.0.0.1", 3000); 
     printWriter = new PrintWriter(socket.getOutputStream(), true); 

     while(true) 
     { 
      printWriter.write("frejwnnnnnnnnnnnnnnnnnnnnnnnnosfmxdawehtcielwhctowhg,vort,hyvorjtv,h"); 
      printWriter.flush(); 
     } 

    }catch(IOException e) 
    { 
     System.out.print("error\n"); 
    } 

} 
} 

이 서버 인쇄가 제대로 "클라이언트가 연결이 .... . "하지만 더 이상 인쇄하지 않습니다.

무엇이 문제입니까?

답변

1

서버는 다음 라인을 읽습니다. 클라이언트는 줄 끝을 보내지 않습니다. 그래서 서버는 라인이 끝나야한다는 것을 알 수 없으며 스트림에서 EOL을 찾을 때까지 차단합니다. 또는 클라이언트가 소켓을 닫을 때까지.

0

클라이언트 코드에서 출력 스트림을 PrintWriter으로 꾸미므로 println을 사용할 수 있습니다. (의 PrintWriter 생성자에서 TRUE) 요청의 autoflush이 있기 때문에

printWriter.println("frejwnnnnn...rjtv,h"); 

세척 쓸모 기준 :

printWriter.write("frejwnnnnn...rjtv,h"); 
printWriter.flush(); 

교체 .

서버 코드에서

, 당신은 스캐너 대신 BuffererdReader 데코레이터를 사용할 수 있습니다

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String inputLine; 
while ((inputLine = br.readLine()) != null) { 
    System.out.println(inputLine); 
}