2014-04-14 2 views
2

간단한 socket/serversocket 예제를 얻으려고합니다. 그러나 클라이언트와 서버 모두 BufferedReader이 읽으려고 할 때 응답하지 않습니다.Java 클라이언트/서버가 Socket/ServerSocket을 통해 통신하지 않습니다.

서버에

package picturePerfect; 
--imports-- 

public class PictureServer implements Runnable{ 
static ServerSocket serverSocket; 

public static void main(String[] args) throws IOException { 
    serverSocket = new ServerSocket(2342); 
    Thread firstSessionThread = new Thread(new PictureServer()); 
    firstSessionThread.start(); 
} 

@Override 
public void run() { 
    Socket socket = null; 
    try { 
     socket = serverSocket.accept(); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String clientRequest = bufferedReader.readLine(); 
     System.out.println(clientRequest); 
     PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
     printWriter.println("Sent from server!"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
} 

}

CLIENT

package picturePerfect; 
--imports-- 

public class PictureClient { 
    public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException { 
     Socket socket = new Socket("localhost", 2342); 
     PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
     printWriter.write("Sent from client!"); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String response = bufferedReader.readLine(); 
     System.out.println(response); 
     socket.close(); 
    } 
} 

이 내 코드를 단순화 할 수있는 barest입니다 : 여기에 각각의 코드입니다. 내가 따라 왔던 샘플 프로그램이 거의 동일하게 보인다. 이 샘플 서버와 클라이언트 ( 작업을 수행하는 것이)입니다 :

SAMPLE 서버에

--imports-- 

public class Server implements Runnable{ 
    static ServerSocket ss; 

    public static void main(String[] args) throws IOException { 
     ss = new ServerSocket(3142); 
     Thread thread = new Thread(new Server()); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     while (true) { 
      Socket s = null; 

      try { 
       s = ss.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
       String operands = br.readLine(); 
       System.out.println(operands + " was received"); 
       PrintWriter pw = new PrintWriter(s.getOutputStream(), true); 
       pw.println(operands + " right back!"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

나는에 while 루프를 넣어 시도했습니다

--imports-- 

public class Server implements Runnable{ 
    static ServerSocket ss; 


    public static void main(String[] args) throws IOException { 
     ss = new ServerSocket(3142); 
     Thread thread = new Thread(new Server()); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     while (true) { 
      Socket s = null; 

      try { 
       s = ss.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
       String operands = br.readLine(); 
       System.out.println(operands + " was received"); 
       PrintWriter pw = new PrintWriter(s.getOutputStream(), true); 
       pw.println(operands + " right back!"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

샘플 클라이언트 내 서버와 내 클라이언트와 서버를 기본 패키지로 이동했지만 어느 것도 도움이되지 않았습니다. 또한 readLine() 대신 read()을 사용하고 \r\n이라는 printWriter의 줄을 끝내려고했지만 그곳에서 실패로 끝났습니다.

특히 샘플 코드가없는 경우 코드가 readLine()에 멈추는 이유는 무엇입니까?

+0

Windows를 사용하는 경우 http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx에서 TCPView를 확인하여 포트/프로세스에서 보내고받는 패킷을 모니터링하십시오.몇 주 전에 자바로 서버/클라이언트 애플리케이션을 만들었을 때 표시기 오류나 네트워크 오류인지를 확인하는 데 꽤 유용했습니다. – Matthew

+0

오, 멋지다! 나는 그것을 여기에서 필요로하지 않고 끝내었다. 그러나 그것은 내가 할 다음 프로젝트에 유용 할 것이다. 감사! –

답변

2

무엇을 readline()은 새로운 줄 문자가 나타날 때까지 대기하므로 readLine()을 반환합니다.

클라이언트에서는 새 줄을 쓰지 않습니다. 당신은 사용 : 당신이 당신의 마사지 후 라인 분리를 추가 할 필요가 있으므로

printWriter.write("Sent from client!"); 

대신,

printWriter.println("Sent from client!"); 
+1

오 이런. 나는 나의 기초 (하하)를 재 학습하러 갈 필요가있는 것처럼 느낀다. 감사! 가끔씩 또 다른 쌍의 눈이 필요하다고 생각해보십시오. : P –

2

서버 라인을 읽을 기대에 println을 사용하여 스트림에 개행 문자를 작성합니다. 의 PrintWriter에서의 autoflush이 printlnprintf, 또는 format을 작동하기 때문에

printWriter.println("Sent from client!"); 
//   ^^^^^^^ 

또는

printWriter.write("Sent from client!"+System.lineSeparator()); 
printWriter.flush(); 

당신은 flush 자신이 필요합니다 클라이언트 사용이 대신

printWriter.write("Sent from client!"); 

을 수행하려면, write 방법이 아님

+0

고마워요! 나는 다른 사람들에게 때때로 그것을보아야한다고 생각한다. 하하. –

+0

대부분의 SO 질문의 이야기 :) 어쨌든 내가 도울 수있어서 기쁩니다. – Pshemo

관련 문제