標籤:
OSI模型分為七層(從下到上):物理層、資料連結層、網路層、傳輸層、會話層、展示層、應用程式層。
不同主機之間的相同層次稱為對等層。對等層之間互相通訊需要遵守一定的規則,稱之為協議,我們將某個主機上啟動並執行某種協議的集合稱為協議棧。主機正是利用這個協議棧來接收和發送資料的。
TCP/IP模型:網路介面層、網路互連層、傳輸層、應用程式層。
在網路編程中需要注意的問題包括:
1.是如何找到網路上的主機上的要進行通訊的程式;
2.是找到了主機上的程式後如何傳輸資料。
連接埠號碼:是一組16位的無符號位元,每個連接埠號碼的範圍是1到65535(0被保留)。
TCP協議代表傳輸控制通訊協定,允許兩個應用程式之間的進行可靠的通訊;
UDP協議代表使用者報文協議,是一種非連線協定,允許兩個應用程式之間進行不可靠的通訊。提供了在應用程式之間發送稱為資料報的協議。
Socket通訊端:Unix系統推出了一種應用程式訪問通訊協定的作業系統調用,是一種抽象層,應用程式通過它來發送和接收資料。
不同類型的Socket與不同類型的底層協議族以及同一協議族中的不同協議棧相關聯。
InetAddress類代表IP地址,例:
import java.net.InetAddress;public class InetAddressTest { public static void main(String[] args) throws Exception { InetAddress ip = InetAddress.getLocalHost(); System.out.println(ip); InetAddress ip = InetAddress.getByName("80YMEKCC96RXAOB"); System.out.println(ip); InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com"); for (InetAddress inetAddress : allByName) { System.out.println(inetAddress); } byte[] ip = {(byte)192, (byte)168, 1, 52}; InetAddress address = InetAddress.getByAddress("www.baidu.com", ip); System.out.println(address); }}
使用通訊端建立TCP串連:
1.伺服器初始化一個ServerSocket對象,指示通訊將要發生在哪個連接埠號碼上。
2.伺服器調用ServerSocket類的accept()方法。該方法會一直等待,直到一個用戶端串連到伺服器上的指定連接埠。
3.在伺服器等待的同時,用戶端執行個體化一個Socket對象,指定要已連線的服務器名和連接埠號碼。
4.Socket類的構造器試圖將用戶端串連到指定的伺服器和連接埠號碼。
5.在伺服器端,accept()方法返回一個將要串連到用戶端通訊端的伺服器新通訊端的引用。
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;/*** 伺服器端* * @author Administrator**/public class Server { public static void main(String[] args) throws IOException { // 建立ServerSocket對象,指定監聽連接埠 ServerSocket server = new ServerSocket(30001); // 設定逾時時間 server.setSoTimeout(10000); // 等待用戶端串連 Socket socket = server.accept(); /* 處理用戶端資料 */ // 從用戶端讀資料 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); char[] ch = new char[100]; int len = reader.read(ch); System.out.println("從用戶端接收到的資訊:"); // while (-1 != (len = reader.read(ch))) { System.out.print(new String(ch, 0, len)); // } // 向用戶端寫資料 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write("你好用戶端,我已經接收到你的資訊了"); writer.flush(); // 釋放資源 writer.close(); reader.close(); socket.close(); server.close(); }}
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;/*** 用戶端 請求--響應* * @author Administrator**/public class Client { public static void main(String[] args) throws IOException { // 建立用戶端Socket向伺服器發起串連請求 Socket socket = new Socket("192.168.1.200", 30001); /* 利用已建立的socket建立輸入輸出資料流,處理與伺服器端的串連 */ // 向伺服器寫入資料 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); writer.write("你好伺服器!!!"); writer.flush(); // 從伺服器讀資料 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); char[] ch = new char[100]; int len = reader.read(ch); System.out.println("從伺服器端接收到的資訊:"); // while (-1 != (len = reader.read(ch))) { System.out.print(new String(ch, 0, len)); // } // 釋放資源 reader.close(); writer.close(); socket.close(); }}
UDP通訊端編程
資料報包的寄件者和接受者都使用java.net.DatagramSocket類分別發送和接收包。
接收報文包:
1.建立一個足夠大的位元組數組,用於儲存要接收的包的資料;
2.使用該位元組數組執行個體化一個DatagramPacket對象;
3.DatagramSocket被執行個體化,它被指定該通訊端要綁定到的本地主機上的一個連接埠;
4.調用DatagramSocket類的receive()方法,將DatagramPacket對象傳入該方法。這將導致執行線程阻塞,直到接收到一個資料報包或者發生了逾時。
import java.net.*;
import java.io.*;
public class PacketReceiver{
public static void main(String[] args) { try{ byte[] buffer = new byte [1024]; DatagramOacket packet = new DatagramPacket(buffer,buffer.length); DatagramSocket socket = new DatagramSocket(5002); Syatem.out.println("正在等待一個包..."); socket.receive(packet); System.out.println("剛從" + packet.getSocketAddress() + "接收到包"); buffer = packet.getData(); System.out.println("new String(buffer)"); } catch(IOException e){ e.printStackTrace(); } } }
發送報文包
1.建立一個足夠大的位元組數組,用於儲存要發送的包資料,用該資料填充數組;
2.建立一個新的DatagramPacket對象,用於儲存上面的位元組數組,以及伺服器名和接受者的連接埠號碼;
3.DatagramSocket被執行個體化,它被指定通訊端要綁定到本地主機的哪個連接埠;
4.DatagramSocket類的send()方法被調用,傳入DatagramPacket對象。
import java.net.*;import java.io.*;public class PacketSender{ public static void main(String [] args){ try{ String data = "剛收到資料包"; byte[] buffer = data.getBytes(); DatagramPacket packet = new DatagramPacket(buffer,buffer.length,new InetSocketAddress("localhost",5002)); DatagramSocket socket = new DatagramSocket(5003); System.out.println("正在發送一個包..."); Socket.send(packet); } catch(IOException e){ e.printStackTrace(); } }}
java學習筆記(十五)java網路編程