2011-05-20 71 views
0

是否可以使用套接字編程連接兩部手機? 我嘗試下面的代碼,但沒有奏效使用套接字連接兩部手機

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

    SERVERIP = getLocalIpAddress();//Public function to get ip address to it is //working fine 

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

你是什麼意思「它沒有工作」?發生了什麼? – Dave 2011-05-20 12:06:52

+0

是的,但它是不可能的,你將永遠無法通過直接插座連接兩個電話,通過電話提供商網絡連接,由於NAT等... – jkhouw1 2011-05-20 12:08:14

+0

我寫的代碼工作正常。 它顯示錯誤,因爲我沒有給權限互聯網 android.permission.INTERNET對 現在運轉 – 2011-05-20 12:29:17

回答

0

是的,這是可能的,但我認爲你應該做的第一件事就是閱讀了關於Java Socket programming,因爲有你的代碼,讓我覺得你沒有的幾個問題相當瞭解它呢。主要的問題是:

  1. 你的ServerSocket永遠不會接受連接,因此從來沒有真正的「傾聽」。
  2. 即使它正在偵聽,如果此代碼在兩個手機上都運行,它們都只能偵聽,並且不會主動與對方尋求連接。

您將需要在一部手機上實現一個客戶端,另一個服務器像@Deepak所示。

此外,您可能想要查看AsyncTaskthis article以更新來自非UI線程(而不是處理程序)的視圖。

最後,請確保您的應用在AndroidManifest.xml中包含android.permission.INTERNET權限。

+0

Thanx Gary ...我寫的代碼工作正常。 它顯示錯誤,因爲我沒有給互聯網許可 android.permission.INTERNET 它現在正在工作 – 2011-05-20 12:29:37

2

按socket編程的兩個客戶端套接字無法相互連接。同樣,兩個服務器套接字不能相互連接。你寫的代碼告訴你寫了服務器套接字。你需要一個連接到服務器套接字的客戶端套接字。創建客戶端套接字ü需要服務器套接字的IP和端口。請看下面的代碼。如果您發現回覆對您有用,請不要忘記投票。下面的例子是在覈心Java。你也可以在andriod中實現這兩者。

Server 
------- 
    import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 


class TCPServer 
{ 
    public static void main(String argv[]) throws Exception 
     { 
     String clientSentence; 
     String capitalizedSentence; 
     ServerSocket welcomeSocket = new ServerSocket(6789); 

     while(true) 
     { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = 
       new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      System.out.println("Received: " + clientSentence); 
      capitalizedSentence = clientSentence.toUpperCase() + '\n'; 
      outToClient.writeBytes(capitalizedSentence); 
     } 
     } 
} 



Client 
-------------- 
import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 


class TCPClient 
{ 
public static void main(String argv[]) throws Exception 
{ 
    String sentence; 
    String modifiedSentence; 
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost", 6789); 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    sentence = inFromUser.readLine(); 
    outToServer.writeBytes(sentence + '\n'); 
    modifiedSentence = inFromServer.readLine(); 
    System.out.println("FROM SERVER: " + modifiedSentence); 
    clientSocket.close(); 
} 
} 

感謝 迪帕克