瞭解了Udp通信協議以後,咱們再認識一個經常使用的通信協議:Tcpjava
Tcp傳輸特色:網絡
--依賴於Socket和ServerSocket對象tcp
--創建客戶端和服務端ide
--創建鏈接後,經過Socket中的 IO 流進行數據的傳輸spa
--關閉Scoket.net
下面經過一個簡單的例子認識一下:code
--tcp分客戶端和服務端對象
--客戶端對應的對象是Sockerblog
服務端對應的對象是ServerSocketip
//客戶端:
package com.shindo.java.tcp; import java.io.*; import java.net.*; /** * 客戶端: * 經過查詢Socket對象,發如今該對象創建時,就能夠去鏈接指定的主機, * 由於Tcp是面向鏈接的,因此在創建Socket服務時,就要有服務端存在,並鏈接成功,造成通路後,在該通道進行數據傳輸 * * 需求:給服務端發送一個文本數據 */ public class TcpClient { public static void main(String[] args)throws Exception{ //建立客戶端的Socket服務,指定目的主機和端口 Socket s = new Socket("127.0.0.1",11012); //爲了發送數據,應獲取Socket流中的輸出流 OutputStream out = s.getOutputStream();//使用字節流 out.write("This's the first Tcp test Demo".getBytes()); //由於流是經過Socket得到的,全部一旦Socket關閉,流也隨之關閉 s.close(); } }
//服務端:
package com.shindo.java.tcp; import java.io.*; import java.net.*; /** * 需求:定義端點接收數據,並打印在控制檯上 * * 一、簡歷ServerSocket服務,並監聽一個端口 * 二、獲取鏈接過來的客戶端對象 * 經過ServerSocket的accept()方法,沒有鏈接就會等,因此這個方法是阻塞的。 * 三、客戶端若是發過來數據,那麼服務端要使用對應的客戶端對象,並獲取到該客戶端對象的讀取流 * 來讀取客戶端發送過來的數據,並打印控制檯; * 四、關閉服務端(可選) */ public class TcpServer { public static void main(String[] args){ try { //簡歷服務端Socket服務,並監聽一個端口 ServerSocket ss = new ServerSocket(11012); //經過accept()方法獲取鏈接過來的客戶端對象 Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + ".........is connected"); //使用客戶端對象的讀取流讀取客戶端發送過來的數據 InputStream in = s.getInputStream();//其實是一個網絡流 byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close(); } catch (Exception e) { e.printStackTrace(); } } }
============================優雅的分割線============================
上面這兩個例子,實現了客戶端向服務端發送文本信息,服務端收到並將其打印到控制檯。
如今咱們再對上面兩個程序進行一些改造,讓服務端接收到客戶端的信息後,打印到控制檯,並響應信息給客戶端;客戶端也將服務端響應的信息打印到控制檯:
//客戶端:
package com.shindo.java.tcp; import java.io.*; import java.net.*; public class TcpClient2 { public static void main(String[] args){ try { Socket s = new Socket("127.0.0.1",11012); //發送文本數據給客戶端 OutputStream out = s.getOutputStream(); out.write("This's the better TcpClient test Demo".getBytes()); //讀取客戶端響應信息 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close(); } catch (Exception e) { e.printStackTrace(); } } }
//服務端:
package com.shindo.java.tcp; import java.io.*; import java.net.*; public class TcpServer2 { public static void main(String[] args){ try { //建立服務端,並監聽一個端口 ServerSocket ss = new ServerSocket(11012); Socket s = ss.accept(); //獲取請求的客戶端ip,並打印控制檯 String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + "........... is connected"); //獲取客戶端發送過來的數據,並打印控制檯 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); //發送響應信息給客戶端 OutputStream out = s.getOutputStream(); out.write("welcome, client !".getBytes()); s.close(); ss.close(); } catch (Exception e) { e.printStackTrace(); } } }
效果以下:
客戶端接收到服務到響應:
服務端接收到客戶端發過來的數據: