簡體   English   中英

嘗試連接到本地主機上的套接字時出現連接拒絕錯誤

[英]Connection Refused Error when attempting to connect to socket on localhost

我正在嘗試使用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應用程序具有Internet和訪問網絡狀態權限,因此我迷惑了為什么它無法連接到服務器。

好的,您必須找到您的服務器IP地址才能設置從您的應用程序到服務器的連接。 “本地主機”是回送IP地址127.0.0.1。 在MainActivity中,serverAddress必須是服務器的IP地址。 例如192.168.0.20

讓我們找到您的本地IP地址。 這是Windows的說明

單擊開始菜單上,然后鍵入cmd。 當您在“開始”菜單面板中看到cmd應用程序時,單擊它或僅按Enter鍵。 命令行窗口將打開。 輸入ipconfig並按Enter。 您會看到很多信息,但是您要查找的行是“ IPv4地址”。 該文本后面的數字是您的本地IP地址。

在Mac上執行以下操作的方法如下:

打開系統偏好設置(通過屏幕左上角的Apple菜單)。 打開“系統偏好設置”后,單擊標有“網絡”的圖標。 您應該在左側看到一些帶有Wi-Fi,以太網,藍牙等標簽的選項。帶有綠點的選項已分配IP地址。 單擊頂部的一個(如果尚未選中),然后向右看。 應該有一個句子,上面寫着“ Wi-Fi已連接到Chocolate,並且IP地址為192.168.1.102”。 該句子末尾的數字是您的本地IP地址。

您嘗試使用“ localhost” URL從客戶端連接服務器。 如果在單獨的計算機上運行,​​則寫入服務器本地IP地址,而不是“ localhost”

如果客戶端在仿真器中運行,則仿真器和服務器可能不在同一網絡中。

String serverAddress = "192.168.x.xx";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM