2016-09-16 3 views
0

이 연습 프로그램의 목적은 클라이언트가 입력 및 입력 키를 통해 입력 한 메시지 문자열을 계속해서 보내고 콘솔에 출력하도록 허용하는 것입니다. 처음으로 Server.java의 String messageFromClient = in.readLine();이 차단 된 것처럼 보입니다 (디버거가 나에게 나가는 것을 허용하지 않습니다). 그러나 "hello"와 같은 메시지를 보낸 후에는 더 이상 차단하지 않고 계속 실행됩니다.루프는 첫 번째 루프에서만 멈추고 무기한으로 계속 실행됩니다.

나는 이것을 두어 동안 조사해 왔지만 나는 해결책을 찾기에 적당한 장소를보고 있지 않을 것이라고 생각한다.

이 링크 Java InputStream blocking read은 내가 아마 도움이 될 수있는 가장 가까운 것입니다.

Client.java

import java.io.*; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.net.*; 
import java.net.InetAddress; 
import java.util.Scanner; 

public class Client { 
    static Socket connectionToServer; 
    public static void main(String[] args) { 
     try{ 
      connectionToServer = new Socket("192.168.1.66", 6969); 
      InetAddress inetAddress = connectionToServer.getInetAddress(); 
      System.out.print(
        "Connection successful" + 
        "Connected to " + inetAddress.getHostAddress() + 
        "at " + inetAddress.getHostName() + "\n" 
      ); 

      while(true) { 
       String input = System.console().readLine(); 
       OutputStreamWriter dOut = new OutputStreamWriter(connectionToServer.getOutputStream()); 
       dOut.write(input, 0, input.length()); 
       //dOut.flush(); 
       dOut.close(); 
      } 

     } catch (IOException exception){ 
      System.out.print("Failed to create socket"); 
     } 

    } 
} 

Server.java

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

public class Server { 
    public static void main(String[] args) { 
     ServerSocket serverSocket; 
     try { 
      serverSocket = new ServerSocket(6969); 
      System.out.print("Server is up and running \n"); 
     } catch (IOException exception){ 
      serverSocket = null; 
      System.out.print("Cannot create ServerSocket"); 
     } 

     while (true){ 
      try { 
       System.out.print("Waiting from client."); 
       Socket socket = serverSocket.accept(); 
       Thread newClientSocket = new Thread(new ServerThread(socket)); 
       newClientSocket.start(); 
       System.out.print("New thread created"); 
      } catch (IOException exception){ 
       System.out.print("Failed to create socket"); 
      } 
     } 
    } 
} 
//////////////////////////////////////////////////////////// 
class ServerThread implements Runnable{ 
    private Socket socket; 
    //constructor 
    ServerThread(Socket socket){ 
     System.out.print("I am a new thread"); 
     this.socket = socket; 
    } 

    public void run(){ 
     while(true){ 
      try{ 
       System.out.print("Waiting for input."); 
       InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream()); 
       BufferedReader in = new BufferedReader(inputStreamReader); 
       String messageFromClient = in.readLine(); 
       System.out.print(messageFromClient); 
      } catch (IOException exception) { 
       System.out.print(exception); 
       break; 
      } 
     } 
    } 
} 

답변

0

을, BufferedReader는 버퍼를 완전히 채우고 첫 번째 행의 끝을 넘어 읽을 가능성이 있기 때문에 - 읽고 난 후에 새로운BufferedReader을 구성하기 때문에 데이터가 손실됩니다. 그것의 첫번째 줄만.

루프에서 BufferedReader의 생성을 이동하면 도움이 될 것입니다. 또한 작업이 끝나면 소켓을 닫아야합니다. 당신이 그것을 닫으면, 당신은 더 이상 사용할 수 없기 때문에 송신 측에

public void run() { 
    try { 
     try { 
      InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream()); 
      BufferedReader in = new BufferedReader(inputStreamReader); 
      while (true) { 
       System.out.print("Waiting for input."); 
       String messageFromClient = in.readLine(); 
       System.out.print(messageFromClient); 
      } 
     } finally { 
      socket.close(); 
     } 
    } catch (IOException exception) { 
     System.out.print(exception); 
     // TODO: handle exception 
    } 
} 

, 당신은 모든 라인 소켓의 OutputStream에 닫지한다. Console.readLine() 메서드는 반환 값에 포함하지 않으므로 문자열 뒤에 서버에 개행 문자를 보내야합니다.

 OutputStreamWriter dOut = new OutputStreamWriter(connectionToServer.getOutputStream()); 
     while(true) { 
      String input = System.console().readLine() + "\n"; 
      dOut.write(input, 0, input.length()); 
     } 
     dOut.close(); 
0

Console.readLine는() 종료 문자가 포함되어 있지 않습니다. BufferedReader.readLine() 블록은 종단 개행 문자를

변경이 때까지 : 여기에

String input = System.console().readLine(); 

: 각 루프 반복을위한 새로운 BufferedReader를 구성하지 않아야

String input = System.console().readLine() + System.lineSeparator();