2012-03-12 70 views
0

我想創建一個連接多個android設備的應用程序。這裏能夠從設備(使用Wifi網絡)連接到另一個設備(3G網絡)。我需要從使用3G網絡的設備連接到使用Wifi網絡的設備。如何我將使用3G網絡的設備連接到WiFi網絡。如何使用套接字編程連接Android設備?

Server Side: 

package com.server.org;

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.widget.TextView; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketException; 
import java.util.Enumeration; 

public class ServerActivity extends Activity { 

    private TextView serverStatus; 

    // default ip 
    public static String SERVERIP = "10.0.2.15"; 

    // designate a port 
    public static final int SERVERPORT = 9191; 

    private Handler handler = new Handler(); 

    private ServerSocket serverSocket; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     serverStatus = (TextView) findViewById(R.id.server_status); 

     SERVERIP = getLocalIpAddress(); 

     Thread fst = new Thread(new ServerThread()); 
     fst.start(); 
    } 

    public class ServerThread implements Runnable { 

     public void run() { 
      try { 
       if (SERVERIP != null) { 
        handler.post(new Runnable() { 

         public void run() { 
          serverStatus.setText("Listening on IP: " + SERVERIP); 
         } 
        }); 
        serverSocket = new ServerSocket(SERVERPORT); 
        while (true) { 
         // listen for incoming clients 
         Socket client = serverSocket.accept(); 
         handler.post(new Runnable() { 

          public void run() { 
           serverStatus.setText("Connected."); 

          } 
         }); 

         try { 
          BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
          String line = null; 
          while ((line = in.readLine()) != null) { 
           Log.d("ServerActivity", line); 
           handler.post(new Runnable() { 

            public void run() { 
             // do whatever you want to the front end 
             // this is where you can be creative 
            } 
           }); 
          } 
          break; 
         } catch (Exception e) { 
          handler.post(new Runnable() { 

           public void run() { 
            serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones."); 
           } 
          }); 
          e.printStackTrace(); 
         } 
        } 
       } else { 
        handler.post(new Runnable() { 

         public void run() { 
          serverStatus.setText("Couldn't detect internet connection."); 
         } 
        }); 
       } 
      } catch (Exception e) { 
       handler.post(new Runnable() { 

        public void run() { 
         serverStatus.setText("Error"); 
        } 
       }); 
       e.printStackTrace(); 
      } 
     } 
    } 

    // gets the ip address of your phone's network 
    private String getLocalIpAddress() { 
     try { 
      for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
       NetworkInterface intf = en.nextElement(); 
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
        InetAddress inetAddress = enumIpAddr.nextElement(); 
        if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } 
       } 
      } 
     } catch (SocketException ex) { 
      Log.e("ServerActivity", ex.toString()); 
     } 
     return null; 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     try { 
      // make sure you close the socket upon exiting 
      serverSocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 


Client Side: 

package com.client.org;

import java.io.BufferedWriter; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

public class ClientActivity extends Activity { 

    private EditText serverIp; 

    private Button connectPhones; 

    private String serverIpAddress = ""; 

    private boolean connected = false; 

    private Handler handler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     serverIp = (EditText) findViewById(R.id.server_ip); 
     connectPhones = (Button) findViewById(R.id.connect_phones); 
     connectPhones.setOnClickListener(connectListener); 
    } 

    private OnClickListener connectListener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (!connected) { 
       serverIpAddress = serverIp.getText().toString(); 
       if (!serverIpAddress.equals("")) { 
        Thread cThread = new Thread(new ClientThread()); 
        cThread.start(); 
       } 
      } 
     } 
    }; 

    public class ClientThread implements Runnable { 

     public void run() { 
      try { 
       InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
       Log.d("ClientActivity", "C: Connecting..."); 
       int SERVERPORT = 9191; 
       Socket socket = new Socket(serverAddr,SERVERPORT); 
       connected = true; 
       while (connected) { 
        try { 
         Log.d("ClientActivity", "C: Sending command."); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
            .getOutputStream())), true); 
          // where you issue the commands 
          out.println("Hey Server!"); 
          Log.d("ClientActivity", "C: Sent."); 
        } catch (Exception e) { 
         Log.e("ClientActivity", "S: Error", e); 
        } 
       } 
       socket.close(); 
       Log.d("ClientActivity", "C: Closed."); 
      } catch (Exception e) { 
       Log.e("ClientActivity", "C: Error", e); 
       connected = false; 
      } 
     } 
    } 

回答

0

您的概念稍微錯誤的軌道上。 3G連接意味着您的手機必須通過電話網絡連接,因此我不認爲您的手機會擁有靜態IP。我甚至不認爲今天的運營商爲電話連接提供了一個靜態的公共IP。

我建議你通過使用webservices的網絡服務器橋接這種溝通。您可以實施類似APE的解決方案,並使用這兩個設備連接到該服務器而不是彼此。

我希望幫助

+0

這裏我需要一個點對點的Android devices.I之間的連接可以進行通信,其使用從3G到WiFi WiFi.But連接在連接3G從設備不能正常工作的設備。 – Kishore 2012-03-12 06:54:49

+0

您是否在說您可以克服3G連接上的動態IP問題?請分享,如果你有。 回到您的問題,您的情況提示我通過WiFi路由器或路由中的任何其他節點阻塞傳入數據包。檢查路由器等防火牆,如果端口被阻止.. 我認爲你會有P2P類的要求。這就是爲什麼我建議APE是實時數據流解決方案的原因。還有其他基於PHP的解決方案更適合並且更容易實現。 – kishu27 2012-03-12 06:58:20

+0

端口轉發方法怎麼樣?你有什麼建議在java中實現這個方法嗎? – Kishore 2012-03-12 07:04:04

相關問題