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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

解決済

3回答

20904閲覧

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

luna12

総合スコア47

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

1クリップ

投稿2017/01/13 07:10

編集2017/01/13 09:30

###前提・実現したいこと
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)

###クライアントプログラム

java

1//dummy.java 2 String server = "localhost"; 3 int port = Integer.parseInt(conf.getProperty("trans_port")); // サーバー側のポート番号 4 SocketAddress endpoint= new InetSocketAddress(server, port); 5 Socket s = new Socket(); 6 ★s.connect(endpoint, 2000); 7 8 // サーバーに数値を送信 9 OutputStream os = s.getOutputStream(); 10 DataOutputStream dos = new DataOutputStream(os); 11 12//以下略

###サーバープログラム

/** * コンストラクタ * @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ファイアウォールによるアプリケーションの許可→リモートデスクトップの許可にチェックをいれてみたり。。(ポートの解放?)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/01/13 08:47

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

回答3

0

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

java

1import java.net.*; 2 3class Client{ 4 public static void main(String... args){ 5 try{ 6 InetAddress ia = InetAddress.getAllByName("localhost")[0]; 7 Socket s = new Socket(ia, 8080); // 接続待機 8 System.out.println("OK!!!:" + s.getRemoteSocketAddress()); // 接続成功 9 s.close(); 10 }catch(Exception e){ 11 System.out.println("NG!!!"); // 接続失敗 12 System.out.println(e); 13 } 14 } 15}

サーバー側

java

1import java.net.*; 2import java.io.*; 3 4class Server{ 5 public static void main(String... args) throws IOException { 6 ServerSocket ss = new ServerSocket(8080); 7 while(true){ 8 Socket s = ss.accept(); 9 System.out.println(s.getRemoteSocketAddress()); 10 s.close(); 11 } 12 } 13}

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

投稿2017/01/13 12:00

intelf___

総合スコア868

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luna12

2017/01/16 01:41

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

0

ベストアンサー

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

Java

1//サーバープログラム 2import java.net.*; 3import java.util.*; 4import java.io.*; 5class Server{ 6 7 public static void main(String[] args) throws IOException{ 8 ServerSocket ss = new ServerSocket(8080); 9 10 for(;;){ 11 connect(ss); 12 } 13 14 } 15 private static void connect(ServerSocket ss) throws IOException{ 16 //logger.info("Connection開始"); 17 //ここでとまって接続待ち状態になります 18 Socket s = ss.accept(); 19 InputStream is = s.getInputStream(); 20 DataInputStream input = new DataInputStream(is); 21 byte[] msg = new byte[12]; 22 input.read(msg, 0, 12); 23 24 //受信メッセージ内容確認 25 System.out.println("受信メッセージ内容:"); 26 System.out.println( new String(msg, "UTF-8")); 27 for(int i = 0; i< msg.length; i++){ 28 System.out.print(Integer.toHexString(msg[i] & 0xff) + " "); 29 } 30 System.out.println(); 31 32 //受信メッセージの長さだけチェック 33 if(msg.length == 12){ 34 //メッセージを受信した場合の処理です 35 // response(Integer.parseInt(conf.getProperty("trans_response")), msg); 36 } else{ 37 //logger.warning("受信データエラー"); 38 System.exit(1); 39 } 40 s.close();//使い終わったソケットは閉じる 41 42 //logger.info("Connection終了"); 43 } 44}

Java

1//クライアントプログラム 2import java.net.*; 3import java.util.*; 4import java.io.*; 5class client{ 6 7 public static void main(String[] args) throws IOException{ 8 String server = "localhost"; 9 int port =8080; // サーバー側のポート番号 10 SocketAddress endpoint= new InetSocketAddress(server, port); 11 Socket s = new Socket(); 12 s.connect(endpoint, 2000); 13 14 // サーバーに数値を送信 15 OutputStream os = s.getOutputStream(); 16 DataOutputStream dos = new DataOutputStream(os); 17 dos.writeBytes("hello world"); 18 19 } 20 21}

投稿2017/01/13 11:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luna12

2017/01/16 01:38

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

0

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

投稿2017/01/13 07:29

kisaburo_y

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luna12

2017/01/13 07:57

すいません、それもすでに確認しちゃってました。。 netstat -anでみると該当ポートは空いていました
kisaburo_y

2017/01/13 08:06

では次は自作のプログラムではなくtelnetを使ってconnectできるか試してみてください。 telnetでconnectできなければサーバープログラムの問題ということになります。
luna12

2017/01/13 08:27

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

2017/01/13 08:33

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

2017/01/13 09:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問