java - Android 客户端应用程序无法连接到 Java PC 服务器 - 无路由到主机错误

标签 java android sockets networking

我正在构建一个 Android 应用程序,它将与 PC 通信并交换数据。我主要通过几个示例来学习如何制作应用程序以及如何使用 Java 套接字。我一直试图开始工作的一个例子是:

http://lakjeewa.blogspot.com/2014/05/simple-android-client-server-application.html

我修改了上面代码中的一些内容(变量名称和按键功能),当我使用 IP 地址:10.0.2.2 并在模拟器中运行应用程序以及连接到专用网络的桌面上的服务器时,应用程序和服务器可以正常工作。我可以从模拟器上的应用程序向服务器发送消息,服务器会接收该消息。

但是,当我在笔记本电脑上运行服务器并在 Android 手机上运行客户端应用程序(两者都无线连接到另一个专用网络)时,我在 Android Studio 控制台中收到错误消息“没有到主机的路由”。我进入笔记本电脑命令终端并能够 ping 通我的手机。我已经用正确的 IPv4 地址和套接字替换了代码区域。我还将笔记本电脑和手机连接到另一个无线网络,但仍然无法建立连接。

可能是什么问题?我必须在代码中指定某些内容才能启用连接吗?或者我是否必须对网络或硬件设备进行一些操作才能建立连接?

请注意: Activity 、 list 和布局的代码与链接中所示的基本相同,除了变量名称更改之外,我删除了该函数:public boolean onCreateOptionsMenu(Menu menu)

感谢您的帮助!

编辑2 下面是我的android客户端源代码:

    import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Socket client;
    private PrintWriter printwriter;
    private EditText textField;
    private Button button;
    private String messsage;

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

        textField = (EditText) findViewById(R.id.editText1); // reference to the text field
        button = (Button) findViewById(R.id.button1); // reference to the send button

        // Button press event listener
        button.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                messsage = textField.getText().toString(); // get the text message on the text field
                textField.setText(""); // Reset the text field to blank
                SendMessage sendMessageTask = new SendMessage();
                sendMessageTask.execute();
            }
        });
    }

    private class SendMessage extends AsyncTask<Void, Void, Void> {

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

                client = new Socket("192.168.1.37", 4444); // connect to the server
                printwriter = new PrintWriter(client.getOutputStream(), true);
                printwriter.write(messsage); // write the message to output stream

                printwriter.flush();
                printwriter.close();
                client.close(); // closing the connection

            } catch (UnknownHostException e) {
                Context context = getApplicationContext();
                /* If I try to send a toast notification my app crashes
                String text = "Could not connect";
                int duration = Toast.LENGTH_SHORT;
                Toast notify = Toast.makeText(context, text, duration);
                notify.show();*/
                e.printStackTrace();
            } catch (IOException e) {
                Context context = getApplicationContext();
                /*String text = "Could not connect";
                int duration = Toast.LENGTH_SHORT;
                Toast notify = Toast.makeText(context, text, duration);
                notify.show();*/
                e.printStackTrace();
            }
            return null;
        }

    }
}

服务器源代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author alexc
 */
public class JavaServer {

    private static ServerSocket serverSocket;
    private static Socket clientSocket;
    private static InputStreamReader inputStreamReader;
    private static BufferedReader bufferedReader;
    private static String message;

    public static void main(String[] args) throws IOException {
        try {
            serverSocket = new ServerSocket(4444); // Server socket

        } catch (IOException e) {
            System.out.println("Could not listen on port: 4444");
        }

        System.out.println("Server started. Listening to the port 4444");
                int count = 0;
        while (count < 1000) {
                    count++;
            try {

                clientSocket = serverSocket.accept(); // accept the client connection
                inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader); // get the client message
                message = bufferedReader.readLine();

                System.out.println(message);
                inputStreamReader.close();
                clientSocket.close();

            } catch (IOException ex) {
                System.out.println("Problem in message reading");
            }
        }
                serverSocket.close();
    }

}

最佳答案

嘿,大家好,我得到了我 friend 的路由器,它是来自 Cisco 的 Linksys E1000 Wireless-N 路由器,并测试了我的 Android 应用程序和 Java 服务器,它可以工作。不知道确切的配置是什么,但这就是我所做的:

  1. 在路由器上启用 DHCP,否则您必须在 PC 和 Android 手机上设置静态 IP 地址

  2. 确保您的 PC 和 Android 手机能够在网络上被发现。我刚刚记得在我的电脑上连接到此路由器时,它询问我是否希望能够在网络上被发现

  3. 关闭防火墙(和防病毒软件),或保持您希望 Android 应用程序的所有连接通过的端口打开。

如果您仍然遇到问题,这里有一些常规故障排除提示(因为您使用的设备会有所不同):

  • 如果您没有为您的电脑或 Android 手机分配 IP 地址,并且已启用 DHCP,请尝试重置路由器(将其关闭然后再次打开;或完全重置系统)

  • 对于 Windows,打开命令提示符并输入 ipconfig 并找到您的 IPv4 地址。确保您输入的地址正确。然后在命令提示符下键入 ping 'android 手机的 IP 地址' 例如:

    ping 192.168.1.121

如果您收到响应,则表明您的手机已联网。

然后尝试 ping 为 ipconfig 找到的 IPv4 地址,如果您的手机可以 ping 通它,那么就一切顺利。如果无法 ping 通,请尝试关闭防火墙和防病毒软件。

无论如何,感谢大家的帮助和建议。希望这些建议有所帮助。

关于java - Android 客户端应用程序无法连接到 Java PC 服务器 - 无路由到主机错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40404806/

相关文章:

java - Appengine 端点 Maven 构建错误与/生成源

android - 在android程序中下载gmail附件

android - 我如何在android中的搜索栏中绘制可绘制的进度

Python、Asyncore 和 fork

java - Android 编辑文本被截断

java - 使用 Google AppEngine 创建 Java Web 服务

java - 使用socket java向另一个程序发送信号

linux - 为 Linux 套接字调用读取后会发生什么

java - TextView 数组不起作用?

android - 使用自定义 BaseAdapter 刷新 GridView 内容