網絡模型:OSI ( Open System Interconnection) TCP/IP{
物理層:物理設備標準 主機至網絡層
數據鏈路層:MAC地址封裝解封裝
網絡層:IP地址封裝解封裝 網際層
傳輸層:協議,端口號 傳輸層
會話層:建立數據傳輸通道
表示層:對數據解析 應用層
應用層:終端應用
}
DNS解析:配置文件,存儲的是網址與IP地址。輸入網址後查詢該文件,找到IP地址,然後進行連接。
本地有該文件,則先獲取本地,在獲取互聯網上。
UDP協議{
特點:
1.將數據及源和目的封裝到數據包,不需要建立連接,每個數據包限制在64k
2.因爲不需要實時連接,所以是不可靠的協議,速度快
用到的類:DatagramSocket:用來傳輸接收數據包 DatagramPacket:用來將數據封裝成數據包
練習:
發送端,接收端的運行順序不需要限定
/** * 建立一個發送數據的端口 * *思路: * 1.有一個發送數據包的發送端 * 2.有將數據進行打包的對象,並且制定發送的目的 * 3.通過發送端將數據包發送出去 * *步驟: * 1.建立發送端對象 * 2.創建發送的緩衝區,從鍵盤上讀取數據 * 3.建立一個循環,讀取鍵盤內容,併發送 * 3.建立數據包對象,指定接收端的地址,端口號,以及發送的數據 * 4.定義一個循環結束的標記,讀到該標記就結束循環 * 5.關閉資源 * @param args * @throws IOException */ public static void main(String[] args) throws IOException { DatagramSocket sender = new DatagramSocket(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line=br.readLine()) != null){ while(line.equals("over")) break; DatagramPacket data = new DatagramPacket(line.getBytes(), 0, line.length(),InetAddress.getLocalHost(), 8090); sender.send(data); } sender.close(); }
/** * 建立一個接受數據的端口 * *思路: * 1.有一個接受數據包的接收端 * 2.有接收數據包的對象,並將數據進行解析 * 3.將接收到的數據打印 * *步驟: * 1.建立接收端對象,指定端口號 * 2.創建接收對象的對象,用於解析數據 * 3.建立一個循環, * 3.接收發送端的內容, * 5.關閉資源 * @param args * @throws IOException * @throws IOException */ public static void main(String[] args) throws IOException { DatagramSocket receiver = new DatagramSocket(8090); byte[] buf = new byte[1024]; DatagramPacket dataRe = new DatagramPacket(buf, buf.length); while(true){ receiver.receive(dataRe); System.out.println(new String(dataRe.getData(),0,dataRe.getLength())); } }
}
TCP協議{
特點;
1.建立連接,形成傳輸數據的通道,能進行大數據量傳輸
2.實時連接(三次握手完成),可靠的協議,效率較低
用到的類:Socket:客戶端 ServerSocket:服務端
練習:
}必須先運行服務端,再運行客戶端
/** * 建立一個服務端,與客戶端聯繫 * * 思路: * 1.需要一個服務端對象,指定端口號,用於被客戶端連接 * 2.利用方法連接客戶端 * 3.獲取客戶端的流對象,以及發送的數據 * 4.再次獲取客戶端的流對象,發送數據 * 步驟: * 1.創建一個服務端對象,指定端口號, * 2.連接客戶端 * 3.獲取客戶端輸入流對象,讀取數據 * 4.將數據打印, * 5.獲取客戶端輸出流對象,寫出數據 * 6.關閉資源 * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(9090); Socket so = server.accept(); InputStream is = so.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); OutputStream os = so.getOutputStream(); os.write("收到".getBytes()); server.close(); so.close(); }
/** * 有一個客戶端,用來與服務端進行通信 * * 思路: * 1.創建一客戶端,指定服務端地址,端口,與其進行通信 * 2.利用輸出流往外寫數據 * 3.利用輸入流讀取服務端發送過來的數據 * * 步驟: * 1.創建一個客戶端,指定地址,端口號 * 2.獲取輸出流 * 3.寫出數據 * 4.獲取輸入流 * 5.讀取數據 * * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { Socket client = new Socket(InetAddress.getLocalHost(), 9090); OutputStream os = client.getOutputStream(); os.write("客戶端連接成功".getBytes()); os.flush(); InputStream is = client.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); client.close(); }
客戶端發送小寫,接收大寫
/** * 要求: 有一個服務端,接收客戶端傳過來的字符串並將其轉爲大寫返回給客戶端 * * 思路: * 1.有一個服務端對象,接收客戶端數據之後將其轉爲大寫 * 2.利用客戶端的流把大寫字符傳到客戶端 * 3.需要將從客戶端獲取的字節流轉爲操作字符串的流 * * 步驟: * 1.創建一個服務端對象,指定端口號 * 2.與客戶端進行通信,並獲得客戶端對象 * 3.使用客戶端的輸入流,封裝成字符流。讀取數據 * 4.可以使用字符串的靜態轉換方法。將數據轉爲大寫,再利用客戶端輸出流,傳到客戶端 * 5.指定一個循環,並指定結束標記,在循環內部執行第3.4兩步驟 * 6.關閉資源 * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { ServerSocket transSer = new ServerSocket(9010); Socket client = transSer.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); String line = null; while((line=br.readLine()) != null){ if(line.equals("over")) break; String upperLine = line.toUpperCase(); BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); bos.write(upperLine); bos.newLine(); bos.flush(); } transSer.close(); }
/** * 要求:有一個客戶端,與某個服務端連接之後,往服務端傳輸數據,並接受服務端的數據 * * 思路: * 1.有一個客戶端,指定通信服務端的ip地址以及端口號 * 2.利用自身的輸出流對象,往服務端傳送數據 * 3.利用自身的輸入流對象,接受服務端傳過來的數據 * 4.可以將字節流對象封裝成操作字符串的對象 * * 步驟: * 1.創建一個客戶端,與服務端通信 * 2.從鍵盤上讀取數據, * 3.將輸出流對象封裝成緩衝字符流,並將讀取到的數據寫到服務端 * 4.利用輸入流對象,讀取從服務端傳送過來的數據。 * 5.穿件循環,指定結束標記,執行步驟2.3.4 * * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { Socket client = new Socket(InetAddress.getLocalHost(), 9010); String line = null; while(true){ BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); line = is.readLine(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); bw.write(line); bw.newLine(); bw.flush(); if(line.equals("over")) break; BufferedReader readServer = new BufferedReader(new InputStreamReader(client.getInputStream())); line = readServer.readLine(); System.out.println(line); } }