0

我正在实现这个例子

http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

这显示了如何在两部安卓手机之间进行服务器客户端通信。我已经让它工作了,但我想尝试修改一下。目前程序设置的方式,客户端只向服务器发送消息。我试图修改它,以便服务器也可以发送到客户端,客户端也可以监听。我在两部手机上都有一个计时器,它增加了一个计数器,我只是希望它们来回共享它们的计数器值。不过,我在这样做时遇到了一些困难。

在服务器端,收到客户端的消息后,我决定添加一个 printwriter out = new PrintWriter(client.getOutputStream(), true);

然后在 while 循环中,我们从客户端读取输入,在我刚刚添加的可运行代码中 out.println("hello client");

代码似乎没有崩溃,所以我想这很好。那么现在我正在查看客户端。我意识到在单独的线程上运行套接字代码很重要,因为它是“阻塞的”。但是,该示例中的客户端代码似乎没有使用处理程序,我想知道为什么。我尝试在客户端代码中放置一个缓冲读取器,然后发布一个新的可运行文件,就像服务器代码一样。我把它放在与客户端有它的 printwriter 相同的 try catch 块中

 in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                     n=in.readLine();


                    if(n!=null)
                    {
                        handler.post(new Runnable() {
                            @Override
                            public void run() {

                                fromserver.setText(n);
                            }
                        });
                        //

                    }

不过,我发现有趣的是,当这种情况发生时,我的服务器代码通常会更新它收到的客户端计数器值,并且它自己的计数器值不再更新。它确实说它是连接的。我已经对其进行了编程,因此除非它收到来自客户端的消息,否则它不会设置其文本标签;这一定意味着客户端不再发送消息。我想知道我在客户端做错了什么。

重申一下,我想要做的是让服务器和客户端来回发送信息。而且我认为我必须在某个地方阻塞一个线程。我不确定。有人能告诉我如何正确地进行这种来回沟通吗?根据彼得的说法,我可以接受它只能在本地网络上工作。我通过无线路由器连接了两部手机。

谢谢

4

1 回答 1

0

附注:移动网络使用NAT。NAT 阻止启动入站(互联网到设备)连接。这有效地防止了移动设备托管服务器。

您的方法仅适用于本地网络。

于 2011-09-10T19:37:19.883 回答