java基础--网络编程
UDP協議和TCP協議
? UDP協議面向無連接,像發短信,寄信,先發送的消息未必先到達,不安全,效率高,只區分發送端和接收端,而不區分客戶端和服務端
? TCP協議面向連接,像打電話,先發送的消息一定是先到,安全,效率低,區分客戶端和服務端。在連接的時候,會有三次握手的動作。
UDP:
DatagramPacket類表示存放數據的數據包 DatagramSocket類表示一個數據報套接字,包含了源IP地址,和目的IP地址以及源端口號和目的端口號的組合,用于 發送和接受UDP數據。演示:
TestSend
package network;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException;public class TestSend {public static void main(String[] args) throws Exception {//創建DatagramSocket對象,指定端口號為8090DatagramSocket ds = new DatagramSocket(8090);//要發送的數據byte[] bs = "I am UDP!!!".getBytes();//指定接收端IP為127.0.0.1,端口號為8081DatagramPacket dp = new DatagramPacket(bs,0,bs.length, InetAddress.getByName("127.0.0.1"),8081);System.out.println("Sending data...");ds.send(dp);//發送數據ds.close();} }?TestReceive:
package network;import java.net.DatagramPacket; import java.net.DatagramSocket;/* DatagramPacket類表示存放數據的數據包 DatagramSocket類表示一個數據報套接字,包含了源IP地址,和目的IP地址以及源端口號和目的端口號的組合,用于 發送和接受UDP數據。*/ public class TestReceivce {public static void main(String[] args) throws Exception {//創建DatagramSocket對象,指定端口號8081 創建數據報套接字并將其綁定到本地主機上的指定端口。DatagramSocket ds = new DatagramSocket(8081);byte[] bs = new byte[1024];//創建接受數據的數組//創建DatagramPacket對象,用于接收數據DatagramPacket dp = new DatagramPacket(bs,bs.length);System.out.println("Waiting to receive data...");//receive(dp) 從此套接字接收數據報包 沒有數據會阻塞ds.receive(dp);//獲取接受數據的內容和長度String str = new String(dp.getData(),0,dp.getLength());//打印接收到的信息System.out.println(str + "-->" + dp.getAddress().getHostAddress() + ":" + dp.getPort());ds.close();} }TCP編程
? 1、客戶端使用Socket的構造方法,創建一個Socket對象
? 2、服務端不能使用自己創建的方式,而是使用服務端一個特殊的對象,接收客戶端發來的請求,生成一個為這個客戶端服務的Socket對象
3、構造方法:
????Socket(String?host, int?port)
? Socket(InetAddress ip, int port):建立一個通信點,專門用于和ip主機的port程序進行通信。
? 只要這個對象創建成功了,就說明這個連接已經建立起來了,就說明當前的客戶端已經聯系上服務端了,已經獲取了服務端返回的響應。
? 在創建對象的過程,就是在請求和服務端連接的過程。
4、服務端獲取Socket對象的方式:
? 1、啟動一個服務程序,類型是ServerSocket,可以接收客戶端發來的連接請求,一旦接收到請求,就可以創建一個和當前客戶端交互的Socket對象
? 2、ServerSocket的構造方法
? ? ServerSocket(int port):創建一個服務端Socket對象,等待訪問port端口的客戶端
? 3、accept():接收一個客戶端發來的請求,返回一個服務此客戶端的Socket對象
5、獲取客戶端和服務端的連接
? 1、兩個方法:
? ? InputStream ?getInputStream():獲取Socket對象的網絡輸入流
? ? OutputStream ?getOutputStream():獲取Socket對象的網絡輸出流
? 2、一旦獲取了輸入輸出流,就可以通過I\O的方式,來操作網絡數據的傳輸。
? 3、對應關系:
? ? 客戶端的網絡輸入流,對應服務端的網絡輸出流
? ? 客戶端的網絡輸出流,對應服務端的網絡輸入流
6、TCP編程步驟
? 客戶端:
? ? 1、創建Socket對象,建立和服務端的連接
? ? 2、獲取網絡輸入流和網絡輸出流
? ? 3、通過I\O的操作來進行數據傳輸
? 服務端:
? ? 1、創建ServerSocket對象,開啟服務器,監聽指定端口
? ? 2、調用accept方法,接收客戶端發來的請求,返回一個Socket對象
? ? 3、獲取服務端的網絡輸入流和網絡輸出流
? ? 4、通過I\O的操作來進行輸出傳輸
TestServer: package network;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;public class TestServer {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(9090);System.out.println("waiting accept data...");Socket s = ss.accept();//偵聽并接受到此套接字的連接。InputStream is = s.getInputStream();//返回此套接字的輸入流byte[] bs = new byte[20];int len;while ((len = is.read(bs)) != -1){String str = new String(bs,0,len);System.out.println(str);}OutputStream os = s.getOutputStream();//返回此套接字的輸出流os.write("server already accept data".getBytes());os.close();is.close();s.close();ss.close();} } TestSend: package network;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException;public class TestSend {public static void main(String[] args) throws Exception {//創建DatagramSocket對象,指定端口號為8090DatagramSocket ds = new DatagramSocket(8090);//要發送的數據byte[] bs = "I am UDP!!!".getBytes();//指定接收端IP為127.0.0.1,端口號為8081DatagramPacket dp = new DatagramPacket(bs,0,bs.length, InetAddress.getByName("127.0.0.1"),8081);System.out.println("Sending data...");ds.send(dp);//發送數據ds.close();} }?
總結
以上是生活随笔為你收集整理的java基础--网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个整数按照n,2n,4n,8n的顺序递
- 下一篇: 关于内部类