前提・実現したいこと
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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");
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
サーバー側はちゃんと動いてるんでしょうか。
Connection refused というエラーはサーバーが動いていない(LISTENしていない)時のエラーです(他の場合もあるかもしれませんが)。
netstat で所定のポートでLISTENしているか確認してみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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();
}
}
}
これで動作しなければ環境の問題ですし、動作したらプログラムの方をどうにかしなければなりません。
規模の小さいプログラムの方がデバッグやトレースもしやすいでしょうし、色々いじってみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.11%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
退会済みユーザー
2017/01/13 17:47
サーバー側のプログラムはどうなっていますか?