2009-04-12 16 views
1

シンプルなサーバークライアントプログラムを作成しようとしていますが、問題があります。 クライアントからサーバーにデータを送信できますが、サーバーからデータを送信できません。それでは、どのサーバーからデータを送信し、クライアントでそれをreciveする
:()クライアントでそれをreciveJavaソケットに関する質問

サーバー:?

//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

は、「何か」が受信されたときにだけサーバが応答するようです。なぜそれが全く応答していないのかもしれません。また、サーバーの出力ストリームがPrintStreamであるのはなぜですか? –

+0

@ MasterPeter:クライアントは「何か」を送信するようにハードコードされているので、これはJaniがソケットをテストするために使用しているコードを投げ捨てただけだと思います。 –

答えて

7

サーバーのOutputStreamはPrintStreamですが、クライアントのInputStreamはDataInputStreamです。クライアントのようにDataOutputStreamを使用するようにサーバーを変更してみてください。

Sun's Socket Tutorialのクライアント/サーバーの例のように、PrintWriterとBufferedReaderの両方を使用するように変更することもできます。


あなたのコードが動作しなかった理由について少しだけを説明するために:あなたは、あなたのデータが通過フィルタとしてストリームオブジェクトと考えることができます。フィルタによってデータが変更され、他の端のフィルタに一致するのフィルタが理解できるようになります。 1つのタイプのOutputStreamでデータを送信するときは、一致するInputStreamでもう一方のタイプのデータを受け取る必要があります。

Stringオブジェクトをdouble型またはString型のdouble型(変換せずに)格納できないのと同じように、あるタイプのOutputStream(この場合はPrintStream)から別のタイプのInputStream

+0

プログラムが「フリーズ」しましたが、私はSunのソケットチュートリアルを読んで、今は動作しています! :) – Jani

+0

偉大な、私はそれが助けてうれしいです。それらは、ネット上の最良のプログラミングチュートリアルの一部です(ソケットチュートリアルだけでなく、SunのJavaチュートリアル全般)。 –

0

他の問題は、テキストの後に "\ n"を送信しなかったことですが、私はreadLine()メソッドを使用しました。

0

あなたの後os.write() do os.flush();メッセージは非常に小さく、バッファを満たしていないために送信されていない可能性があります。