質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

javaでのTCP/IP通信について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,954

luna12

score 37

前提・実現したいこと

javaでTCP/IPを使って通信するためのプログラムを作りたいです

受信する側(サーバー側?)のプログラムは一応接続待ちになるところまでは動かせたのですが、
クライアント側?のほうの接続をしようとするところで問題のエラーが出てしまっています
一応IPやポートを変えて試してはみたのですが、同じエラーメッセージでした

ちなみに現在設定しているポートは10000で試してみました
が、endpoint(SocketAddress)の中身をみてみるとメンバのportの値が9999になってたり、hostnameの値もnullが入ってたりで…

他に何か考えられそうな問題点を指摘していただけるとありがたいです。。

発生している問題・エラーメッセージ

Exception in thread "main" java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at adaputa_dummy.dummy.trans(dummy.java:162)
    at adaputa_dummy.dummy.main(dummy.java:53)

クライアントプログラム

//dummy.java
        String server = "localhost";
        int port = Integer.parseInt(conf.getProperty("trans_port")); // サーバー側のポート番号
        SocketAddress endpoint= new InetSocketAddress(server, port);
        Socket s = new Socket();
        ★s.connect(endpoint, 2000);

        // サーバーに数値を送信
        OutputStream os = s.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);

//以下略

サーバープログラム

    /**
     * コンストラクタ
     * @throws IOException
     */
    public TransDummy() throws IOException {
        String file="./conf/conf.properties";
        conf = new Properties();
        conf.load(new FileInputStream(file));

        ss = new ServerSocket(Integer.parseInt(conf.getProperty("trans_port")));

        //接続待ち
        for(;;){
            connect();
        }
    }

    /**
     * との接続を行う
     * @throws IOException
     */
    private void connect() throws IOException{
        logger.info("Connection開始");
        //ここでとまって接続待ち状態になります
        ★s = ss.accept();
        InputStream is = s.getInputStream();
        DataInputStream input = new DataInputStream(is);
        byte[] msg = new byte[12];
        input.read(msg, 0, 12);

        //受信メッセージ内容確認
        System.out.println("受信メッセージ内容:");
        for(int i = 0; i< msg.length; i++){
            System.out.print(Integer.toHexString(msg[i] & 0xff) + " ");
        }
        System.out.println();

        //受信メッセージの長さだけチェック
        if(msg.length == 12){
//メッセージを受信した場合の処理です
            response(Integer.parseInt(conf.getProperty("trans_response")), msg);
        } else{
            logger.warning("受信データエラー");
            System.exit(1);
        }

        logger.info("Connection終了");
    }

試したこと

色々通信の設定を変えて試してみたり、
他にはコンパネ→システムとセキュリティ→Windowsファイアウォールによるアプリケーションの許可→リモートデスクトップの許可にチェックをいれてみたり。。(ポートの解放?)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/01/13 17:47

    サーバー側のプログラムはどうなっていますか?

    キャンセル

回答 3

checkベストアンサー

0

上記のソースを一部変更したサンプルを作ってみました。私の環境(mac)では特に問題なく動作しました。
参考までにどうぞ

//サーバープログラム
import java.net.*;
import java.util.*;
import java.io.*;
class Server{

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

     for(;;){
     connect(ss);
    }

  }
  private static void connect(ServerSocket ss) throws IOException{
        //logger.info("Connection開始");
        //ここでとまって接続待ち状態になります
        Socket s = ss.accept();
        InputStream is = s.getInputStream();
        DataInputStream input = new DataInputStream(is);
        byte[] msg = new byte[12];
        input.read(msg, 0, 12);

        //受信メッセージ内容確認
        System.out.println("受信メッセージ内容:");
        System.out.println( new String(msg, "UTF-8"));
        for(int i = 0; i< msg.length; i++){
            System.out.print(Integer.toHexString(msg[i] & 0xff) + " ");
        }
        System.out.println();

        //受信メッセージの長さだけチェック
        if(msg.length == 12){
          //メッセージを受信した場合の処理です
          //  response(Integer.parseInt(conf.getProperty("trans_response")), msg);
        } else{
            //logger.warning("受信データエラー");
            System.exit(1);
        }
        s.close();//使い終わったソケットは閉じる

        //logger.info("Connection終了");
    }
}
//クライアントプログラム
import java.net.*;
import java.util.*;
import java.io.*;
class client{

  public static void main(String[] args) throws IOException{
      String server = "localhost";
      int port =8080; // サーバー側のポート番号
      SocketAddress endpoint= new InetSocketAddress(server, port);
      Socket s = new Socket();
      s.connect(endpoint, 2000);

      // サーバーに数値を送信
      OutputStream os = s.getOutputStream();
      DataOutputStream dos = new DataOutputStream(os);
      dos.writeBytes("hello world");

  }

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/16 10:38

    サンプルソースありがとうございます
    ポート番号の設定を今までは設定ファイルから取得(していたつもり)だったのですが、ポートを普通に数字をいれてみたところ問題なく接続できました!
    こちらの回答を見てそれを発見することができたので、BAにさせていただきます

    もしかしたらまた別な部分で問題が起きちゃうかもしれないですが…w

    キャンセル

0

サーバー側はちゃんと動いてるんでしょうか。
Connection refused というエラーはサーバーが動いていない(LISTENしていない)時のエラーです(他の場合もあるかもしれませんが)。
netstat で所定のポートでLISTENしているか確認してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/13 17:27

    teratermを使ってtelnetで接続を試みたのですが、そもそもteraterm自体が接続を拒否されました。。

    キャンセル

  • 2017/01/13 17:33

    Windowsならばコマンドプロンプトでtelnetを起動できます。
    (自作のサーバープログラムはローカルホスト上で動いているんですよね?)

    キャンセル

  • 2017/01/13 18:23

    サーバー側が動いている状態でないとだめなんですね…

    今試してみたところ、サーバーとコマンドプロンプト(teraterm)間では接続はできました(なんかすぐに接続が切れちゃうのでサーバーにも問題ありそうですが)
    ただサーバーを起動した状態でも、クライアントプログラムからは変わらずエラーメッセージが出ました。。

    キャンセル

0

質問者さんのプログラムをこちらで直接実行できなかったので作りました。
こちらの環境では動作するので、動作確認用にどうぞ。

クライアント側

import java.net.*;

class Client{
    public static void main(String... args){
        try{
            InetAddress ia = InetAddress.getAllByName("localhost")[0];
            Socket s = new Socket(ia, 8080); // 接続待機
            System.out.println("OK!!!:" + s.getRemoteSocketAddress()); // 接続成功
            s.close();
        }catch(Exception e){
            System.out.println("NG!!!"); // 接続失敗
            System.out.println(e);
        }
    }
}

サーバー側

import java.net.*;
import java.io.*;

class Server{
    public static void main(String... args) throws IOException {
        ServerSocket ss = new ServerSocket(8080);
        while(true){
            Socket s = ss.accept();
            System.out.println(s.getRemoteSocketAddress());
            s.close();
        }
    }
}

これで動作しなければ環境の問題ですし、動作したらプログラムの方をどうにかしなければなりません。
規模の小さいプログラムの方がデバッグやトレースもしやすいでしょうし、色々いじってみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/16 10:41

    サンプルソースありがとうございます
    結局こちらのソースは活用する必要もない些細なミスでしたが(w)、もしまた同じような問題が起きてしまった場合にはこちらのソースも参考にさせていただきたいと思います

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる