在 Android 中连接 2 个模拟器实例

2023-11-27

我想在2个模拟器中创建一个服务器和一个客户端来写入和读取数据。 我为服务器编写代码:

public class ServerActivity extends Activity {
    /** Called when the activity is first created. */
 private ServerSocket serverSocket = null;
 private TextView tv;
 public static final int SERVERPORT = 4444;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv= (TextView) findViewById(R.id.myTextView);
        try {
   Connect();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   tv.setText("Not connected");
   e.printStackTrace();
  }
    }

    public void Connect() throws IOException
    {
     serverSocket = new ServerSocket();
     serverSocket.bind(new InetSocketAddress("10.0.2.15", 4444));
     while(true)
     {
      Socket socket = serverSocket.accept();
      tv.setText("Connected...");
     }


    }

和客户端代码

public class ClientActivity extends Activity {
    /** Called when the activity is first created. */
 private Button bt;
 private TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        bt = (Button) findViewById(R.id.myButton);
        tv = (TextView) findViewById(R.id.myTextView);
        bt.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
    // TODO Auto-generated method stub
    try {
     Socket socket  = new Socket("10.0.2.2", 4445);
    } catch (UnknownHostException e) {
     // TODO Auto-generated catch block
     tv.setText("Error1");
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     tv.setText("Error2");
     e.printStackTrace();
    }

   }
  });
    }
}

我设置了重定向:

telnet localhost 5554
redir add tcp:4445:4444

但它没有连接......请帮助我。我很感激。


一段时间后我就成功了。我没有在服务器或客户端中对 10.0.2.15 进行任何引用。我以不同的方式打开服务器套接字,并在单独的线程中处理通信。我在模拟器 5554 上运行服务器,在 5556 上运行客户端。

我的服务器代码,监听 6000

public class SocketServer extends Activity {
   ServerSocket ss = null;
   String mClientMsg = "";
   Thread myCommsThread = null;
   protected static final int MSG_ID = 0x1337;
   public static final int SERVERPORT = 6000;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      TextView tv = (TextView) findViewById(R.id.TextView01);
      tv.setText("Nothing from client yet");
      this.myCommsThread = new Thread(new CommsThread());
      this.myCommsThread.start();
   }

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

   Handler myUpdateHandler = new Handler() {
      public void handleMessage(Message msg) {
         switch (msg.what) {
         case MSG_ID:
            TextView tv = (TextView) findViewById(R.id.TextView01);
            tv.setText(mClientMsg);
            break;
         default:
            break;
         }
         super.handleMessage(msg);
      }
   };
   class CommsThread implements Runnable {
      public void run() {
         Socket s = null;
         try {
            ss = new ServerSocket(SERVERPORT );
         } catch (IOException e) {
            e.printStackTrace();
         }
         while (!Thread.currentThread().isInterrupted()) {
            Message m = new Message();
            m.what = MSG_ID;
            try {
               if (s == null)
                  s = ss.accept();
               BufferedReader input = new BufferedReader(
                     new InputStreamReader(s.getInputStream()));
               String st = null;
               st = input.readLine();
               mClientMsg = st;
               myUpdateHandler.sendMessage(m);
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }
   }
}

我重定向了与你类似的端口

telnet localhost 5554
redir add tcp:5000:6000

我的客户端代码在端口 5000 上建立连接:

public class SocketClient extends Activity {
   private Button bt;
   private TextView tv;
   private Socket socket;
   private String serverIpAddress = "10.0.2.2";
   // AND THAT'S MY DEV'T MACHINE WHERE PACKETS TO
   // PORT 5000 GET REDIRECTED TO THE SERVER EMULATOR'S
   // PORT 6000
   private static final int REDIRECTED_SERVERPORT = 5000;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      bt = (Button) findViewById(R.id.myButton);
      tv = (TextView) findViewById(R.id.myTextView);

      try {
         InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
         socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
      } catch (UnknownHostException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }

      bt.setOnClickListener(new OnClickListener() {

         public void onClick(View v) {
            try {
               EditText et = (EditText) findViewById(R.id.EditText01);
               String str = et.getText().toString();
               PrintWriter out = new PrintWriter(new BufferedWriter(
                     new OutputStreamWriter(socket.getOutputStream())),
                     true);
               out.println(str);
               Log.d("Client", "Client sent message");

            } catch (UnknownHostException e) {
               tv.setText("Error1");
               e.printStackTrace();
            } catch (IOException e) {
               tv.setText("Error2");
               e.printStackTrace();
            } catch (Exception e) {
               tv.setText("Error3");
               e.printStackTrace();
            }
         }
      });
   }
}

服务器有一个 TextView 来接收消息,客户端有一个 EditText 来撰写消息以及一个按钮来发送消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 中连接 2 个模拟器实例 的相关文章

  • APK META-INF/library_release.kotlin_module 中复制的重复文件

    我最近通过 JitPack 添加了两个 Android 库 但出现以下错误 Duplicate files copied in APK META INF library release kotlin module 我已经清除了缓存 并尝试使
  • Whatsapp 在 Android 中共享音频文件时正在剪切音频文件

    我在共享格式不是 mp3 的音频文件时遇到问题 文件被共享 但长度较短 例如 如果文件有 10 秒 则仅共享 5 秒 如果我使用 mp3 格式 它会完全共享 但其他格式会出现问题 注意 该文件在其他应用程序 如Messenger 中共享没有
  • 为网络和/或持久存储序列化 Android Bundle?

    我需要序列化一个全面的应用程序 游戏 状态 以便通过网络传输或保存到磁盘并在以后检索 当然 捆绑包用于在多个用例中保存 恢复状态 因此使用它们将是理想的选择 但是 由于某种原因 Bundle 不可序列化 寻找解决方案只发现了将 Bundle
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在
  • 从Asynctask返回结果

    如果我的 Android 应用程序中有这个后台工作文件 并且它从我的数据库获取数据 我如何将字符串 结果 传递给另一个类 后台工作人员连接到我的服务器 然后使用 php 连接到数据库 public class BackgroundWorke
  • 明文 HTTP 流量...不允许

    我的程序从用户那里获取一个 URL 因此它可以向互联网上的任何网站发出请求 我试图让这成为可能 我查找了有关 Android HTTP Cleartext 错误的所有答案 并做了这个 但它仍然不允许我连接我的测试本地 PHP 服务器 我在这
  • 在 Android 中关闭 Spinner 中的下拉菜单

    在 Android 中打开和关闭微调器时 我需要为箭头图标设置动画 打开微调器时我可以旋转箭头 我只是放了一个setOnTouchListener on the Spinner 当下拉菜单关闭或隐藏时 问题就来了 因为我不知道如何在该操作上
  • Android Things 文件系统

    我正在 Android 上构建这个应用程序 我希望能够让它访问 U 盘上的媒体文件 甚至树莓派的 SD 卡上的媒体文件 我还不知道我将如何处理这些文件 但我只是想知道它是否可能 如果不是这样也没关系 我还有其他解决方案 但我想我会先从明显的
  • Twitter 集成期间获取访问令牌函数行为不当

    我只是想使用 twitter4j 从我的 Android 应用程序向 Twitter 分享文本 首先 我尝试的是我创建了一个新项目 并且这个特定的代码运行成功 然后我在我的应用程序中混合了该特定代码 登录 Twitter 成功完成 之后我发
  • 将 ArrayList 保存在捆绑包 savingInstanceState 中

    ArrayList 是在类级别定义的 这些是我保存的实例方法 Override protected void onSaveInstanceState Bundle outState super onSaveInstanceState out
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • NoClassDefFoundError:com.google.firebase.FirebaseOptions

    我继续得到NoClassDefFoundError在我正在使用的其他测试设备 4 4 2 上 但在我的测试设备 Android 5 1 上运行良好 我尝试了用谷歌搜索的解决方案 但似乎没有任何效果 我正在使用 Firebase 实时数据库
  • UnsupportedOperationException:特权进程中不允许使用 WebView

    我在用android sharedUserId android uid system 在我的清单中获得一些不可避免的权利 从 HDMI 输入读取安卓盒子 http eweat manufacturer globalsources com s
  • 改造Android基本且简单的问题

    我的服务器返回简单的 Json 结果 如下所示 message Upload Success 我正在尝试将结果放入改造模型类中 public class MyResponse SerializedName message String me
  • Android 将菜单项在操作栏中向左对齐

    我的应用程序中有一个操作栏 它显示我定义的菜单项res menu activity main xml 我的菜单项在操作栏上向右对齐 我希望它们左对齐 我为此找到的唯一解决方案使用了自定义操作栏 如下所示 将菜单项放置在 Honeycomb
  • 在Android中提取视频帧

    我想知道是否可以从 Android 中正在运行的视频中提取帧 我需要定期提取帧并将其发送以进行进一步处理 有人能为我找到答案吗 Thanks Abhi 您可以使用媒体元数据检索器 http developer android com ref
  • android-如何在谷歌地图上将标记的位置显示为地址

    我已经尝试过 commonsware googlemapsv2 教程 特别是在地图上拖动标记 但现在另一个问题困扰着我 问题是如何将标记的当前位置显示为地图下方或上方的地址 字符串 这是我使用的代码 public class MainAct

随机推荐

  • Shell脚本调用sudo;如何抑制密码提示

    我正在编写一个简单的 shell 脚本来更改网络硬件的 mac 地址 其中一行是 sudo ifconfig eth0 hw ether 00 99 99 00 00 00 我的问题是 sudo 脚本提示输入密码 有什么方法可以在不提示用户
  • 在 Windows 启动时启动 wpf 应用程序

    我开发了一个 WPF 应用程序 现在我必须在 Windows 启动时启动该应用程序 为此 我编写了以下代码 我从那里得到了解决方案这个答案 它正在注册表中添加密钥 但不启动应用程序 Microsoft Win32 RegistryKey k
  • 如何获取程序路径[重复]

    这个问题在这里已经有答案了 可能的重复 如何在C中找到可执行文件的位置 我正在使用 GTK 用 C 编写一个多平台应用程序 但遇到了问题 我必须获取程序路径 例如 当程序处于 home user program or C Users use
  • JavaFX:尝试通过 MediaPlayer 类播放 mp3 文件时“工具包”未初始化

    我正在尝试使用以下命令在程序后台播放简单的 mp3 Media med new Media getClass getResource intro mp3 toExternalForm MediaPlayer mPlayer new Medi
  • 如何在android中进行表单验证

    我有一份注册表 需要在提交前进行验证 该表格包含以下字段 姓名 电子邮件 联系电话和密码 我需要名称有一个值 电子邮件有正确的格式 联系电话应该是至少 10 个数字的数字 密码至少有 6 个字符 try this vUsername etU
  • 两个java文件。使用 main 方法运行类并尝试从其他文件访问方法时出现 IllegalAccessError

    学习Java 我有两个文件 每个文件包含一个 java 类 当我使用 main 方法运行该文件时 出现以下错误 线程 main 中出现异常 java lang IllegalAccessError 无法从 TapeDeckTestDrive
  • 如何从“gem”中获取不在“lib”目录下的文件?

    我想为我的rubocop定制警察 这个 gem 定义了方便的助手here 我想要求它 如何实现什么 我尝试过使用Gem find files 这使我能够要求该 gem 中的任何文件 但仅限于lib目录 例如 this requires ge
  • “javascript:;” HTML 锚标记中的 href 属性

    Update 下面的代码的含义和作用是什么 它需要 JavaScript 才能工作吗 a href Do Somthing a Update 等于以下吗 a href Do Somthing a 使用 javascript 作为链接的 hr
  • 大众运输消息输入错误

    我尝试通过 MassTransit 发布的消息遇到了基本类型问题 考虑以下 Serializable public abstract class Event CorrelatedBy
  • 如何在JSP中循环遍历HashMap?

    我怎样才能循环遍历HashMap in JSP
  • EventKit - 添加带有 2 个警报的 EKEvent 时应用程序冻结 (iOS 5)

    我有一个应用程序 可以通过编程方式将提醒添加到 iOS 设备的日历中 在 iOS 5 之前 我可以添加一个带有两个闹钟的日历项目 EKEventStore eventStore EKEventStore alloc init EKEvent
  • 为什么在 django 中运行syncdb时没有创建celery_taskmeta和其他表?

    我正在尝试设置 celery 和 django 但未创建 celery taskmeta 表 我遵循了许多 最近的 教程 将 djcelery 和 djkombu 添加到我的安装应用程序中 将 BROKER TRANSPORT djkomb
  • C# 类构造函数默认值问题

    我有以下课程 public class Topic public string Topic get set public string Description get set public int Count get set 我希望在使用以
  • 使类中的方法全部静态

    我的同事根据我的一个类 它是一个实例类 告诉我 如果您的类中没有字段 支持字段 只需将类中的所有方法设为静态或将类设为单例 以便您不必使用关键字 new 来调用此 BL 类中的方法 我认为这是常见且良好的做法 基本的面向对象编程 我只是想看
  • 无需 root 的 Python XML 解析

    我想解析一个相当大的类似 xml 的文件 它没有任何根元素 文件的格式为
  • 为什么版本 4 GUID 的第 17 位数字仅限于 4 种可能性?

    我知道这并不会减少所涉及的熵的很大一部分 而且即使 GUID 的另一个字符被保留 出于任何目的 我们仍然有足够的空间让每只昆虫拥有一个 所以我并不担心 只是好奇 As 这个很好的答案表明 版本4生成 GUID 的算法具有以下格式 xxxxx
  • Windows 上的 Git:强制使用 OpenSSH

    我安装了适用于 Windows 的 git 当出现选择 Putty 或 OpenSSH 的选项时 我选择了 OpenSSH 然而 我确实安装了 putty 并且 git 似乎发现了这一点并正在尝试使用它 我的环境变量中有GIT TRACE
  • 覆盖一个 django 表单元素上的数据验证

    我的表单上有一个选择列表下拉框 其中填充了来自模型 董事 的数据 这个下拉菜单的值不需要保存 它实际上仅用于动态触发表单的另一个元素 标题为 电影 的下拉列表 因此 当用户选择导演时 它会使用附加到该导演的电影动态填充第二个列表 第一个列表
  • 使用按钮调用 python 函数

    我希望能够单击 html 中的按钮并调用 python 函数 我努力了this它有效 但仅适用于文本 而且我已经看到了here您可以在按钮的操作中使用函数名称 但它不起作用 我不知道为什么 我不想在单击按钮后转到另一个页面 我想留在同一页面
  • 在 Android 中连接 2 个模拟器实例

    我想在2个模拟器中创建一个服务器和一个客户端来写入和读取数据 我为服务器编写代码 public class ServerActivity extends Activity Called when the activity is first