Android - 服务器套接字

6
我对Android中的Socket通信有一些问题。
1)我已经为Android开发了一个服务器套接字应用,它监听端口8888。
a)当我在模拟器上运行我的服务器时,由于模拟器和我PC上的客户端应用程序都在同一个网络上,我认为它们应该能够相互通信,但是我无法通过客户端应用程序与其通信。
b)当我在我的Android移动设备上部署相同的服务器应用程序,并尝试通过我PC上的相同客户端应用程序进行通信时,客户端应用程序会出现超时异常,因为它无法与之通信。
我的第一个问题是如何使用模拟器和1个Android设备来测试服务器/客户端套接字应用程序?我是否可以使用我的PC的客户端套接字应用程序来测试我的服务器套接字?
**我已经为其他应用程序准备了客户端套接字应用程序,因此客户端应用程序没有问题。
2)我第二个问题是如何在Android设备上测试我的服务器应用程序?我必须转发所需的端口吗? a)对于模拟器:我如何转发端口? b)对于设备:我如何转发端口? c)我可以编程转发端口吗?
**仅供参考:
我正在使用Eclipse作为Android开发工具。
**我的服务器代码可能也存在问题。
Socket socket = null;
            DataInputStream dataInputStream = null;
            DataOutputStream dataOutputStream = null;
            ServerSocket serverSocket = null;
        try
        {  
            serverSocket = new ServerSocket(SERVERPORT);
            System.out.println("Listening :" + SERVERPORT);
            System.out.println("Server IP:" + SERVERIP);
        }
        catch (Exception e) 
        {               
            e.printStackTrace();
        }
        while(true)
        {
            try
            {
                socket = serverSocket.accept();
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                System.out.println("ip: " + socket.getInetAddress());                   
                String str = in.readLine();
                System.out.println("message Received: " + str);
            } 
            catch (Exception e) 
            {                   
                e.printStackTrace();
            }               
            finally
            {
                if( socket!= null)
                {
                    try 
                    {
                        socket.close();
                    }
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }
                }
                if( dataInputStream!= null)
                {
                    try
                    {
                        dataInputStream.close();
                    }
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }
                }                   
                if( dataOutputStream!= null)
                {
                    try 
                    {
                        dataOutputStream.close();
                    }
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }
                }
            }
        }

编辑: 非常有趣的一点是,如果我将端口设置为8080,PC上的客户端套接字应用程序会连接到我的安卓设备上的安卓应用程序,但我没有在服务器上收到套接字或发送的数据。链接后什么也不会发生 => socket = serversocket.accept();

此外,我已在清单中设置了权限。


3个回答

10

您是否在Manifest.xml文件中设置了正确的权限?

<uses-permission android:name="android.permission.INTERNET" />

需要设置套接字


7

好的,这对我有用。现在唯一的问题是如何在我的安卓设备上运行同样的服务器? - KhanZeeshan
它就在我回答中提供的链接的开头。看一下解释redir add tcp:5000:6000的部分。它基本上将您PC IP地址上的端口5000转发到模拟器IP地址上的端口6000。因此,您的客户端应用程序将与PC地址和端口6000通信,而设备上的服务器套接字则在端口5000上侦听。 - Christian Garbin
好的,我的情况已经改变了,我把那个Socket服务器换成了Web服务器,现在我可以通过将端口从adb转发到模拟器中的浏览器中查询该Web服务器。但是如果我在我的Android设备上部署同一个应用程序,我无法从浏览器中查询相同的Web服务器。我该怎么办? - KhanZeeshan
链接已经失效,因此它们不应该被用作答案。 - Seth
1
@Seth:已修复链接,指向新页面。感谢您让我知道。我理解链接的风险。然而,它们周围的说明和细微差别并不那么简单。为了使其有用,我必须在此处复制整个页面。在这种情况下,链接将不得不起作用。 - Christian Garbin
显示剩余10条评论

0

感谢问题和答案。它帮助我找到了通往我的工作组合的狭窄道路。

这个过程比我们预期的要棘手得多。套接字客户端必须使用“127.0.0.1”而不是“192.168.0.15”或“10.0.2.15”来连接同一台计算机上的Android模拟器。以下是我尝试并成功的6个步骤。

步骤0:进入终端

步骤1:使用adb(Android Debug Bridge)查找Android模拟器控制台的端口号(在我的情况下,端口号为5554) /Users/zhijunsheng/Library/Android/sdk/platform-tools/adb devices List of devices attached 9357cefb device emulator-5554 device

步骤2:检索Android模拟器控制台的auth_token cat /Users/<my_home_dir>/.emulator_console_auth_token sncfmfC+Lg9OtAT4

步骤3:连接到Android模拟器控制台 telnet localhost 5554 Trying ::1... Connected to localhost. OK

步骤4:进行身份验证 auth sncfmfC+Lg9OtAT4

步骤5:添加重定向指令 redir add tcp:50000:50001

我还有在YouTube上的一段视频记录了我尝试的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接