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

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

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

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

ネットワーク

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

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

1回答

4404閲覧

JavaのServerSocketのacceptが機能しない

teratail2020

総合スコア9

Java

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

ネットワーク

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

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

1グッド

1クリップ

投稿2020/03/12 15:22

前提・実現したいこと

JavaのSocketとServerSocketを用いてPC2台間でローカルエリアネットワークを構築しようとしております。PC間はLANケーブルで直接接続しており、サーバ側を"192.168.0.1"、クライアント側を"192.168.0.2"の固定IPアドレスとしています。両PC間にハブなどはありません。

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

クライアントからサーバ側にアクセスできません。
正確にはサーバ側でServerSocket.accept()でプログラムを待機させているのですが、接続に成功しない状態です。

該当のソースコード

Java

1//クライアント側プログラムの一部 2 try { 3 Socket clientSocket = new Socket("192.168.0.2",5000); 4 System.out.println("Succeed to connect Server!!"); 5 clientSocket.close(); 6 } catch (UnknownHostException e) { 7 System.out.println("UnknownHostException:"+e); 8 } catch (IOException e) { 9 System.out.println("IOException:"+e); 10 } catch (Exception e) { 11 System.out.println("Exception:"+e); 12 } 13 14//サーバ側プログラムの一部 15 try { 16 ServerSocket serverSocket = new ServerSocket(5000); 17 Socket serversideSocket = serverSocket.accept(); 18 System.out.println("Succeed to open ServerSocket!!"); 19 serversideSocket.close(); 20 serverSocket.close(); 21 } catch (IOException e) { 22 System.out.println("IOException:"+e); 23 } catch (SecurityException e) { 24 System.out.println("SecurityException:"+e); 25 } catch (IllegalArgumentException e) { 26 System.out.println("IllegalArgumentException:"+e); 27 }

試したこと

以下の試行を行いました。
①PC間の相互PINGの確認=>相互接続確認
②インターネットに接続し、外部yahoo webサーバ(IPアドレス 182.22.25.252 ポート番号 80)へのクライアントプログラムでの接続=>接続確認
③PC1台でサーバ側とクライアント側のプログラムを立ち上げローカル・ループバック・アドレス(IPアドレス 127.0.0.1 ポート番号 5000)を設定して実施=>接続確認
④telnetコマンドによるクライアント側からサーバ側への確認=>「接続に失敗しました」と表示
⑤サーバー側PCのWindowsファイアーウォールの設定で該当ポートを開けるよう設定=>接続できず

②よりクライアントプログラムに問題がなく、③よりサーバプログラムも正常に動いているものと思われます。そこでファイアーウォールの問題かと思い、④、⑤よりポート開放を行ったのですが接続は確立できませんでした。

打つ手がなく困っている状態です。このような場合にどのように対処すればよいかご存じの方がおられましたらご教授お願いいたします。

補足情報(FW/ツールのバージョンなど)

OSは2台ともWindows 10 pro 64bitで、開発環境はサーバ側がEclipse Platform Version: 2018-09 (4.9) 、クライアント側がEclipse IDE for Enterprise Java Developers Version:2019-12(4.14.0)です。

s.k👍を押しています

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

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

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

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

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

jimbe

2020/03/12 15:41

サーバのパソコンでWebサーバが動いていなければ, ポートを 80 にして通信してみては如何でしょうか.
jimbe

2020/03/12 16:07

>//クライアント側プログラムの一部 > Socket clientSocket = new Socket("192.168.0.2",5000); サーバのアドレスは > サーバ側を"192.168.0.1" では?
teratail2020

2020/03/13 15:05

早速、回答くださりありがとうございます。 たしかにご指摘の通りIPアドレスは逆です。 記載ミスです、失礼いたしました。 先のご指摘通りポート80にして試してみましたが、通信は確立しませんでした。
jimbe

2020/03/13 15:18

> ポート80にして試してみましたが、通信は確立しませんでした サーバ側の FW で 80 を解放の上...でしょうか?
mit0223

2020/03/14 02:10

telnet の実行結果を貼ってもらえますか。また、そのときのサーバ側の netstat -an の結果を貼ってもらえますか。
dodox86

2020/03/14 02:53

Windowsのファイアウォールですと、実行するプログラム自体に結びついている場合もある(そういう設定もある)ので、FWの問題かどうかを切り分ける為にサーバー側Windowsファイアウォールを切って試してみることも良いかもしれません。また、他のセキュリティソフトが動いていないかも確認してみてください。
dodox86

2020/03/14 02:59

別コメントでもいただいていますが、まずはサーバー側で0.0.0.0:5000などとANYアドレスでLISTENINGしているのが大前提だと思います。 C:>netstat -a | findstr "5000" TCP 0.0.0.0:5000 hostname:0 LISTENING
teratail2020

2020/03/14 05:49

jimbe 2020/03/14 00:18 サーバー側のファイアーウォールはプログラムを初回起動時に表示される「Windows セキュリティの重要な警告」でパブリックネットワークにチェックを入れ、また「セキュリティが強化されたWindows Defender ファイアーウォール」で送信と受信の規則を追加しましたが接続は確立できませんでした。 mit0223 2020/03/14 11:10 回答くださりありがとうございます。 telnetの結果を記載します。 C:\Users\FUJITSU>telnet 192.168.0.2 5000 接続中: 192.168.0.2...ホストへ接続できませんでした。 ポート番号 5000: 接続に失敗しました またnetstat -an の結果は以下となります。 TCP 192.168.0.1:49959 192.168.0.2:5000 SYN_SENT
mit0223

2020/03/14 22:00

あ、すみません、netstat はクライアント側ではなくサーバ側で実行してもらえますか。dodox86 さんのコメントにあるものが良いと思います。また、telnet, netstat の結果については、コメントではなく、質問自身に 追加してもらえますか。ここまでの経緯からファイアウォールの問題である可能性が高いです。dodox86さんの言う通り、一度ファイアウォール完全に無効にして試してみるというのも良いと思います。
shinami

2020/03/15 01:19

> PC間はLANケーブルで直接接続しており > PC間の相互PINGの確認=>相互接続確認 pingは成功しているので自動判別できるアダプタなのかもしれませんがクロスケーブルを使うとどうなりますか?クロスケーブルではないといけないことは無いでしょうか? また、現状で直接PC間をつないでみてコントロールパネルのアダプタ設定の変更でアダプタのアイコンが Xまたは!マークになっているでしょうか? あとは、ストレートケーブルでハブまたはルーターなどを入れてLAN通信するとどうなりますか?まぁこれは②で成功しているのでできるのでしょうが・・・。
teratail2020

2020/03/16 13:13

dodox86 2020/03/14 11:53 mit0223 2020/03/15 07:00 サーバー側のファイアーウォールの設定には2種類、プライベートネットワークとゲストまたはパブリックネットワークがありますがゲストまたはパブリックネットワークのファイアーウォールを解除したところ通信が成功しました。助言ありがとうございました。 netstatは以下となっております。 プロトコル ローカル アドレス 外部アドレス 状態 TCP 192.168.0.2:5000 192.168.0.5:5000 TIME_WAIT ※クライアント側アドレス192.168.0.1はデフォルトゲートウェイとかぶっていたので念のため192.168.0.5に変更しました。 しかしながらIPネットワーク192.168.0.x系列はパブリックネットワークでなくプライベートネットワーク(ローカルネットワーク)だと思うのですが、この認識は誤っているのでしょうか? またファイアーウォールを復活させて、送受信の規則の中で「適用するプロファイル」に対してパブリックにチェックを入れても通信に失敗しました。特定のポートを開放すればTCP通信は確立すると思っていたのですがこの認識も間違っていますでしょうか? shinami 2020/03/15 10:19 回答くださりありがとうございます。しかしながら上記の通りどうやらファイアーウォールの設定の問題のようです。
guest

回答1

0

自己解決

Windows 10をサーバー機として使用する場合、Windows Defender ファイアーウォールによるPCの保護で「ゲストまたはパブリックネットワーク」から「プライベートネットワーク」に変更する必要があるようです。「プライベートネットワーク」に設定を変えることでポート開放設定も、ファイアーウォール解除も行う必要なくServerSocketを機能させることができました。「プライベートネットワーク」への変更はPowerShellで行うことができました。返信をくださった皆様、特に解決に近い回答をくださったdodox86、mit0223のお二人ありがとうございました。

投稿2020/03/17 13:18

teratail2020

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問