2016-07-22 34 views
1

我试图建立一个Android应用程序,其中两个手机将能够发送短信给对方而没有数据或蜂窝连接,而是使用WiFi连接。我找到here,我需要首先创建一个p2p(wifidirect)连接,然后尝试使用服务器套接字等待客户端连接并发送数据。现在,我可以建立p2p连接,但我不能使用套接字来传输数据。在客户端和服务器端,我在我的onPostExecute()方法中得到空结果。我应该如何建立服务器和客户端?无法连接到服务器套接字来传输数据android

我在MainActivity中创建了每个类的对象来启动客户端和服务器端。它们都以背景方法执行。

Client task = new Client(MainActivity.this,d.deviceAddress); 
task.execute(); 

sever task = new server(MainActivity.this); 
       task.execute(); 

这里是我的服务器端:

public class server extends AsyncTask<String, String, String>{ 

    InputStream inputstream ; 
    Socket client; 
    ByteArrayOutputStream result; 
    byte[] buffer; 
    private Context context; 
    public static InetAddress address; 
    public static boolean connected; 

    public server(Context context) { 
     this.context = context; 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     ServerSocket serverSocket; 

     //byte[] ipAddress={'5','4','3','1'}; 

     try { 

       address = InetAddress.getByName("hazel");// i tried to use getByAddress(ipAddress) as well ,no change 
       serverSocket = new ServerSocket(8888,10,address); 
       // serverSocket.setSoTimeout(10000); 
       client = serverSocket.accept(); 
       connected =true; 


      } catch (IOException e) { 
       return null; 
      } 
     return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

      if (result != null) { 
       super.onPostExecute(result); 
       Toast.makeText(context, "result is "+result,Toast.LENGTH_LONG).show(); 
       } 
       Toast.makeText(context, " is someone connected "+ connected ,Toast.LENGTH_LONG).show(); 
     } 

} 

下面是客户端:

public class Client extends AsyncTask<String, String, String> { 

    Context ctx; 
    String deviceAddress ; 
    String sek; 
    boolean isresolved = false; 
    InetAddress inetaddress; 


     Client task = new Client(MainActivity.this,d.deviceAddress); 
     task.execute(); 
    public Client(MainActivity ctx, String deviceAddress) { 

     this.ctx = ctx; 
     this.deviceAddress = deviceAddress; 

    } 


    @Override 
    protected String doInBackground(String... arg0) { 

       String host="hazel"; 
       int port=8888; 

       int len; 
       Socket socket = new Socket(); 
       byte buf[] = new byte[1024]; 

       try { 

         socket.bind(null); 

        // byte[] ipAddress={'5','4','3','1'}; 

        inetaddress = InetAddress.getByName("hazel"); 
        InetSocketAddress address = new InetSocketAddress(inetaddress,8888); 


        isresolved = address.isUnresolved(); 
        // the isresolved will get false value after executing the code 
        // i think it means that adress has no problem 


        socket.connect(address,1000); 



       } catch (SecurityException e) { 
        Log.v("Exception" , "is " + e); 

       } catch (Exception e) { 
        Log.v("Exception" , "is " + e); 

       } 

       finally { 
        if (socket != null) { 
         if (socket.isConnected()) { 
          try { 
           socket.close(); 
          } catch (IOException e) { 

           Log.v("Exception " , "is " + e); 
          } 
         } 
        } 
       }  

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     if (result != null) {    
      super.onPostExecute(result); 
      Toast.makeText(ctx, "clientside , result : "+result ,Toast.LENGTH_LONG).show(); 
      }else Toast.makeText(ctx, "result is null :(" , result : "+result ,Toast.LENGTH_LONG).show(); 
    } 

} 

当我运行服务器端的onPostExecute将与空结果被调用。我期待在连接到服务器的人之后调用onPostExecute。

在客户端,我在onPostExecute方法上得到一个空结果,同时也是未解析的方法返回false。

我需要首先连接到服务器发送数据,所以任何人都可以指出我的逻辑有什么问题?我尝试以不同的方式创建套接字(例如端口,带主机名的端口,带有IP地址的端口)并放入serverSocket.accept(),但它不起作用。

回答

0

以及它很伤心,我不得不回答我的问题,但在p2p连接ip永远是恒定的。其“192.168.49.1”。所以我刚刚创建了一个如下的套接字:

clientSocket = new Socket(“192.168.49.1”,9889);

它不管你是否在doInBackgroundmethod或新线程中运行你的代码,但端口必须相同

0
  1. doInBackground不会返回任何东西,但null,所以onPostExecute不看别的
  2. 如果您希望服务器持续运行和侦听连接,你需要一个线程/服务无限运行和接受连接。 AsyncTask旨在运行短期任务。
  3. 例如,您可能想要查看更多有关回调的反应式编程方法,例如onClientConnect()方法。
相关问题