【问题标题】:Connection Refused Error when attempting to connect to socket on localhost尝试连接到本地主机上的套接字时连接被拒绝错误
【发布时间】:2017-11-22 01:53:12
【问题描述】:

我正在尝试在我的 PC 上使用 Java 服务器设置一个简单的服务器-客户端应用程序,并将一个 android 应用程序作为客户端。它们都连接到同一个 wi-fi 网络。我在尝试让客户端连接到服务器套接字时遇到问题。我使用“localhost”作为服务器的 IP,并确保服务器正在运行并等待端口 60101 上的连接。该端口未被任何其他应用程序使用,并且正在侦听。 当我尝试在此行上连接时,客户端抛出连接被拒绝错误:

connection = new Socket(serverAddress,serverPort);// ("localhost", 60101)

这是我的服务器代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {

    private static final int portNumber = 60101;

    public static void main(String[] args) {

        ServerSocket serverSocket = null;

        try {
            //starting server
            System.out.println("Server starting at port number: "+portNumber);
            serverSocket = new ServerSocket(portNumber);

            //client connecting
            System.out.println("Waiting for clients to connect");
            Socket socket = serverSocket.accept();
            System.out.println("Client has connected.");

            //Send message to the client
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("this is a message from the server");
            bw.newLine();
            bw.flush();

            //Receive message from client
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String data;
            while((data = br.readLine()) != null ){
                System.out.println("Message from the client: " + data);

            }
            System.out.println("Server has ended");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Android MainActivity.java:

package johnedchristensen.androidclienttestapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView showMessageText;
    Button buttonConnect;
    String serverAddress = "localhost";
    int portNumber = 60101;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showMessageText = (TextView) findViewById(R.id.textView);
        buttonConnect = (Button) findViewById(R.id.button);

        buttonConnect.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Client myClient = new Client(serverAddress, portNumber, showMessageText);
                myClient.execute();
            }
        });
    }
}

Android Client.java:

package johnedchristensen.androidclienttestapplication;

import android.os.AsyncTask;
import android.widget.TextView;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;



public class Client extends AsyncTask<Void,Void,Void>{
    private String serverAddress;
    private int serverPort;
    private TextView messageDisplay;
    private Socket connection;
    private String statusMessage = "";

    Client(String address, int port, TextView message){
        serverAddress = address;
        serverPort = port;
        this.messageDisplay = message;

    }

    @Override
    protected Void doInBackground(Void... params) {


        try{
            //connection
            statusMessage += "Attempting to connect... \n";
            connection = new Socket(serverAddress,serverPort);
            statusMessage += "Connected to: " + connection.getInetAddress().getHostName();

        }catch(EOFException eofException){
            statusMessage +="\n Error Connecting";
        }catch(IOException ioException){
            statusMessage +="\n Error Connecting";
            ioException.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        messageDisplay.setText(statusMessage);
        super.onPostExecute(result);
    }

}

连接被拒绝错误:

 W/System.err: java.net.ConnectException: Connection refused
 W/System.err:     at java.net.PlainSocketImpl.socketConnect(Native Method)
 W/System.err:     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
 W/System.err:     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
 W/System.err:     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
 W/System.err:     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
 W/System.err:     at java.net.Socket.connect(Socket.java:586)
 W/System.err:     at java.net.Socket.connect(Socket.java:535)
 W/System.err:     at java.net.Socket.<init>(Socket.java:427)
 W/System.err:     at java.net.Socket.<init>(Socket.java:210)
 W/System.err:     at johnedchristensen.androidclienttestapplication.Client.doInBackground(Client.java:43)
 W/System.err:     at johnedchristensen.androidclienttestapplication.Client.doInBackground(Client.java:19)
 W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:304)
 W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
 W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
 W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
 W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
 W/System.err:     at java.lang.Thread.run(Thread.java:761)

android 应用程序有互联网和访问网络状态权限,所以我不知道为什么它无法连接到服务器。

【问题讨论】:

  • 您是否验证了该端口是否实际可用于连接并且尚未绑定到其他应用程序?

标签: java android sockets


【解决方案1】:

您正在尝试使用 'localhost' url 从客户端连接服务器。如果有在单独的机器上运行,写服务器本地IP地址而不是'localhost'

如果客户端运行在模拟器中,可能模拟器和服务器不在同一个网络中。

String serverAddress = "192.168.x.xx";

【讨论】:

    【解决方案2】:

    好的,您必须找到您的服务器 IP 地址才能设置从您的应用到您的服务器的连接。 “localhost”是环回IP地址127.0.0.1。在你的 MainActivity serverAddress 必须是服务器的 IP 地址。前 192.168.0.20

    让我们找到您的本地 IP 地址。以下是适用于 Windows 的说明

    单击开始菜单并键入 cmd。当您在“开始”菜单面板中看到 cmd 应用程序时,单击它或直接按 Enter。 将打开一个命令行窗口。键入 ipconfig 并按回车键。 您会看到一堆信息,但您要查找的行是“IPv4 地址”。该文本对面的数字是您的本地 IP 地址。

    以下是在 Mac 上执行相同操作的方法:

    打开系统偏好设置(通过屏幕左上角的 Apple 菜单)。 当系统偏好设置打开时,单击标有网络的图标。 您应该在左侧看到一些带有 Wi-Fi、以太网、蓝牙等标签的选项。带有绿点的选项具有分配给它们的 IP 地址。单击顶部的那个(如果尚未选择)并向右看。应该有一个类似“Wi-Fi 连接到 Chocolate 并且 IP 地址为 192.168.1.102”的句子。该句末尾的数字是您的本地 IP 地址。

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 2015-07-30
      • 2015-10-15
      • 2020-03-14
      • 2011-11-04
      • 2023-04-02
      • 2016-07-09
      • 1970-01-01
      • 2016-09-12
      相关资源
      最近更新 更多