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,代碼以下: 設計
- public class SocketServer {
- //監聽端口號
- private static final int SERVER_PORT = 12345;
-
- public static void main(String[] args) {
- try {
- System.out.println("Server: Connecting...");
- ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
- while (true) {
- //循環監聽客戶端請求
- Socket clientSocket = serverSocket.accept();
- System.out.println("Server: Receiving...");
- try {
- //獲取輸入流
- BufferedReader in = new BufferedReader(
- new InputStreamReader(clientSocket.getInputStream()));
- //獲取從客戶端發來的信息
- String str = in.readLine();
- System.out.println("Server: Received: '" + str + "'");
- } catch (Exception e) {
- System.out.println("Server: Error");
- e.printStackTrace();
- } finally {
- clientSocket.close();
- System.out.println("Server: Close.");
- }
- }
-
- } catch (Exception e) {
- System.out.println("Server: Error");
- e.printStackTrace();
- }
- }
- }
服務端的簡單實現就完成了,接下來新建一個Android客戶端,佈局效果就添加一個Button:
而後是Android客戶端的實現:
- public class SocketAndrodActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- Button button = (Button) this.findViewById(R.id.btn);
- button.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- try {
- System.out.println("Client:Connecting");
- //IP地址和端口號(對應服務端),我這的IP是本地路由器的IP地址
- Socket socket = new Socket("192.168.1.104", 12345);
- //發送給服務端的消息
- String message = "Message from Android phone";
- try {
- System.out.println("Client Sending: '" + message + "'");
-
- //第二個參數爲True則爲自動flush
- PrintWriter out = new PrintWriter(
- new BufferedWriter(new OutputStreamWriter(
- socket.getOutputStream())), true);
- out.println(message);
- // out.flush();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- //關閉Socket
- socket.close();
- System.out.println("Client:Socket closed");
- }
- } catch (UnknownHostException e1) {
- e1.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
- });
- }
- }
兩個工程結構分別以下:
代碼部分就完成了,個人實驗環境是在Wifi環境下,PC與Android手機都介入當前無線網路,因此程序裏的IP地址是我實驗環境無線的IP地址,你們要實驗的話須要改爲大家本身對應的IP地址。
而後是啓動服務端,作了這麼久Android,啓動Java項目你們還沒忘記吧(開玩笑),啓動後看到下圖這個小紅點,就說明Server已經起來了,這個時候,Socket端口就一直處於監聽狀態了,知道客戶端有請求過來。
這時,運行Android端的應用程序,點擊佈局中的按鈕,消息就發出去了:
而後在服務端的輸出日誌中能夠看到,已經接收到了來自Android端的數據請求,信息也順利獲得了:
至此,就完成了一個簡單的在Android端與Server利用TCP/IP協議進行通信的Demo.