Java 从一个android设备获取字符串并发送到其他设备

Java 从一个android设备获取字符串并发送到其他设备,java,android,Java,Android,我试图开发一个android应用程序,但我在这个问题上陷入了困境 我想将两个字符串值(经度、纬度)从一个android设备发送到具有相同应用程序的其他android设备。通过在线研究,我的理解是,android设备将这两个字符串发送到服务器,然后我可以使用google gcm将这些字符串发送到其他设备(我想)。也许服务器可以运行java,我可以编写一些程序来处理它以后接收到的数据 我已经成功地从安卓设备获取了位置数据,但是在将这个位置从安卓手机发送到我计算机上的服务器时遇到了困难。我的教授告诉我

我试图开发一个android应用程序,但我在这个问题上陷入了困境

我想将两个字符串值(经度、纬度)从一个android设备发送到具有相同应用程序的其他android设备。通过在线研究,我的理解是,android设备将这两个字符串发送到服务器,然后我可以使用google gcm将这些字符串发送到其他设备(我想)。也许服务器可以运行java,我可以编写一些程序来处理它以后接收到的数据

我已经成功地从安卓设备获取了位置数据,但是在将这个位置从安卓手机发送到我计算机上的服务器时遇到了困难。我的教授告诉我,我可以让我的计算机成为服务器。在连接android和mac之前,我试着连接两台电脑。我使用本手册底部的Socket&SocketServer示例成功连接了imac和macbook。这花了很长时间,因为我不知道我必须删除防火墙

所以我找到了另一个例子,使用Socket at将android连接到计算机,并尝试了一下。虽然可以连接两台计算机,但android不会连接到我的计算机。我认为问题在于代码

client = new Socket(serverName, port);
我尝试了很多服务器名的功能,比如以192.168“localhost”、10.0.2.2、http:/myipadressfoundbygoogle、“myComputerName.local”开头的计算机ip地址,但都不起作用。这里有什么问题?android设备没有sim卡,它与电脑连接到同一个wifi。我应该吃XAAMPP?(我昨晚才发现)先学习php?我完全不知道如何使用服务器

我来到这里是因为我想我可以用一台计算机作为服务器来测试和开发应用程序,当我完成开发后,我可以得到一台服务器(比如amazon web services,我还不确定),并在代码中替换服务器位置,复制和粘贴服务器java代码我可以这样做吗?也许Google App Engine是解决我问题的可行方案

客户端代码是

public class MainActivity extends Activity {

private Socket client;
private PrintWriter printwriter;
private EditText textField;
private Button button;
private String message;
private int port = 5555;
private String serverName = "192.168.?????"; I think this is where the problem is


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

    textField = (EditText) findViewById(R.id.editText1);
    button = (Button) findViewById(R.id.button1);

    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            message = textField.getText().toString();
            textField.setText("");

            try {
                // connect with server
                client = new Socket(serverName, port);
                printwriter = new PrintWriter(client.getOutputStream(),
                        true);
                printwriter.write(message);

                printwriter.flush();
                printwriter.close();
                client.close();

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });

    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
}
public class main {

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) {

    int port = 5555;
    try {
        serverSocket = new ServerSocket(port);
    } catch (IOException e) {
        System.out.println("could not listen on port: " + port);
        e.printStackTrace();
    }

    System.out.println("server started listening to the port " + port);

    while (true) {

    try {
        // accept the client connection
        clientSocket =serverSocket.accept();
        System.out.println("someone connected to the server");
        inputStreamReader = new InputStreamReader(clientSocket.getInputStream());

        //get the client meesage
        bufferedReader = new BufferedReader(inputStreamReader);
        message = bufferedReader.readLine();

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

    } catch (IOException e) {
        System.out.println("problem in reading the message");
        e.printStackTrace();
    }

    }

}
服务器代码是

public class MainActivity extends Activity {

private Socket client;
private PrintWriter printwriter;
private EditText textField;
private Button button;
private String message;
private int port = 5555;
private String serverName = "192.168.?????"; I think this is where the problem is


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

    textField = (EditText) findViewById(R.id.editText1);
    button = (Button) findViewById(R.id.button1);

    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            message = textField.getText().toString();
            textField.setText("");

            try {
                // connect with server
                client = new Socket(serverName, port);
                printwriter = new PrintWriter(client.getOutputStream(),
                        true);
                printwriter.write(message);

                printwriter.flush();
                printwriter.close();
                client.close();

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });

    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
}
public class main {

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) {

    int port = 5555;
    try {
        serverSocket = new ServerSocket(port);
    } catch (IOException e) {
        System.out.println("could not listen on port: " + port);
        e.printStackTrace();
    }

    System.out.println("server started listening to the port " + port);

    while (true) {

    try {
        // accept the client connection
        clientSocket =serverSocket.accept();
        System.out.println("someone connected to the server");
        inputStreamReader = new InputStreamReader(clientSocket.getInputStream());

        //get the client meesage
        bufferedReader = new BufferedReader(inputStreamReader);
        message = bufferedReader.readLine();

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

    } catch (IOException e) {
        System.out.println("problem in reading the message");
        e.printStackTrace();
    }

    }

}

我现在也在上安卓开发课程。我认为你应该研究一下Parse,它是一个免费的服务,为你提供所有后端服务器的东西,是免费的。我们一直在应用程序中使用它。一旦掌握了回调的工作原理,就很容易使用。否则,我建议研究一些web框架,比如RubyonRails,并用它编写后端。您可以将所有这些部署到heroku上,然后使用android async talker评估您的后端。

您可能无法将android设备连接到您的计算机wither,因为存在一些配置问题或一端的代码有问题。我以前曾成功地将消息从android设备发送到运行在笔记本电脑上的“服务器”,我使用Socket和ServerSocket技术实现了这一点,与您链接的示例非常类似。所以这是完全可能的。双方都不需要安装额外的软件(Java运行时就足够了)

如果计算机和android设备都连接在同一个wifi网络上,则应使用内部LAN地址。如果您在android emulator上运行此功能,并且希望连接到主机(运行该emulator的计算机),则可以使用10.0.2.2或仅使用计算机地址(这也适用)。你在使用哪个端口?您的路由器设置、防火墙等上的此端口是否打开

您不必学习PHP或应用程序引擎来完成您正在尝试做的事情。你可以,这些也可以让你做到这一点(我没有应用程序引擎的经验,但我很确定它可以)。至于PHP,您需要在您的机器上安装XAAMPP,才能将其用作服务器

另一个问题是:如果你打算把它放在服务器上,你应该检查你将拥有/需要什么类型的服务器。例如,一个简单的托管包很可能不允许您在那里运行自己的java代码,但可能允许您运行PHP脚本


如果您发布客户端和服务器的网络代码,您将能够获得比我的一般和顶级答案更准确的反馈。

您是否尝试通过Web服务连接到服务器,然后在应用程序中使用该Web服务?我已经成功地将我的设备连接到我的笔记本电脑

请看这篇男生教程:


我相信这是将设备与服务器通信时的最佳做法。

您是否遇到任何异常/崩溃?或者代码执行得很好,只是消息没有被发送?我只是得到“很遗憾,您的应用程序已停止”。致命异常、android.os.NetworkOnMainThreadException和LogCat中的其他红线。好的!我知道问题所在。您的网络代码在侦听器中,侦听器在主线程上运行,但是您不能在主线程上进行网络,您需要做的是:在侦听器中启动一个新线程或异步任务,并将网络代码移动到那里。。。