2012-01-08 16 views
0

私は、serversocketクラスを実装するクラスを持っています。そして、クライアント1を実装する別のクラスがあります。ソケットクラス。ソケットがデータを受け取ることができません

私がしようとしていることはそれです。ストリームを取得した後、私はクライアントがサーバーに番号を送信し、サーバーがプライムであるかどうかにかかわらずクライアントに応答します。 awt.Labelに表示されます。

しかし、私は何の応答も受け取ることができません。ここで

は、クライアントのコンストラクタのコードです:Serverの

public ClientIsPrime() 
{ 
    setLayout(new GridLayout(2,2)); 
    add(new Label("Enter a number: ")); 
    add(numEntry=new TextField(10)); 
    add(checkPrime=new Button("Check if number is Prime")); 
    add(result=new Label("Result is shown here")); 

    try 
    { 
     Socket client = new Socket(InetAddress.getLocalHost(), 5959); 
     in=client.getInputStream(); 
     out=client.getOutputStream(); 
    }catch(UnknownHostException e) 
    { 
     result.setText("Local Host cannot be resolved"); 
    }catch(IOException e) 
    { 
     result.setText("IOException occured"); 
    } 

    checkPrime.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      try 
      { 
       int num; 
       num=Integer.parseInt(numEntry.getText()); 
       out.write(num); 
       out.flush(); 

       int c; 
       result.setText(""); 
       String s=""; 
       while((c=in.read())!=-1) 
        s+=((char)c); 
       result.setText(s); 
      }catch(IOException e) 
      { 
       result.setText("IOException occured"); 
      }catch(NumberFormatException e) 
      { 
       result.setText("Please enter a valid number."); 
      } 
     } 
    }); 
} 

コード:

public static void main(String args[])throws IOException 
{ 
    server=new ServerSocket(5959); 

    socket=server.accept(); 

    System.out.println("connected"); 

    InputStream in=socket.getInputStream(); 
    OutputStream out=socket.getOutputStream(); 
    int c; String numStr=""; 
    while((c=in.read())!=-1) 
     numStr+=((char)c); 
    int num=Integer.parseInt(numStr); 
    if(num==3) 
     out.write("Number is Prime".getBytes()); 
    else 
     out.write("Number is not Prime".getBytes()); 
    out.flush(); 

    in.close(); 
    out.close(); 
} 

それは本当のアプリではありません。私は学んでいます。

+0

素数実装は正しくはありませんが、メッセージは転送されているかどうかをテストしたいと思っています。完了しているかどうかは、素数実装を記述するのがよいでしょう。 – ritesht93

+0

私はあなたが正しくそれをやっているJavaソケットについて知っているから。あなたのポートは転送され、ファイアウォールは停止していますか? – Axis

+0

それでは、サーバーが素数を受け取るが、クライアントは応答を受け取ることがないという問題を明確にするために? – chradcliffe

答えて

0

あなたは、ワイヤ全体に整数を送信したい場合は、infinitely rawソケットストリームの上にDataOutputStreamの/ DataInputStreamのを層に容易にするだけのwriteInt()とのreadIntを(行う場合)

+0

Hmmはokです..iそれを知っている..私はObjectInputStreamを使用することもできます.. しかし、私はそれを試してみたい入力と出力ストリーム..それはあまりにも..働く必要があります! 学習...それだけを試してみたいです.. – ritesht93

+0

とにかく返信してくれてありがとう! :) – ritesht93

1

いくつかの問題。

まず、サーバーの実装はwhileループを終了しません。 InputStream.read()のAPIは、データが受信されるか、ストリームが閉じられるまでブロックされると述べています。ストリームは決してクローズされないので、最初のデータを読み取った後、読み取りは永久にブロックされます。

この問題を解決するには、プロトコルが何であるかを決定する必要があります。下記参照。

もう1つの問題は、クライアントからテキストの解析されたintとして書き込むことです。だから13(intとして)と言う。しかし、あなたはそれが一連​​の文字であるかのようにそれを読んでいます。ワイヤ上の13は何らかの制御文字として読み取られます。データの書き方とデータの読み方との一貫性が必要です。

私の提案は、基本的なプロトコルを持つことです。書き込み側にはDataOutputStream、読み取り側にはDataInputStreamを使用し、両側の読み取り/書き込み呼び出しを一致させて一貫性を保ちます。

+0

Hmm ok .. read()のcase..what IF条件でavailable()メソッドを使用してループを入力すると.. とnum変数を文字列として渡すとどうなりますか? toString().. – ritesht93

+0

何が起こっているのかを知りたいのであれば、私はDataInput/OutputStreamのソースコードを読んで、それが何をしているのかを見ていきます。 what/how/itが何をするのかを理解することは良いことです。それを超えて車輪を改革することは、そうではありません。 –

+0

Hmm..ok..so最終的には、Data/Object Streamsを使用する方が良いと思います。返信いただきありがとうございます! – ritesht93

関連する問題