Android - 服务器套接字

Kha*_*han 5 sockets port android emulation

我对Android中的套接字通信几乎没有疑问.

1)我开发了用于android的服务器套接字应用程序,用于侦听端口8888.

a)当我在模拟器上托管我的服务器时,我无法通过我的PC上的客户端应用程序与它进行通信,因为两个(模拟器和客户端)应用程序都在我的笔记本电脑上并且在同一网络上我认为它们应该是能够相互沟通.

b)当我在我的Android移动设备上部署相同的服务器应用程序并尝试通过我在PC上的相同客户端应用程序进行通信时,客户端应用程序会发出超时异常,因为它无法与之通信.

我的第一个问题是如何使用Emulator&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();
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

编辑: 一个非常有趣的部分是,如果我设置端口到8080 PC的客户端套接字应用程序连接到我的Android设备上的Android应用程序但我没有收到我的服务器上的套接字,也没有我发送的数据.在link => socket = serversocket.accept()之后没有任何反应;

我也在清单中设置了权限.


Mic*_*ele 9

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

<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)

是设置套接字的必要条件


Chr*_*bin 6

关于第一个问题,关于如何从仿真器访问网络:仿真器在自己的网络地址空间运行,与PC隔离.您必须配置网络重定向才能访问网络上的设备.

有关详细信息,请参阅https://developer.android.com/studio/run/emulator-networking.html