網路編程【Socket網路編程】,socket網路編程
java.net.InetAddress類:此類表示互連網協議 (IP) 地址。
靜態方法:
static InetAddress getLocalHost() 返回本地主機(你自己的使用的電腦)。
static InetAddress getByName(String host) 在給定主機名稱的情況下確定主機的 IP 位址。
非靜態方法:
String getHostAddress() 返回 IP 位址字串(以文本表現形式)。
String getHostName() 擷取此 IP 位址的主機名稱。
UDP通訊的接收端:接收發送端發送的資料報包,拆包
* 和udp相關的類:
* java.net.DatagramPacket:此類表示資料報包。
* 作用:使用資料報包,接收發送端的資料
* java.net.DatagramSocket:此類表示用來發送和接收資料報包的通訊端。
* 作用:發送資料報包,接收資料報包
* 通訊端:綁定IP地址和連接埠號碼的網路對象
*
* 構造方法:
* DatagramPacket(byte[] buf, int length)
* 構造 DatagramPacket,用來接收長度為 length 的資料包。
* DatagramSocket(int port)
* 建立資料通訊端並將其綁定到本地主機上的指定連接埠。
*
* 成員方法:
* void receive(DatagramPacket p) 從此通訊端接收資料報包。
*
* 實現步驟:
* 1.建立DatagramPacket對象,接收發送端的資料報
* 2.建立DatagramSocket對象,並且和系統要指定的連接埠號碼
* 3.使用DatagramSocket中的方法receive發送端接收資料報包
* 4.拆包
* DatagramPacket有和資料報包相關的方法
* int getLength() 擷取發送端資料的長度
* InetAddress getAddress() 擷取發送端的IP地址對象
* int getPort() 擷取發送端的連接埠號碼(系統隨機分配的)
* 5.釋放資源
1 public static void main(String[] args) throws IOException { 2 //1.建立DatagramPacket對象,接收發送端的資料報 3 byte[] bytes = new byte[1024];//資料最大傳輸64kb 1024*64 4 DatagramPacket dp = new DatagramPacket(bytes, bytes.length); 5 //2.建立DatagramSocket對象,並且和系統要指定的連接埠號碼 6 DatagramSocket ds = new DatagramSocket(8888); 7 //3.使用DatagramSocket中的方法receive發送端接收資料報包 8 ds.receive(dp); 9 //4.拆包10 //int getLength() 擷取發送端資料的長度11 int length = dp.getLength();12 //InetAddress getAddress() 擷取發送端的IP地址對象13 String ip = dp.getAddress().getHostAddress();14 //int getPort() 擷取發送端的連接埠號碼(系統隨機分配的)15 int port = dp.getPort();16 17 System.out.println(new String(bytes,0,length)+"ip:"+ip+",連接埠號碼"+port);18 //5.釋放資源19 ds.close();20 }
UDP通訊的發送端:把資料進行封裝,根據接收端的IP地址和連接埠發送資料報包
*
* 和udp相關的類:
* java.net.DatagramPacket:此類表示資料報包。
* 作用:把資料和接收端的IP地址,連接埠號碼進行封裝
* java.net.DatagramSocket:此類表示用來發送和接收資料報包的通訊端。
* 作用:發送資料報包,接收資料報包
* 通訊端:綁定IP地址和連接埠號碼的網路對象
*
* 構造方法:
* DatagramPacket(byte[] buf, int length, InetAddress address, int port)
* 構造資料報包,用來將長度為 length 的包發送到指定主機上的指定連接埠號碼。
* DatagramSocket()
* 構造資料通訊端並將其綁定到本地主機上任何可用的連接埠。
*
* 成員方法:
* void send(DatagramPacket p) 從此通訊端發送資料報包。
*
* 實現步驟:
* 1.建立DatagramPacket對象,封裝資料和接收端的IP地址,連接埠號碼(建立集裝箱)
* 2.建立DatagramSocket對象(建立碼頭)
* 3.使用DatagramSocket中的方法send發送資料報包
* 4.釋放資源
*
* UDP通訊是面向無串連:不用管是否有接收端,都可以發送資料,沒有接收端會發生資料丟失
1 public static void main(String[] args) throws IOException { 2 //1.建立DatagramPacket對象,封裝資料和接收端的IP地址,連接埠號碼(建立集裝箱) 3 byte[] bytes = "你好UDP!".getBytes(); 4 InetAddress address = InetAddress.getByName("127.0.0.1"); 5 DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, 8888); 6 //2.建立DatagramSocket對象(建立碼頭) 7 DatagramSocket ds = new DatagramSocket(); 8 //3.使用DatagramSocket中的方法send發送資料報包 9 ds.send(dp);10 //4.釋放資源11 ds.close();12 }
TCP通訊的用戶端:向伺服器發送請求串連,接收伺服器回寫的資料
*
* 表示用戶端的類:
* java.net.Socket:此類實現用戶端通訊端(也可以就叫“通訊端”)。
*
* 構造方法:
* Socket(InetAddress address, int port) 建立一個流通訊端並將其串連到指定 IP 位址的指定連接埠號碼。
* Socket(String host, int port) 建立一個流通訊端並將其串連到指定主機上的指定連接埠號碼。
*
* 成員方法:
* OutputStream getOutputStream() 返回此通訊端的輸出資料流。
* InputStream getInputStream() 返回此通訊端的輸入資料流。
*
* 注意:用戶端和伺服器進行資料互動,不能使用自己建立的流對象,必須使用Socket中提供的流
*
* 實現步驟:
* 1.建立用戶端Socket對象,綁定伺服器的IP地址和連接埠號碼
* 2.使用Socket中的方法getOutputStream擷取網路輸出資料流
* 3.使用OutputStream網路流中的方法write給伺服器發送資料
* 4.使用Socket中的方法getInputStream擷取網路輸入資料流
* 5.使用InputStream網路流中的方法read讀取伺服器回寫的資料
* 6.釋放資源
*
* 注意:TCP是連線導向通訊,必須先啟動伺服器,在啟動用戶端,如果伺服器沒有啟動
* 則會拋出ConnectException: Connection refused: connect
1 public static void main(String[] args) throws IOException { 2 //1.建立用戶端Socket對象,綁定伺服器的IP地址和連接埠號碼 3 Socket socket = new Socket("127.0.0.1", 9999); 4 //2.使用Socket中的方法getOutputStream擷取網路輸出資料流 5 OutputStream os = socket.getOutputStream(); 6 //3.使用OutputStream網路流中的方法write給伺服器發送資料 7 os.write("你好伺服器".getBytes()); 8 //4.使用Socket中的方法getInputStream擷取網路輸入資料流 9 InputStream is = socket.getInputStream();10 //5.使用InputStream網路流中的方法read讀取伺服器回寫的資料11 byte[] bytes = new byte[1024];12 int len = is.read(bytes);13 System.out.println(new String(bytes,0,len));14 //6.釋放資源15 socket.close();16 }
TCP通訊的伺服器端:接收用戶端的發送的資料,給用戶端回寫資料
*
* 表示伺服器的類:
* java.net.ServerSocket:此類實現伺服器通訊端。
*
* 構造方法:
* ServerSocket(int port) 建立綁定到特定連接埠的伺服器通訊端。
*
* 有一件特別重要的事:伺服器必須的知道是哪個用戶端請求的伺服器
* 所有可以使用accept方法擷取請求的用戶端
* 成員方法:
* Socket accept() 偵聽並接受到此通訊端的串連。
*
* 實現步驟:
* 1.建立ServerSocket對象,和系統要指定的連接埠號碼
* 2.使用ServerSocket中的方法accept擷取請求的用戶端對象
* 3.使用Socket中的方法getInputStream擷取網路輸入資料流
* 4.使用InputStream網路流中的方法read讀取用戶端發送的資料
* 5.使用Socket中的方法getOutputStream擷取網路輸出資料流
* 6.使用OutputStream網路流中的方法write給用戶端回寫資料
* 7.釋放資源(ServerSocket,Socket)
1 public static void main(String[] args) throws IOException { 2 //1.建立ServerSocket對象,和系統要指定的連接埠號碼 3 ServerSocket server = new ServerSocket(9999); 4 //2.使用ServerSocket中的方法accept擷取請求的用戶端對象 5 Socket socket = server.accept(); 6 //3.使用Socket中的方法getInputStream擷取網路輸入資料流 7 InputStream is = socket.getInputStream(); 8 byte[] bytes = new byte[1024]; 9 //4.使用InputStream網路流中的方法read讀取用戶端發送的資料10 int len = is.read(bytes);11 System.out.println(new String(bytes,0,len));12 //5.使用Socket中的方法getOutputStream擷取網路輸出資料流13 OutputStream os = socket.getOutputStream();14 //6.使用OutputStream網路流中的方法write給用戶端回寫資料15 os.write("收到".getBytes());16 //7.釋放資源(ServerSocket,Socket)17 socket.close();18 server.close();19 }