Warm tip: This article is reproduced from serverfault.com, please click

android-服务器插座

(android - Server Socket)

发布于 2011-09-17 13:12:56

我对Android中的Socket Communication毫无疑问。

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

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();
                    }
                }
            }
        }

编辑: 一个非常有趣的部分是,如果我将端口设置为8080 PC的Client Socket App,则确实要连接到我的android设备上的Android App,但是我没有收到服务器上的套接字,也没有收到我发送的数据。链接=>套接字= serversocket.accept();之后什么也没有发生

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


Questioner
KhanZeeshan
Viewed
0
Christian Garbin 2018-02-22 09:40:04

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

https://developer.android.com/studio/run/emulator-networking.html中查看更多详细信息