【问题标题】:android socket server programmingandroid socket服务器编程
【发布时间】:2016-01-10 08:19:31
【问题描述】:

我想通过套接字连接到我的 android 应用程序。但在服务器端(android 应用程序)我收到 java.net.SocketTimeoutException 错误,在客户端我收到 java.net.ConnectException: Connection refused: connecterror。 我的错误是什么?谢谢

服务器(安卓应用)

public class ServerSocketTask extends AsyncTask<Void, Void, String> {
final StackTraceElement se = Thread.currentThread().getStackTrace()[2];

private String data = null;

@Override
protected String doInBackground(Void... params) {
    Log.d(se.getClassName() + "." + se.getMethodName(), "start");
    try {
        ServerSocket serverSocket = new ServerSocket(8989);
        serverSocket.setSoTimeout(50000);
        Socket socket = serverSocket.accept();
        socket.setKeepAlive(true);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        int readed = in.read();
        Log.d("","readed bytes : "+readed);

        String line;
        while ((line = in.readLine()) != null){
            Log.i("","line : "+ line);
        }
        socket.close();
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    ServerSocketTask.this.data = result;
}

public String getData() {
    return data;
}

}

客户

    public static void main(String[] args) {
    int port;
    try (Socket socket = new Socket("192.168.240.105", 8989)) {
        String customerId = "123";
        String requestId = Configuration.getProperty("requestId");
        ClientService result = new ClientService();
        String makeRequest = result.objectToJson(customerId, requestId);
        PrintWriter writer = new PrintWriter(socket.getOutputStream());
        writer.write(makeRequest);
        writer.flush();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我的客户端无法连接到服务器,我的服务器正在等待连接。

【问题讨论】:

  • 你能验证你可以通过telnet 192.168.240.105 8989连接到socket吗?
  • 无法在端口 8989 上打开与主机的连接:连接失败。 192.168.240.105 是我的机器 ip,即使使用 localhost 和 127.0.0.1 我也会收到相同的 telnet 错误
  • 为什么我的服务器不听 8989?
  • 使用模拟器或设备?
  • '192.168.240.105 是我的机器ip,'。 “机器”是什么意思?客户端应使用您的 Android 设备的 ip。您不能在设置中使用模拟器。

标签: android sockets


【解决方案1】:

当您构造 ServerSocket(8989) 时,您将绑定到 Android 模拟器/设备上可用的网络接口的通配符地址

但是,Android 模拟器和真实设备都有自己的网络接口,因此它是自己的 IP 地址。您的客户端程序(开发机器)IP地址与android模拟器/设备的IP地址不同。换句话说,您无法连接到在 Android 应用中创建的套接字,因为您使用了错误的地址。

This answer 应该会指导您如何找到地址。

【讨论】:

  • 他没有使用错误的地址。绑定到通配符地址的侦听套接字将接受来自任何本地 IP 地址的连接,
  • 是的,但是他正在尝试使用他的开发机ip地址,而android设备/模拟器将有不同的本地地址。
  • 您的意思是“客户端使用运行它的机器的 ip”。或者是自己的ip。您谈论通配符没有意义。