【问题标题】:Connect Android Application to PC Application via LAN通过 LAN 将 Android 应用程序连接到 PC 应用程序
【发布时间】:2015-10-04 05:04:07
【问题描述】:

我正在我的 Android 设备上通过视频游戏环境(Unity,基本上是一个 C# 库)运行应用程序。我希望此应用程序能够响应来自我的 PC 的命令(最好运行 Windows 8,但如果更简单,也可以是 Linux:Ubuntu)。设备和 PC 在同一个 LAN 上,但没有通过物理电缆连接。我需要设备在命令发出后 0.5 秒内响应来自 PC 的命令。

问题:在我的 PC 和我的设备之间建立这种连接的最简单(从概念上和实际上)方法是什么?

示例场景:我在我的 Android 手机上运行一个游戏,蜘蛛在我的屏幕上爬行。当我在我的电脑上点击空间时,我希望所有的蜘蛛都被拍掉。

当前解决方案:创建一个 ruby​​-on-rails 网站和数据库。当在 PC 上输入命令时,数据库将使用该命令进行更新。每隔 0.5 秒,设备会检查数据库上的时间戳并提取任何新命令。这个解决方案不是最理想的,因为我不了解 ruby​​(我愿意学习它,但我想要一个更简单的解决方案)。

我应该为此使用 C# 套接字吗?

我会喜欢一些简单的代码,例如,它会打开我的 PC 和我的设备之间的直接连接,这将允许我发送字节流(例如,我的 PC 可以发送字符串“空格键被按下”)。

我在网络方面没有受过良好教育,希望能得到简单的解释。

【问题讨论】:

    标签: c# android networking lan


    【解决方案1】:

    与 PC 和移动设备通信的最佳方式是简单的套接字。 在特定端口号的一侧创建服务器套接字并从另一侧连接它。 速度非常快(甚至不到 0.1 秒)

    示例:

    服务器(在移动端)

    public class Provider{
        ServerSocket providerSocket;
        Socket connection = null;
        ObjectOutputStream out;
        ObjectInputStream in;
        String message;
        Provider(){}
        void run()
        {
            try{
                //1. creating a server socket
                providerSocket = new ServerSocket(2004, 10);
                //2. Wait for connection
                System.out.println("Waiting for connection");
                connection = providerSocket.accept();
                System.out.println("Connection received from " + connection.getInetAddress().getHostName());
                //3. get Input and Output streams
                out = new ObjectOutputStream(connection.getOutputStream());
                out.flush();
                in = new ObjectInputStream(connection.getInputStream());
                sendMessage("Connection successful");
                //4. The two parts communicate via the input and output streams
                do{
                    try{
                        message = (String)in.readObject();
                        System.out.println("client>" + message);
                        if (message.equals("bye"))
                            sendMessage("bye");
                    }
                    catch(ClassNotFoundException classnot){
                        System.err.println("Data received in unknown format");
                    }
                }while(!message.equals("bye"));
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
            finally{
                //4: Closing connection
                try{
                    in.close();
                    out.close();
                    providerSocket.close();
                }
                catch(IOException ioException){
                    ioException.printStackTrace();
                }
            }
        }
        void sendMessage(String msg)
        {
            try{
                out.writeObject(msg);
                out.flush();
                System.out.println("server>" + msg);
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
        public static void main(String args[])
        {
            Provider server = new Provider();
            while(true){
                server.run();
            }
        }
    }
    

    和客户端(PC - C#)

    class ClientThread implements Runnable 
    {   
        public void run() 
        {
            try 
            {
                Socket socket = new Socket(serverIpAddress, serverPort);
                socket.setSoTimeout(5000);
    
                while (true) 
                {
                    try 
                    {
                        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                        Log.d("Nicklas", "Out it goes");
                        out.println(Command);
    
                        if (Command == "CMD:GetOptions<EOF>")
                        {
                            Log.d("Nicklas", "Getting options");
                            try
                            {
                                Log.d("Nicklas", "Line 1");
                                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                                Log.d("Nicklas", "Line 2");
                                String answer = in.readLine();
                                Log.d("Nicklas", "answer = " + answer );
                            }
                            catch (Exception ee)
                            {
                                Log.d("Nicklasasasas", ee.toString());
                            }
                        }
                        break;
    
                    } 
    
                    catch (Exception e) 
                    {
                        Log.d("Nicklas", "CAE = " + e.toString());
                        break;
    
                    } 
                }
                socket.close();
            } 
            catch (ConnectException ee)
            {
                Log.d("Nicklas", "Kunne ikke forbinde");
    
            }
            catch (Exception e) 
            {
                Log.d("Nicklasssssss", e.toString());
            }
        }
    }
    

    上面的示例代码是从这个SO 和这个SO 线程复制而来的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2019-09-08
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2021-06-20
      相关资源
      最近更新 更多