【发布时间】: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 应用程序有互联网和访问网络状态权限,所以我不知道为什么它无法连接到服务器。
【问题讨论】:
-
您是否验证了该端口是否实际可用于连接并且尚未绑定到其他应用程序?