私はTCP接続を実装しようとしています、すべてサーバー側からうまくいきますが、クライアントプログラムを(クライアントコンピュータから)実行すると、次のエラーが発生します。
Java.net.ConnectException: Connection refused
at Java.net.PlainSocketImpl.socketConnect(Native Method)
at Java.net.PlainSocketImpl.doConnect(PlainSocketImpl.Java:351)
at Java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.Java:213)
at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:200)
at Java.net.SocksSocketImpl.connect(SocksSocketImpl.Java:432)
at Java.net.Socket.connect(Socket.Java:529)
at Java.net.Socket.connect(Socket.Java:478)
at Java.net.Socket.<init>(Socket.Java:375)
at Java.net.Socket.<init>(Socket.Java:189)
at TCPClient.main(TCPClient.Java:13)
私はそれが使用中だった場合に備えてソケット番号を変更しようとしましたが無駄に、誰もがこのエラーの原因と修正方法を知っていますか。
サーバーコード:
//TCPServer.Java
import Java.io.*;
import Java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception {
String fromclient;
String toclient;
ServerSocket Server = new ServerSocket(5000);
System.out.println("TCPServer Waiting for client on port 5000");
while (true) {
Socket connected = Server.accept();
System.out.println(" THE CLIENT" + " " + connected.getInetAddress()
+ ":" + connected.getPort() + " IS CONNECTED ");
BufferedReader inFromUser = new BufferedReader(
new InputStreamReader(System.in));
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(connected.getInputStream()));
PrintWriter outToClient = new PrintWriter(
connected.getOutputStream(), true);
while (true) {
System.out.println("SEND(Type Q or q to Quit):");
toclient = inFromUser.readLine();
if (toclient.equals("q") || toclient.equals("Q")) {
outToClient.println(toclient);
connected.close();
break;
} else {
outToClient.println(toclient);
}
fromclient = inFromClient.readLine();
if (fromclient.equals("q") || fromclient.equals("Q")) {
connected.close();
break;
} else {
System.out.println("RECIEVED:" + fromclient);
}
}
}
}
}
クライアントコード:
//TCPClient.Java
import Java.io.*;
import Java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception {
String FromServer;
String ToServer;
Socket clientSocket = new Socket("localhost", 5000);
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
System.in));
PrintWriter outToServer = new PrintWriter(
clientSocket.getOutputStream(), true);
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
while (true) {
FromServer = inFromServer.readLine();
if (FromServer.equals("q") || FromServer.equals("Q")) {
clientSocket.close();
break;
} else {
System.out.println("RECIEVED:" + FromServer);
System.out.println("SEND(Type Q or q to Quit):");
ToServer = inFromUser.readLine();
if (ToServer.equals("Q") || ToServer.equals("q")) {
outToServer.println(ToServer);
clientSocket.close();
break;
} else {
outToServer.println(ToServer);
}
}
}
}
}
この例外は、接続しようとしているIP /ポートで待機しているサービスがないことを意味します。
私はチェックします:
最も簡単な出発点は、おそらくtelnetまたはPuTTYを使ってクライアントマシンから手動で接続しようとすることです。それが成功した場合、問題はクライアントコードにあります。そうでない場合は、解決する必要があります なぜ それはしていません。 Wireshark はこの面であなたを助けるかもしれません。
私は同じ問題を抱えていましたが、クライアントを実行する前にサーバーを実行して問題を解決しました。
私はvernemqと呼ばれるMqttブローカーと同じ問題を抱えていましたが、以下を追加することによってそれを解決しました。
$ Sudo vmq-admin listener show
vernemqで許可されているIPアドレスとポート番号のリストを表示する
$ Sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
iPと新しいポートを追加します。これで問題なく接続できるはずです。
クライアントソケットをリモートのServerSocketに接続する必要があります。の代わりに
Socket clientSocket = new Socket("localhost", 5000);
行う
Socket clientSocket = new Socket(serverName, 5000);
クライアントは serverName に接続する必要があります。これはServerSocket
がインスタンス化されたボックスの名前またはIPと一致する必要があります(名前はクライアントマシンから到達可能である必要があります)。ところで:それは重要である名前ではない、それはすべてIPアドレスについてです...
上記の回答に追加したい点の1つは、私の経験-
「サーバーでlocalhostでホストし、http://localhost/my_api/login.php
などの適切なURLを指定してAndroidエミュレーターで接続しようとしていました。 接続拒否エラー "
注意点- PCのブラウザにアクセスして同じURLを使用したとき(http://localhost/my_api/login.php
)正しい応答を得ていた
したがって、私の場合の問題は用語localhost
で、これはサーバー上のIPに置き換えられ(サーバーはマシンでホストされているため)、エミュレーターから到達可能になりました。同じPC。
ローカルマシンのIPを取得するには、cmdでipconfig
コマンドを使用します。192.68.xx.yyVoilaのようなIPv4を取得できます。これは、サーバーがホストされているマシンのIPです。 localhostの代わりに使用してください
http://192.168.72.66/my_api/login.php
注-このコンピューターの外部のノードからこのプライベートIPにアクセスすることはできません。 (必要な場合は、そのためにNgnixを使用できます)
私の経験が誰かに役立つことを願っています。私は同じ例外スタックトレースで問題に直面しました、そして、問題が何であるか理解できませんでした。接続しようとしていたデータベースサーバーが実行中で、ポートが開いていて接続を受け入れていました。
問題はインターネット接続にありました。私が使用していたインターネット接続は、対応するサーバーへの接続を許可されていませんでした。接続の詳細を変更したら、問題は解決しました。
私の場合、docker
設定のExpose daemon on tcp://localhost:2375 without TLS
の近くにチェックマークを付けなければなりませんでした(タスクバーの右側にあるdocker
を右クリックし、setting
を選択してください)
私の場合は、ソケットにサーバーの名前(私の場合は "raspberrypi")を付けましたが、代わりにIPv4アドレスで作成したか、IPv6を壊しています(名前はIPv6に解決されます)。
forループの中でServerSocket
を閉じて、その中のクライアントの数を受け入れようとしたため、このエラーが発生しました(すべてのクリントを受け入れ終えていない)
ソケットを閉じる場所に注意してください
私は同じ問題を抱えていました、そして、問題は、私がソケットオブジェクトを閉じていなかったということでした。問題が解決しました。このコードは私には役に立ちます。
ClientDemo.Java
public class ClientDemo {
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket socket = new Socket("127.0.0.1", 55286);
OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream());
os.write("Santosh Karna");
os.flush();
socket.close();
}
}
serverDemo.Java
public class ServerDemo {
public static void main(String[] args) throws IOException {
System.out.println("server is started");
ServerSocket serverSocket= new ServerSocket(55286);
System.out.println("server is waiting");
Socket socket=serverSocket.accept();
System.out.println("Client connected");
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str=reader.readLine();
System.out.println("Client data: "+str);
socket.close();
serverSocket.close();
}
}
私は同じ問題を抱えていました、そしてそれはcatalina.out
ファイルの許可が正しくないことが原因であることが判明しました。 Tomcatユーザーは書き込みできませんでした。権限を修正したら、問題は解決しました。私はそれがTomcat8-initd.log
ファイルのログからパーミッションの問題であることを知るようになりました:
/usr/sbin/Tomcat8: line 40: /usr/share/Tomcat8/logs/catalina.out: Permission denied
両端でポート番号が常に異なる