2014-03-31 56 views
2

我试图开发一个Android应用程序,我陷入了这个问题。从一个Android设备获取字符串并发送到其他设备

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

我已经成功地从android设备获取位置数据,,但被卡在发送这个位置从android手机到我的电脑上的服务器。我的教授告诉我,我可以让我的电脑成为一台服务器。在连接android和我的mac之前,我试着连接两台电脑。我成功地使用Socket &连接我的imac和macbook,在http://www.tutorialspoint.com/java/java_networking.htm的底部找到SocketServer示例。这花了很长时间,因为我不知道我必须移除防火墙。

因此,我发现了另一个示例,将Android连接到使用Socket的电脑http://lakjeewa.blogspot.ca/2012/03/simple-client-server-application-for.html并尝试使用它。尽管可以连接两台电脑,但android不会连接到我的电脑。我认为这个问题是在代码

client = new Socket(serverName, port); 

我想对于servername很多东西,如计算机的IP地址以192.168开始,“本地主机”,10.0.2.2,HTTP:/ myIpAdressFoundByGoogling,“myComputerName.local”但没有工作。这里有什么问题? Android设备没有SIM卡,并且连接到与计算机相同的WiFi。我应该有XAAMPP? (我刚刚发现这个昨晚)并首先学习php?我完全失去了如何处理服务器。

我结束了这里,因为我想我可以测试和开发应用程序使用计算机作为服务器,当我完成开发时,我可以得到一个服务器(如亚马逊网络服务,我不知道),并取代代码中的服务器位置,并复制并粘贴服务器Java代码。 我可以这样做吗?也许谷歌应用引擎是一个可行的解决我的问题?

的客户端代码......

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(); 
    } 

    } 

} 

回答

0

您可能无法将您的Android设备连接到您的计算机,因为某些配置问题或代码中某处出现了问题。我之前成功地将消息从android设备发送到在我的笔记本电脑上运行的“服务器”,我使用与链接的示例非常相似的Socket和ServerSocket技术执行此操作。所以这是可能的。没有必要在任何一方安装额外的软件(Java运行时已经足够)。

如果计算机和Android设备都连接在同一个WiFi网络上,则应使用内部LAN地址。如果你在android模拟器上运行它,并且你想连接到主机(运行模拟器的计算机),你可以使用10.0.2.2或者只使用计算机地址(这也适用)。你使用什么端口?此端口是否在您的路由器设置,防火墙等上打开?

您不必学习PHP或App Engine就可以做你想做的事情。你可以,而且这些也可以让你做到这一点(我没有App Engine的经验,但我确信它可以)。至于PHP,您需要在您的机器上安装XAAMPP才能够将其用作服务器。

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

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

+0

我上传了代码。你可以看一下吗? – WarmInToronto

+0

你是否收到异常/崩溃?还是代码执行得很好,只是消息没有被发送? – Bob

+0

我刚刚收到“不幸的是,您的应用程序已停止。” FATAL EXCEPTION,android.os.NetworkOnMainThreadException和LogCat中的其他红线。 – WarmInToronto

0

我此刻服用Android开发类为好。我认为你应该看看Parse,这是一个免费的服务,为你免费提供所有的后端服务器。我们一直在使用它的应用程序。一旦你掌握了回调的工作方式,它很容易使用。否则,我会建议寻找像ruby在轨道上的某种Web框架,并写在你的后端。您可以将所有这些部署到heroku上,然后使用android异步讲话器评估您的后端。

相关问题