Android TCP/IP Socket Test

TCP/IP協議Transmission Control Protocol/Internet Protocol的簡寫,中譯名爲傳輸控制協議/因特網互聯協議,又名網絡通信協議,是Internet最基本的協議、Internet國際互聯網絡的基礎,由網絡層的IP協議和傳輸層的TCP協議組成。TCP/IP 定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的網絡來完成本身的需求。通俗而言:TCP負責發現傳輸的問題,一有問題就發出信號,要求從新傳輸,直到全部數據安全正確地傳輸到目的地。而IP是給因特網的每一臺電腦規定一個地址。 設計模式

Wikipedia的解釋:TCP/IP協議,包含了一系列構成互聯網基礎的網絡協議。這些協議最先發源於美國國防部的ARPA網項目。TCP/IP模型也被稱做DoD模型(Department of Defense Model)。TCP/IP字面上表明了兩個協議:TCP(傳輸控制協議)和IP(網際協議)。 安全

W3Schools的解釋: 網絡

TCP/IP is the communication protocol for communication between computers on the Internet. electron

TCP/IP stands for Transmission Control Protocol / Internet Protocol. socket

TCP/IP defines how electronic devices (like computers) should be connected to the Internet, and how data should be transmitted between them. ide

 

什麼是Socket? 佈局

Socket是應用層與TCP/IP協議簇通信的中間抽象層,Socket是一組接口,在設計模式中,Socket的設計就是門面模式,它把複雜的TCP/IP協議簇的內容隱藏在套接字接口後面,用戶無需關心協議的實現,只需使用Socket提供的接口便可。 this

Socket的類型有兩種,一種是面向鏈接的TCP應用服務,一種是面向無鏈接的UDP(User Data Package)應用服務。通俗的理解就是,TCP方式是打電話(鏈接性),UDP方式是發短信(無鏈接)。 spa

 

Ok,以上是簡單的科普,那麼接下來就看下如何在Android上利用TCP/IP協議使用Socket與Server進行通信吧!今天咱們要使用的是面向鏈接的TCP方式。首先,在本機創建一個Java項目做爲Server Client,代碼以下: 設計

 

  1. public class SocketServer {  
  2.     //監聽端口號  
  3.     private static final int SERVER_PORT = 12345;  
  4.   
  5.     public static void main(String[] args) {  
  6.         try {  
  7.             System.out.println("Server: Connecting...");  
  8.             ServerSocket serverSocket = new ServerSocket(SERVER_PORT);  
  9.             while (true) {  
  10.                 //循環監聽客戶端請求  
  11.                 Socket clientSocket = serverSocket.accept();  
  12.                 System.out.println("Server: Receiving...");  
  13.                 try {  
  14.                     //獲取輸入流  
  15.                     BufferedReader in = new BufferedReader(  
  16.                             new InputStreamReader(clientSocket.getInputStream()));  
  17.                     //獲取從客戶端發來的信息  
  18.                     String str = in.readLine();  
  19.                     System.out.println("Server: Received: '" + str + "'");  
  20.                 } catch (Exception e) {  
  21.                     System.out.println("Server: Error");  
  22.                     e.printStackTrace();  
  23.                 } finally {  
  24.                     clientSocket.close();  
  25.                     System.out.println("Server: Close.");  
  26.                 }  
  27.             }  
  28.   
  29.         } catch (Exception e) {  
  30.             System.out.println("Server: Error");  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34. }  


服務端的簡單實現就完成了,接下來新建一個Android客戶端,佈局效果就添加一個Button:

 


 

而後是Android客戶端的實現:

 

  1. public class SocketAndrodActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.   
  8.         Button button = (Button) this.findViewById(R.id.btn);  
  9.         button.setOnClickListener(new OnClickListener() {  
  10.   
  11.             @Override  
  12.             public void onClick(View v) {  
  13.                 try {  
  14.                     System.out.println("Client:Connecting");  
  15.                     //IP地址和端口號(對應服務端),我這的IP是本地路由器的IP地址  
  16.                     Socket socket = new Socket("192.168.1.104"12345);  
  17.                     //發送給服務端的消息  
  18.                     String message = "Message from Android phone";  
  19.                     try {  
  20.                         System.out.println("Client Sending: '" + message + "'");  
  21.                           
  22.                         //第二個參數爲True則爲自動flush  
  23.                         PrintWriter out = new PrintWriter(  
  24.                                 new BufferedWriter(new OutputStreamWriter(  
  25.                                         socket.getOutputStream())), true);  
  26.                         out.println(message);  
  27. //                      out.flush();  
  28.                     } catch (Exception e) {  
  29.                         e.printStackTrace();  
  30.                     } finally {  
  31.                         //關閉Socket  
  32.                         socket.close();  
  33.                         System.out.println("Client:Socket closed");  
  34.                     }  
  35.                 } catch (UnknownHostException e1) {  
  36.                     e1.printStackTrace();  
  37.                 } catch (IOException e) {  
  38.                     e.printStackTrace();  
  39.                 }  
  40.   
  41.             }  
  42.         });  
  43.     }  
  44. }  

 

兩個工程結構分別以下:

 

代碼部分就完成了,個人實驗環境是在Wifi環境下,PC與Android手機都介入當前無線網路,因此程序裏的IP地址是我實驗環境無線的IP地址,你們要實驗的話須要改爲大家本身對應的IP地址。

而後是啓動服務端,作了這麼久Android,啓動Java項目你們還沒忘記吧(開玩笑),啓動後看到下圖這個小紅點,就說明Server已經起來了,這個時候,Socket端口就一直處於監聽狀態了,知道客戶端有請求過來。


 

這時,運行Android端的應用程序,點擊佈局中的按鈕,消息就發出去了:


 

而後在服務端的輸出日誌中能夠看到,已經接收到了來自Android端的數據請求,信息也順利獲得了:


 

至此,就完成了一個簡單的在Android端與Server利用TCP/IP協議進行通信的Demo.

相關文章
相關標籤/搜索