2011-09-17 145 views
5

我有几个关于Android中的套接字通信的问题。Android - 服务器套接字

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

一)当我主机上的模拟器我无法通过我的客户端应用程序进行通信,以它在我的服务器我因为两个(模拟器&客户端)应用程序都在我的笔记本电脑&在同一网络上,我认为他们应该能够相互沟通。

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

我的第一个问题是我如何测试服务器/客户端套接字应用与仿真器& 1 android设备?我甚至可以使用我的PC的客户套接字应用程序来测试我的服务器套接字?

**我有我的其他应用程序的客户端套接字应用程序,所以客户端应用程序没有问题。

2)我的第二个问题是测试我的服务器应用程序在Android设备上是否必须转发所需的端口? a)对于Emulator:我如何转发端口? b)对于设备:我如何转发端口? c)我可以通过编程方式转发端口吗?

**只为信息:

我使用Eclipse作为机器人的研究与开发工具。

**我的服务器代码也可能与我的服务器套接字代码有问题。

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应用都连接到Android应用程序在Android设备上,但我不我的服务器,也不是数据上的接收套接字我发送。链接后没有任何反应=>socket = serversocket.accept();

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


回答

6

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

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

+0

好的,为我工作,现在只剩下问题是我如何可以在我的Android设备上运行这个相同的服务器? – KhanZeeshan

+0

不知道我跟着这个问题。你的意思是你的情况1b以上?如果是这样,它应该工作正常,假设PC试图通过暴露于网络的端口(配置为转发的端口)连接。 – chr

+0

是的,只有问题没有回答是关于Android设备。当我在仿真器上转发端口时,它可以与PC的Socket设备通信,但我知道如何使该PC的客户端应用程序与部署在Android设备上的Android应用程序进行通信。 – KhanZeeshan

9

有你设定的Manifest.xml内正确的权限?

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

是needet设置插座

+0

是的,我有。对不起,我忘了提到这一点。 – KhanZeeshan