2017-04-14 17 views
0

に確認応答を返送されていません。私は私のソケットを作成した後、クライアント側ではServerは、私がこちらに以下の私のサーバーのコードを持っているクライアント

public void makeConnection() { 
    try { 
     Socket socket = new Socket(IP, PORT); 
     Writer writer = new PrintWriter(socket.getOutputStream(), true); 
     writer.write("connection\n"); 
     BufferedReader socketRead = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String str; 
     while ((str = socketRead.readLine()) != null) { 
      if ("success".equals(str)) { 
       System.out.println("Successfully saved all hosts to: " + listOfHosts.get(i)); 
       socketRead.close(); 
       socket.close(); 
       iStream.close(); 
       writer.close(); 
      } 
     } 
    }catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 

public void startServer() { 
     ServerSocket listener = selectUnusedPortFromRange(1024, 65535); 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        String command = null; 
        while (true) { 
         Socket socket = listener.accept(); 
         System.out.println("Got a connection from: " + socket.getLocalPort()); 
         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         command = in.readLine(); 
         System.out.println("GOT HERE"); //Not being printed out 
         if (command != null && !"".equals(command)) { 
          if ("connection".equals(command)) { 
           Writer writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
           writer.write("success\n"); 
           writer.flush(); 
          } 
         } 
        } 
       } 
      } 
     } 
     t.start(); 
} 

これは私のクライアント側でサーバへの接続には、ソケットのoutputStreamに「接続」を書き込んで、成功を示すサーバからの応答を返すのを待ちます。なんらかの理由で、サーバーとの接続が確立されていません。サーバではSystem.out.println("Got a connection from: " + socket.getLocalPort());この行は印刷されません。

私は何か間違っていますか?私はそれを見つけることができません。私は自分のサーバーに接続しようとすると例外がスローされない。

+0

だけの健全性チェック...サーバーがバインドされているのと同じポートを使用しているクライアントですか?私は 'selectUnusedPortFromRange()'が何をするのかは分からないが、私の推測では、指定された範囲内の使用されていないランダムなポートにバインドされているのだろうか?クライアントがどのポートにバインドされているかを確認してください。 – SnakeDoc

+0

@cricketはい私はそれに気付き、それを変更しました。それは私のタイプミスでした。私は今私のポストで正しいコードに変更しました。 – CapturedTree

+1

これは見ましたか? https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html –

答えて

1

1)クライアントとサーバーの両方で同じポートを使用していることを確認してください。彼らは同じポートで通信する必要があります。現在、別のポートを使用している可能性があります。

2)実際にサーバースレッドを開始してください。上記のコードでは、新しいスレッドを作成しますが、起動することはありません。 t.start()はどこかで呼び出さなければなりません。

3)ローカルマシンにある場合は、実際のIPアドレスの代わりにlocalhostを使用する方がよい場合があります。ファイアウォールは外部IPを別の方法で扱うかもしれません。

4)改行文字(\nなど)でメッセージを終了し、BufferedReaderにはreadLine()メソッドを使用できるようにします。また、改行文字がそれを引き起こさなかった場合に備えて、ライターのバッファをフラッシュしてフォローアップしてください。

最後に、コードを再度実行する前にJVMを終了させて​​ください。あなたのコードは、ポートからサーバーをアンバインドするメカニズムをシャットダウンしていないので、ポートやアドレスが既に使用中であることを示す例外がスローされることがあります。その場合は、ポートを変更するか、バックグラウンドで実行されているJavaプロセスを強制終了します。

私のシステム上で動作するように少し修正されたコードはここにあります。それは期待通りに機能しています。私は自分のシステム上で動作させるためにできるだけ変更を加えないようにしました。

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

public class Test { 
    public static void main(String[] args) throws IOException { 
     Test test = new Test(); 
     test.startServer(); 
     test.makeConnection(); 
    } 

    public void startServer() throws IOException { 
     final ServerSocket listener = new ServerSocket(60001); 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        String command = null; 
        while (true) { 
         Socket socket = listener.accept(); 
         System.out.println("Got a connection from: " + socket.getLocalPort()); 
         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         command = in.readLine(); 
         System.out.println("GOT HERE"); 
         if (command != null && !"".equals(command)) { 
          if ("connection".equals(command)) { 
           Writer writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
           writer.write("success\n"); 
           writer.flush(); 
          } 
         } 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     t.start(); 
    } 

    public void makeConnection() { 
     System.out.println("Making Connection");; 
     try { 
      Socket socket = new Socket("localhost", 60001); 
      Writer writer = new PrintWriter(socket.getOutputStream(), true); 
      writer.write("connection\n"); 
      writer.flush(); 
      BufferedReader socketRead = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String str; 
      while ((str = socketRead.readLine()) != null) { 
       if ("success".equals(str)) { 
        System.out.println("Successfully saved all hosts to: "); //+ listOfHosts.get(i)); 
        socketRead.close(); 
        socket.close(); 
        //iStream.close(); 
        writer.close(); 
       } 
      } 
     }catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 

} 
+0

OMGありがとうございました。第1の数字は除外されました。第2は、私の質問に誤って 't.start()'を追加するのを忘れてしまいました。それは3番(ファイアウォールなし)です。NUMBER 4が主なものでした。たくさん。ありがとうございました!! – CapturedTree

+1

@ 1290あなたはそれが働いてうれしいです。ハッピーコーディング! :) – SnakeDoc

+0

もう1つ問題があります。私のサーバでは、 'writer.write(" success \ n ");'部分がクライアントに返送されていません。それは 'if(接続" .equals(command)){} 'ブロックに入りますが、' writer.write( "success \ n"); 'を返しません。 – CapturedTree

1

私は正確に同じ問題に直面していた: - ワンノートでは、私は、サーバーとクライアントにポート番号をハードコードされていることは必須ではありません私がしてテストするために、それだけで便利でした。私はACKメカニズムを使用してそれを克服しました(私の考えではなく、私に示唆されました)。その考え方は、サーバがと一致したACKメッセージを応答して返信するまで、(および出力ストリームが開いている)をクライアントがサーバに要求し、がソケット接続を維持しているという考えです。クライアントがACKメッセージを受信すると、それだけが接続を終了します。以下は

Serverのコードである: -

final ServerSocket listener = new ServerSocket(11111); 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       String command = null; 
       while (true) { 
        System.out.println("About to accept"); 
        Socket socket = listener.accept(); 
        System.out.println("Got a connection from: " + socket.getLocalPort()); 
        DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 
        StringBuilder str = new StringBuilder(inputStream.readUTF()); 
        //command = in.readLine(); 
        System.out.println("GOT HERE. Msg received : "+str); 
        if (str != null && !"".equals(str.toString())) { 
         command = str.toString(); 
         if ("connection".equals(command)) { 
          System.out.println("Got connection message"); 
          DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 
          outputStream.writeUTF("connection"); 
          outputStream.close(); 

         } 
        } 
        inputStream.close(); 
        System.out.println("Done"); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
     } 
}); 
    t.start(); 

} 

クライアント: - 手続きを開始する

public void makeConnection() { 
    try { 
     System.out.println("In makeConnection"); 
     Socket socket = new Socket("127.0.0.1", 11111); 
     DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 
     outputStream.writeUTF("connection"); 
     InputStream inputStream = socket.getInputStream(); 
     DataInputStream dataInputStream = new DataInputStream(inputStream); 
     StringBuilder str; 
     do { 
      str = new StringBuilder(dataInputStream.readUTF()); 
      } while (!str.toString().equals("connection")); 
     System.out.println("Successfully saved all hosts to: "); 
     outputStream.close(); 
     dataInputStream.close(); 
     socket.close(); 
     outputStream.close(); 
    }catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 

コール: -

public void start() throws IOException, InterruptedException { 
    System.out.println("Starting server"); 
    startServer(); 
    Thread.sleep(1000); 
    System.out.println("Starting connection"); 
    makeConnection(); 
} 
関連する問題