java基礎之網絡編程ip地址IP地址是由32位或者128位無符號數表示的網絡層通信地址,是一種低級協議,TCP和UDP協議都是在它的基礎上構建的。Java中使用InetAddress來表示IP地址,它有兩個子類Inet4Address和Inet6Address,分別表示IPV4和IPV6。
getByName()方法通過主機名獲取到InetAddress對象,若有多個主機,則使用getAllByName()返回InetAddress對象數組。
Socket套接字Socket是提供網絡服務的一種機制,通信的兩端都有socket,兩端通過socket進行通信。InetSocketAddress封裝了IP+端口號。
TCP/UDP協議的特點UDP協議UDP協議將數據封裝成數據報,大小在64KB以內,無須建立連接,速度快,不可靠。Java使用DatagramSocket類描述用來發送和接收數據包的socket,而使用DatagramPacket來描述UDP協議的數據包,用于描述無連接包投遞服務。
數據發送
- 建立UDPsocket服務,指定發送端口: DatagramSocket ds=new DatagramSocket(localport);
- 將字節數據封裝在數據包中:DatagramPacket dp=new DatagramPacket(buf,buf.length,ia,receiveport)
- 通過socket發送功能發送: ds.send(dp)
- 關閉資源:ds.close()
數據接收
- 建立UDPsocket服務,指定監聽端口:DatagramSocket ds=new DatagramSocket(receiveport);
- 定義數據包用來接收數據:DatagramPacket dp=new DatagramPacket(buf,buf.length)
- 通過socket接收功能接收數據并提取:ds.receive(dp);dp.getData();
- 關閉資源:ds.close()
TCP協議TCP協議需要建立連接,在連接中傳輸大量數據(不需封裝成數據報),通過三次握手完成連接,是可靠協議,但效率低。Java使用Socket來描述客戶端的socket服務,使用SocketSever來描述服務器端的socket服務。
客戶端
- 創建客戶端并指定要連接的服務器的IP和端口:Socket cs=new Socket(InetAdress,serverport)
- 通過socket對象中的輸入流和輸出流分別發送和接收數據:
- 獲取到輸出流OutputStream os=cs.getOutputStream();
- 將數據寫入到輸出流中:os.write(byte[]);
- 獲取到輸入流:InputStream is=cs.getInputstream()
服務器端
- 創建服務端的ServerSocket服務,并監聽一個端口:SeverSocket ss=new ServerSocket(serverport)
- 獲取連接過來的客戶端對象:Socket s=ss.accept();該方法是阻塞式方法。
- 使用客戶端對象的讀取流來讀取發送過來的數據:
- 獲取到輸入流InputStream is=s.getInputstream()
- 將數據讀取到字節數組中Is.read(buf)
- 獲取到輸出流:OutputStream os=s.getOutputStream();
- 通信完畢關閉客戶端s.close()
ServerSocket對象初始化時,可以通過設置backlog參數來指定能最大連接到服務器的客戶端個數
URL類URL是統一資源定位符,該類可以根據指定形式構建URL對象。
- getHost()獲取主機名
- getFile()獲取文件名
- getPath()獲取路徑部分
- getPort()獲取端口號,當URL中沒有指定時返回-1;
- getPRotocal()獲取協議名
- getQuery()獲取請求部分
- openConnection()返回一個URL的連接對象
- openStream()打開一個URL連接并返回一個用于從該連接讀入的InputStream
URLConnection類該類是抽象類,有兩個子類HttpURLConnection和JarURLConnection來實現。該類封裝了傳輸層的socket對象,可以直接讀取socket流對象
- getInputStream()返回socket的讀取流對象,用于數據的讀取從該連接返回的數據。
- getContent()獲取到URL連接的內容