2012-06-11 5 views
4

나는 첫 번째 소켓 서버를 작성하려고 노력 중이므로 매우 간단한 것으로 시작하기로 결정했다. 흐름을 이해하기 위해 :) 간단한 자바 에코 서버를 작성하고 있지만, 그것은 (어떤 이유로?!) 요청이 서버에서 수신되었지만 클라이언트에서 서버 응답을 얻지 못합니다.간단한 자바 에코 서버 문제

package poc.client; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class Client { 
    public static void main(String[] args) { 
     try { 
      final Socket socket = new Socket((String) null, 50000); 

      final BufferedReader reader = new BufferedReader(
        new InputStreamReader(socket.getInputStream())); 
      final PrintWriter writer = new PrintWriter(
        socket.getOutputStream(), true); 
      writer.println("ala bala\r\n"); 
      writer.flush(); 
      writer.close(); 

      System.out.println(reader.readLine()); 
      System.out.flush(); 
     } catch (Exception ex) { 
       Logger.getAnonymouseLogger().throwing(TAG, "main", ex); 
     } 

    } 
} 

그리고 나는 등 모든 오라클 기본 소켓 튜토리얼을 읽기 /하지만 난 그냥 뭐가 잘못 알아낼 수 없습니다

package poc.server; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server { 

    /** 
    * debugging purposes only 
    */ 
    @SuppressWarnings("unused") 
    private static final String TAG = Server.class.getSimpleName(); 

    public static void main(String[] args) { 
     try { 
      final ServerSocket socket = new ServerSocket(50000); 
      while (true) { 
       final Socket clientSocket = socket.accept(); 
       final BufferedReader reader = new BufferedReader(
         new InputStreamReader(clientSocket.getInputStream())); 
       final PrintWriter writer = new PrintWriter(clientSocket 
         .getOutputStream(), true); 

       writer.println(reader.readLine()); 
       writer.flush(); 
       writer.close(); 
      } 
     } catch (IOException e) { 
       Logger.getAnonymouseLogger().throwins(TAG, "main",ex); 
     } 

    } 
} 

서버 부분은 - 나는 성공적으로 서버 소켓에 쓰고 있어요하지만 응답을 얻을 수없는 것 같습니다.

+2

예외를 무시하면 안됩니다. 마치 눈을 가리고 차를 운전하려고하는 것과 같습니다. –

+0

클라이언트의 IP 주소를 가져 오는 서버 코드에서 어디에도 보이지 않습니다. – Chad

+0

@HovercraftFullOfEels 패키지 이름이 제안하는 바에 따르면이 코드는 실제 코드가 아니며 PoC입니다. 그래도 조언 주셔서 감사합니다. – asenovm

답변

2

소켓에서 읽기 전에 라이터를 닫지 마십시오. 코드에 이어 close() 메소드의 javadoc는 당으로

final Socket socket = new Socket((String) null, 50000); 

      final BufferedReader reader = new BufferedReader(
        new InputStreamReader(socket.getInputStream())); 
      final PrintWriter writer = new PrintWriter(
        socket.getOutputStream(), true); 
      writer.println("ala bala\r\n"); 

      System.out.println(reader.readLine());    
      //writer.flush(); 
      writer.close(); 

작동 :

이 스트림을 닫아 그와 관련된 모든 system resource를 해방합니다. 이전에 닫힌 스트림을 닫은 것은 효과가 없습니다.

스트림을 닫으면 기본 소켓도 닫힌 것처럼 보입니다. 현재 코드에서 스택 추적을 인쇄하여이를 확인할 수 있습니다. 그것은 java.net.SocketException: socket closed 오류를 제공합니다.

+0

오, 내가 바보 같아, 10 배. – asenovm

0

대신을 시도해보십시오

Socket socket = new Socket(InetAddress.getLocalHost(), 50000); 

은 또한 점에 유의, 당신은 PrintWriter 생성자의 두 번째 매개 변수에 true를 통과 할 때 당신이 그것을 자동 세척 스트림을 만들기 때문에 writer.flush(); 필요가 없다.

+0

동일 :/플러시 메모를 보내 주셔서 감사합니다. 스트림을 플러시하지 않았기 때문에 아닌지 확인하고 싶습니다. 서버 소켓에 write 할 수 있습니다. 서버에 reader.readLine()을 기록하면 올바른 결과가 나오므로 소켓이 올바르게 생성됩니다. 응답을받을 수 없습니다. 클라이언트는 전송 후 종료됩니다. 요청. – asenovm

+0

@asenovm'System.out.println (reader.readLine());'의'readLine()'메서드에서 반환합니까? 즉, 콘솔에 아무 것도 인쇄하지 않습니까? –

+0

아니요, 그렇지 않습니다. - 그게 문제 야. \ – asenovm