網路通訊,網路通訊協定
一 概述 1.網路模型
OSI(Open System Interconnection,開放式系統互聯)模型,是對網路系統結構的概括,將網路分為七層:應用程式層、展示層、會話層、傳輸層、網路層、資料連結層、物理層。
2.IP協議
網路層協議,規定了在互連網上確定與尋找電腦的規則。
3.TCP協議
傳輸層的一種資料轉送協議,資料轉送前通過“三向交握”建立串連,然後再發送資料,適用於對資料準確性要求較高的情況,由於資料轉送前需要建立串連,傳輸速度較慢。
4.UDP協議
傳輸層的一種資料轉送協議,資料轉送前不需要建立串連,適用於對資料準確性要求不高的情況,傳輸資料較快,一般聊天資訊都通過該協議傳輸。
5.HTTP協議
HTTP協議屬於應用程式層協議,為作業系統或網路應用程式提供訪問網路服務的介面。
6.連接埠port
當資料到達電腦後,為了找到目標應用程式,為每一個應用程式分配了一個整數值,取值0-65535,這個整數值就是連接埠,從中可以看出,連接埠代表了電腦上一個應用程式,保證資料準確到達預定的程式。一個連接埠不能同時被多個應用程式佔用,一個應用程式結束以後,連接埠不會立即釋放,有一個記憶體延遲佔有的時間,這個時間一般很短。連接埠、0-1023已經被系統應用程式及其他應用程式佔用,程式設計時避免使用這個範圍的連接埠。
7.通訊端Socket
通訊端是資料發送與接收的工具。寄件者通過通訊端發送資料,接受者通過通訊端監聽指定的連接埠擷取資料。
8.無論採用TCP協議,還是UDP協議,資料都只能以位元組形式發送。
二 TCP程式設計
1.關閉通過Socket擷取的輸入資料流或者輸出資料流將關閉Socket。
2.通過Socket擷取的輸出資料流輸出完畢後必須關閉,不然另一端對應的輸入資料流將阻塞。由於通過輸出資料流對象關閉輸出資料流時,同時關閉Socket對象,將導致另一端無法擷取對應Socket的對象,因此只能通過Socket下的方法shutdownOutput關閉輸出資料流。
3.用戶端的一般步驟:
Socket socket=new Socket(String host,int port);//建立用戶端Socket,發送與接收資料,需要指明伺服器IP與連接埠OutputStream os=socket.getOutputStream();//擷取輸出資料流,向伺服器發送資料..........os.flush();socket.shutdownOutput();//關閉輸出資料流,防止伺服器端阻塞InputStream is=socket.getInputStream();//擷取輸入資料流,輸入資料流包含伺服器的反饋資訊............socket.close();//關閉socket,同時關閉輸入與輸出資料流
4.伺服器的一般步驟:
ServerSocket server=new ServerSocket(int port);//建立伺服器端通訊端,指定監聽連接埠Socket socket=server.accept();//擷取訪問用戶端的Socket,阻塞線程InputStream is=socket.getInputStream();//擷取輸入資料流,其中包含用戶端發送的資料.............OutputStream os=socket.getOutputStream();//擷取輸出資料流,向用戶端反饋資訊..............os.flush();os.shutdownOutput();server.close();
5.Demo用戶端
package com.javase.networkCommunication.tcp.demo02;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class ImgClient { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("192.168.146.1", 10007); FileInputStream is = new FileInputStream("Files/1.jpg"); OutputStream os = socket.getOutputStream(); byte[] buf = new byte[1024];// 先將資料讀取到緩衝區,比頻繁的從硬碟讀取速度快 int length = 0; while ((length = is.read(buf)) != -1) { os.write(buf, 0, length); } os.flush(); socket.shutdownOutput();// 如果輸出資料流不關閉,服務端對應的輸入資料流會阻塞 InputStream replyIs = socket.getInputStream();//不會阻塞線程 byte[] buf01 = new byte[1024]; int length01 = replyIs.read(buf01); String reply = new String(buf01, 0, length01); System.out.println(reply); is.close(); socket.close(); }}伺服器
package com.javase.networkCommunication.tcp.demo02;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import org.junit.Test;public class ImgServer { @Test public void test01() throws IOException { ServerSocket serverSocket = new ServerSocket(10007); Socket socket = serverSocket.accept();// 線程阻塞,等待請求 System.out.println("hostAddress=" + socket.getInetAddress().getHostAddress()); InputStream is = socket.getInputStream(); FileOutputStream os = new FileOutputStream("Files/2.jpg"); System.out.println(1); byte[] buf = new byte[1024]; int length = 0; System.out.println(2); int count = 3; while ((length = is.read(buf)) != -1) { os.write(buf, 0, length); System.out.println(count++); } os.flush(); os.close(); System.out.println("圖片上傳結束"); /*PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.write("success");*/ OutputStream out = socket.getOutputStream(); out.write("success".getBytes()); out.flush(); socket.shutdownOutput(); System.out.println("響應資料已發出"); serverSocket.close(); }}三 UDP程式設計 1.資料處理方式
UDP協議以資料包的形式發送資料,每個包的最大值64k。
2.發送資料的一般步驟:
DatagramSocket socket=new DatagramSocket();//建立資料通訊端用於發送資料//DUP協議採用資料包分段發送資料,因此需要建立資料包,在資料包中指明目的地IP與連接埠DatagramPacket packet= DatagramPacket(byte buf[], int offset, int length,InetAddress address, int port);socket.send(packet);
3.接收資料的一般步驟:
DatagramSocket socket=new DatagramSocket(int port);//建立監聽指定連接埠的資料通訊端DatagramPacket packet=new DatagramPacket(byte buf[], int length);socket.receive(packet);