2009-04-12 8 views
1

간단한 서버 클라이언트 프로그램을 작성하려고하는데 문제가 있습니다. 클라이언트에서 서버로 데이터를 보낼 수는 있지만 서버에서 데이터를 보낼 수 없습니다 (예 :) 클라이언트에서 받아 봐 :(
그래서 서버에서 데이터를 전송하고 클라이언트에서 받아 봐하는 방법을Java 소켓 질문

서버 :?

//this is in a thread 
try { 
    server = new ServerSocket(1365); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
while (!exit) { 
    try { 
     clientSocket = server.accept(); 
     is = new DataInputStream(clientSocket.getInputStream()); 
     os = new PrintStream(clientSocket.getOutputStream()); 
     while ((line = is.readLine()) != null) { 
      System.out.println("Message from client: " + line); 
      //if (line.equals("exit")) { 
      // exit = true; 
      //} 
      if (line.equals("say something")) { 
       os.write("something".getBytes()); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    try { 
     is.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
os.close(); 
} 

클라이언트 :

try { 
    socket = new Socket(host, 1365); 
    os = new DataOutputStream(socket.getOutputStream()); 
    is = new DataInputStream(socket.getInputStream()); 
} catch (UnknownHostException e) {} 
if (socket != null && os != null && is != null) { 
    try { 
     os.writeBytes("say something"); 
     //get the answer from server 
     os.close(); 
     is.close(); 
     socket.close(); 
    } catch (IOException e) {} 
} 

(긴 코드는 죄송합니다.)
미리 감사드립니다.

+0

왜 버퍼링 된 문자 스트림 대신 DataInputStream 및 DataOutputStream을 사용해야하는 특별한 이유가 있습니까? – Vasil

+0

"say something"을 받았을 때 서버가 응답하는 것처럼 보입니다. 왜 그것이 전혀 응답하지 않을 수 있습니다. 또한 서버의 출력 스트림이 PrintStream 인 이유는 무엇입니까? –

+0

@ MasterPeter : 클라이언트는 "say something"을 보내도록 하드 코딩되어 있으므로 Jani가 소켓을 테스트하는 데 사용하는 코드를 버리는 것입니다. –

답변

7

서버의 OutputStream은 PrintStream이지만 클라이언트의 InputStream은 DataInputStream입니다. 클라이언트와 같이 DataOutputStream을 사용하도록 서버를 변경해보십시오.

Sun's Socket Tutorial의 예제 클라이언트/서버 쌍과 같이 PrintWriter와 BufferedReader를 모두 사용하는 것이 더 좋을 수도 있습니다.


그냥 조금 설명하기에 대한 이유 코드가 작동하지 않았다 : 스트림 데이터가 통과 필터로 객체의 당신은 생각할 수 있습니다. 필터는 데이터를 변경하여 서식 지정하여 다른 끝에있는 필터와 일치하는 필터를 이해합니다. 한 유형의 OutputStream을 통해 데이터를 보내면 일치하는 InputStream을 사용하여 다른 끝에서 수신해야합니다.

문자열 객체를 double 또는 double로 변환 할 수 없듯이 한 유형의 OutputStream (이 경우 PrintStream)에서 다른 형태의 InputStream

+0

프로그램이 "정지"되었지만 Sun의 소켓 자습서를 읽었습니다. 이제는 작동 중입니다! :) – Jani

+0

위대한, 나는 그것이 기쁜 것을 도왔다. 그것들은 Net (소켓 튜토리얼뿐만 아니라, 일반적으로 Sun의 모든 Java 튜토리얼)의 프로그래밍 튜토리얼 중 일부입니다. –

0

다른 문제는 텍스트 뒤에 "\ n"을 보내지 않았지만 readLine() 메서드를 사용했다는 것입니다.

0

os.write()os.flush(); 메시지가 매우 작아서 버퍼를 채우지 않았기 때문에 전송되지 않을 수도 있습니다.