【问题标题】:to get this client server android app working. what IP address do I type in the edittext window?让这个客户端服务器 android 应用程序工作。我在edittext窗口中输入什么IP地址?
【发布时间】:2013-12-09 03:40:28
【问题描述】:

我有两个安卓平板电脑,我想通过套接字编程将消息从客户端发送到服务器。我粘贴了示例代码来制作服务器和客户端应用程序,并将它们安装在两个安卓平板电脑上。都连接到wifi

在客户端应用程序上有一个编辑文本,我应该在其中输入 IP 地址,然后下面的按钮称为“连接电话”。

在点击“连接电话按钮”之前,我应该在编辑文本中输入什么 IP 地址

这里是“连接电话”按钮的 onclick 监听器

    private OnClickListener connectListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (!connected) {
            serverIpAddress = serverIp.getText().toString();
            if (!serverIpAddress.equals("")) {
                Thread cThread = new Thread(new ClientThread());
                cThread.start();
            }
        }
    }
};

客户端和服务器应用程序的完整代码如下所示;

客户端代码:

 package com.example.client;

 // import statements

 public class ClientActivity extends Activity {

private EditText serverIp;

private Button connectPhones;

private String serverIpAddress = "";

private boolean connected = false;

private Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.client);

    serverIp = (EditText) findViewById(R.id.server_ip);
    connectPhones = (Button) findViewById(R.id.connect_phones);
    connectPhones.setOnClickListener(connectListener);
}

private OnClickListener connectListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (!connected) {
            serverIpAddress = serverIp.getText().toString();
            if (!serverIpAddress.equals("")) {
                Thread cThread = new Thread(new ClientThread());
                cThread.start();
            }
        }
    }
};

public class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            Socket socket = new Socket(serverAddr, 8080);
            connected = true;
            while (connected) {
                try {
                    Log.d("ClientActivity", "C: Sending command.");
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                                .getOutputStream())), true);
                        // where you issue the commands
                        out.println("Hey Server!");
                        Log.d("ClientActivity", "C: Sent.");
                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }
            }
            socket.close();
            Log.d("ClientActivity", "C: Closed.");
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;
        }
    }
 }
 }

服务器代码;

       package com.example.server;

  // import statements

  public class ServerActivity extends Activity {

private TextView serverStatus;

// default ip
// public static String SERVERIP ="10.0.2.15";

// designate a port
public static final int SERVERPORT = 8080;

private Handler handler = new Handler();

private ServerSocket serverSocket;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.server);
    serverStatus = (TextView) findViewById(R.id.server_status);

    SERVERIP = getLocalIpAddress();

    Thread fst = new Thread(new ServerThread());
    fst.start();
}

    public class ServerThread implements Runnable {

    public void run() {
        try {
            if (SERVERIP != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus.setText("Listening on IP: " + SERVERIP);
                    }
                });
                serverSocket = new ServerSocket(SERVERPORT);
                while (true) {
                    // listen for incoming clients
                    Socket client = serverSocket.accept();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            serverStatus.setText("Connected.");
                        }
                    });

                    try {
                        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                        String line = null;
                        while ((line = in.readLine()) != null) {
                            Log.d("ServerActivity", line);
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    // do whatever you want to the front end
                                    // this is where you can be creative
                                }
                            });
                        }
                        break;
                    } catch (Exception e) {
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");
                            }
                        });
                        e.printStackTrace();
                    }
                }
            } else {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus.setText("Couldn't detect internet connection.");
                    }
                });
            }
        } catch (Exception e) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    serverStatus.setText("Error");
                }
            });
            e.printStackTrace();
        }
    }
}

// gets the ip address of your phone's network
private String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); }
            }
        }
    } catch (SocketException ex) {
        Log.e("ServerActivity", ex.toString());
    }
    return null;
}

@Override
protected void onStop() {
    super.onStop();
    try {
         // make sure you close the socket upon exiting
         serverSocket.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
}

 }

logcat 错误;

01-22 18:37:40.100: E/ClientActivity(19568): C: Error
01-22 18:37:40.100: E/ClientActivity(19568): java.net.ConnectException: failed to connect to /10.0.2.15 (port 8080): connect failed: EHOSTUNREACH (No route to host)
01-22 18:37:40.100: E/ClientActivity(19568):    at libcore.io.IoBridge.connect(IoBridge.java:114)
01-22 18:37:40.100: E/ClientActivity(19568):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-22 18:37:40.100: E/ClientActivity(19568):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
01-22 18:37:40.100: E/ClientActivity(19568):    at java.net.Socket.startupSocket(Socket.java:566)
01-22 18:37:40.100: E/ClientActivity(19568):    at java.net.Socket.<init>(Socket.java:225)
01-22 18:37:40.100: E/ClientActivity(19568):    at com.example.client.ClientActivity$ClientThread.run(ClientActivity.java:60)
01-22 18:37:40.100: E/ClientActivity(19568):    at java.lang.Thread.run(Thread.java:856)
01-22 18:37:40.100: E/ClientActivity(19568): Caused by: libcore.io.ErrnoException: connect failed: EHOSTUNREACH (No route to host)
01-22 18:37:40.100: E/ClientActivity(19568):    at libcore.io.Posix.connect(Native Method)
01-22 18:37:40.100: E/ClientActivity(19568):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
01-22 18:37:40.100: E/ClientActivity(19568):    at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-22 18:37:40.100: E/ClientActivity(19568):    at libcore.io.IoBridge.connect(IoBridge.java:112)

【问题讨论】:

  • 在连接之前设置适当的权限:互联网权限
  • 已经获得了我的清单文件中设置的权限
  • 我只是将 logcat 错误消息放在我的问题底部
  • 我使用 java 方法获取本地 IP 地址,正如您告诉我的那样,并将其显示到文本视图。这是一个看起来很奇怪的 IP 地址,并非所有数字。就是这个; fe80::96db:c9ff:fe08:6f39%wlan0 对你来说这看起来像 IP 地址吗?
  • 我想知道这是否适用于 IP 版本 6 地址。这些是十六进制数字

标签: android sockets client-server


【解决方案1】:

当您将您的安卓设备连接到 WiFi 网络时,它会被分配一个 IP 地址。此 IP 地址在“设置 > 关于电话 > 状态 > IP 地址”下可见。现在,在您的情况下,服务器应用程序在一台平板电脑上运行,客户端在另一台平板电脑上运行。我们只需要服务器的IP地址,您可以使用此方法找到它。在客户端应用对应区域输入这个IP,就设置好了 .

【讨论】:

    【解决方案2】:

    1.通过网络(WIFI)连接两个设备 2.您可以通过在android中以编程方式获取每个设备的IP地址 3.并制作一个显示两个IP地址的文本视图 4.在两者中键入它并连接它

    【讨论】:

    • 你说“都输入”我以为我只输入一个IP地址,无论是客户端还是服务器,只有一个地方可以输入IP地址
    • 哦,对不起。只需输入一个..它会连接
    【解决方案3】:

    您应该在客户端输入服务器 IP 以请求连接。服务器侦听特定端口。如果您的服务器端应用程序显示 IP 地址,请将其放入客户端应用程序以建立连接。如果您的服务器应用程序没有显示任何内容,只需转到设置> 关于> 状态并找到 IP 地址。从您的服务器端代码中可以清楚地看到:

    serverStatus.setText("Listening on IP: " + SERVERIP);
    

    把它放到你的客户端中。

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 2014-05-26
      • 2019-03-26
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多