2012-04-13 16 views
1

私は、ネットワーク経由でデータを受信し、このデータを使って無関係なことを行うアプリケーションを構築する必要があります。Javaのソケット...?

ここに私が何をしているかを明確にするコードがあります。

static Socket client = null; 
static ServerSocket ss = null; 

if (ss != null) { 
       ss.close(); 
      } 
      ss = new ServerSocket(5513); 
      isrunning = true; 
      System.out.println("Waiting for client..."); 
      client = ss.accept(); 
      System.out.println("Client accepted."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 

とクライアント側:サーバー側で

Socket client = null; 
PrintWriter out = null; 
        try {        
         client = new Socket("hostname", 5513); 
         out = new PrintWriter(client.getOutputStream(), true); 
    } 

これはコードの単なる一部であることに注意してください。コードにエラーはありません。

サーバー側のコードを実行すると、クライアントが正しく接続するまで待機します。

ここに問題があります。クライアント側から接続しようとするとすぐに、「接続が拒否されました」というエラーが表示されます。

しかし、私はインターネット上で何かを見つけました。whochはクライアント側からtelnettingを試してみました。たとえば、サーバー側のIPを192.168.1.1とします。したがって、このコマンドを使用した後:

telnet 192.168.1.1 5513 

私は実際にサーバーに接続します。コマンドは空の画面を起動し、コマンドラインで手動で入力したものは、Enterキーを押した後にサーバー側に送信されます(デバッグでチェックされます)。

私は手動でサーバー側に接続してデータを送信できますが、コードが接続を拒否します。

私が間違っていることを知っている人は誰ですか?

+0

あなたの失敗の理由はわかりませんが、私はこれらの2つのチュートリアルを使用してソケットを簡単に稼働させています:http://android-er.blogspot.com/2011/01/implement-simple-socket-server-in。 html とhttp://android-er.blogspot.com/2011/01/simple-communication-using.html – HannahMitt

+0

@HannahMitt、彼は 'while'ループを忘れました。サーバーは接続を1秒以上聞いていません。サーバーが1つの接続を確立すると、それは完了し、もう聞きません。 –

+0

私が言ったように、これは単なるコードの一部です。私は実際にwhileループを使用しています。また、accept()メソッドは接続が確立するのを待つので、最初の接続を確立するまで何時間も待つことができます。その後、別の接続を開始するまでループします。 –

答えて

3

これは実際に使用しているコードですか?

client = new Socket("hostname", 5513); 

にそれを変更してみてください:

client = new Socket("192.168.1.1", 5513); 
+0

これはうまくいきました!ありがとう。 –

0

クライアントのSocketオブジェクトで実際に "ホスト名"を使用していないのですか?

これは192.168.1.1である必要があります。

0

あなたは、Windows上ではありますか?もしそうなら、インバウンドとアウトバウンドを有効にして、java.exeとjavaw.exeをファイアウォールに追加しましたか?ファイアウォールに5513のルールを追加しましたか?

はいの場合はWindowsが、ファイアウォールの設定はありません。これがあなたの答えです。ファイアウォールを開きます。

2

client = new Socket("hostname", 5513); ホスト名は、接続先のIPアドレスを表す必要があります。

また、サーバーがクライアントのすべての時間をリッスンしていない場合は、サーバーが接続をリッスンして受け入れるようにwhileループが必要です。

while (true) { 
    client = ss.accept(); 
    out = new PrintWriter(client.getOutputStream(), true); 
    //You should probably assign it to a seperate thread to handle stuff for this client 
} 

なぜこのようなエラーが発生するのか説明してください。接続が拒否されたとのメッセージが表示された場合は、通常、接続先のIPアドレスが自分の接続の送信を認識しており、その接続を待機していないため、接続をブロックしています。基本的に、サーバーが終了すると、クライアントの受信を停止したので、そのポートに入ったものはすべてブロックされます。もちろん、もう一つのケースは、Javaがあなたのファイアウォールでブロックされている可能性があり、それに対して例外が作られるはずです。あなたが達成しようとしていることがLAN上で行われているのであれば、これはまれです。

+0

これは厄介です。ホスト名を実際に動作するIPアドレスに置き換えてください。 –

+0

ホスト名を入力するとLAN接続で動作します。これは前にテストして接続を確立しているためです。しかし、接続の精度を高めるために、私はIPアドレスを使用します。その方法はもちろん、直接的で直接的なものではありません。私はウェブサイト接続にホスト名だけを使用します。唯一の例外は「ローカルホスト」で、「マイコンピュータのIPアドレス」を意味します。 –