第十一周java學習總結
目錄
- 第十一周java學習總結
- 學習內容
- 學習總結
- 提交代碼截圖
- 代碼推送
第十一周java學習總結
學習內容
第13章 Java網絡編程
主要內容
URL類
InetAdress類
套接字
UDP數據報
廣播數據報
Java遠程調用(RMI)
重點和難點
重點: URL的使用和套接字連接機制
難點:套接字連接機制
- 1.URL類
URL類是java.net
包中的一個重要的類,URL的實例封裝著一個統一資源定位符(Uniform Resource Locator)
一個URL對象通常包含最基本的三部分信息:協議、地址、資源。
URL的構造方法
URL類通常使用如下的構造方法創建一個URL對象:
public URL(String spec) throws MalformedURLException
public URL(String protocol, String host,String file) throws MalformedURLException
讀取URL中的資源
URL對象調用
InputStream openStream()
方法可以返回一個輸入流,該輸入流指向URL對象所包含的資源。通過該輸入流可以將服務器上的資源讀入到客戶端。
- 2.InetAdress類
地址的表示
Internet上的主機有兩種方式表示地址:
域名
例如 www.tsinghua.edu.cn
IP地址
例如 202.108.35.210
java.net包中的InetAddress類對象含有一個Internet主機地址的域名和IP地址,例如 www.sina.com.cn/202.108.37.40 。
package inetaddressdemo; import java.net.*; /** ?*?演示InetAddress類的基本使用 ?*/ public class InetAddressDemo { ???????? public static void main(String[] args) { ?????????????????? try{ ??????????????????????????? //使用域名創建對象 ??????????????????????????? InetAddress inet1 = InetAddress.getByName("www.163.com"); ??????????????????????????? System.out.println(inet1); ??????????????????????????? //使用IP創建對象 ??????????????????????????? InetAddress inet2 = InetAddress.getByName("127.0.0.1"); ??????????????????????????? System.out.println(inet2); ??????????????????????????? //獲得本機地址對象 ??????????????????????????? InetAddress inet3 = InetAddress.getLocalHost(); ??????????????????????????? System.out.println(inet3); ??????????????????????????? //獲得對象中存儲的域名 ??????????????????????????? String host = inet3.getHostName(); ??????????????????????????? System.out.println("域名:" + host); ??????????????????????????? //獲得對象中存儲的IP ??????????????????????????? String ip = inet3.getHostAddress(); ??????????????????????????? System.out.println("IP:" + ip); ?????????????????? }catch(Exception e){} ???????? } }
獲取地址
獲取Internet上主機的地址
可以使用InetAddress類
的靜態方法getByName(String s);
獲得一個InetAddress對象,該對象含有主機地址的域名和IP地址,該對象用如下格式表示它包含的信息:
www.sina.com.cn/202.108.37.40
獲取本地機的地址
我們可以使用InetAddress
類的靜態方法getLocalHost()
獲得一個InetAddress對象,該對象含有本地機的域名和IP地址。
3.套接字
IP地址標識Internet上的計算機,端口號標識正在計算機上運行的進程(程序)。端口號被規定為一個16位的0~65535之間的整數。
當兩個程序需要通信時,它們可以通過使用Socket類建立套接字對象並連接在一起(端口號與IP地址的組合得出一個網絡套接字)。- 4.客戶端套接字
客戶端的程序使用Socket類建立負責連接到服務器的套接字對象。
建立連接到服務器的套接字對象:
try{ Socket mysocket=new Socket(“http://192.168.0.78”,1880);
}
catch(IOException e)
{ }
與mysocket相關的方法
getInputStream()獲得一個輸入流
getOutputStream()獲得一個輸出流
用getInputStream()得到的輸入流接到另一個DataInputStream數據流上
用getOutputStream()得到的輸出流接到另一個DataOutputStream數據流上
5.UDP數據報
基於UDP的通信和基於TCP的通信不同,基於UDP的信息傳遞更快,但不提供可靠性保證。
基於UDP通信的基本模式是:
將數據打包,稱為數據包(好比將信件裝入信封一樣),然後將數據包發往目的地。
接受別人發來的數據包(好比接收信封一樣),然後查看數據包中的內容。- 6發送數據包
用DatagramPacket類將數據打包,即用DatagramPacket類創建一個對象,稱為數據包。用DatagramPacket的以下兩個構造方法創建待發送的數據包:
DatagramPacket(byte data[],int length,InetAddtress address,int port)
DatagramPack(byte data[],int offset,int length,InetAddtress address,int port)
用DatagramSocket類的不帶參數的構造方法:DatagramSocket()創建一個對象,該對象負責發送數據包。例如:
DatagramSocket mail_out=new DatagramSocket();
mail_out.send(data_pack);
- 7.RMI的設計細節
擴展Remote
接口
定義一個接口是java.rmi包中Remote的子接口,即擴展Remote接口。
RemoteSubject.java
Java遠程調用,RMI(Remote Method Invocation)是一種分布式技術,使用RMI可以讓一個虛擬機(JVM)上的應用程序請求調用位於網絡上另一處的JVM上的對象方法。習慣上稱發出調用請求的虛擬機(JVM)為(本地)客戶機,稱接受並執行請求的虛擬機(JVM)為(遠程)服務器。
遠程對象
創建遠程對象的類必須要實現Remote接口,RMI使用Remote接口來標識遠程對象,但是Remote中沒有方法,因此創建遠程對象的類需要實現Remote接口的一個子接口。RemoteConcreteSubject.java
存根(Stub)與代理:RMI使用rmic命令生成存根
RemoteConcreteSubject_Stub.class
啟動註冊rmiregistry: 執行rimregistry命令
啟動遠程對象服務:遠程服務器使用java.rmi包中的Naming類調用其類方法rebind(String name, Remote obj)綁定一個遠程對象到rmiregistry所管理的註冊表中,該方法的name參數是URL格式,obj參數是遠程對象,將來客戶端的代理會通過name 找到遠程對象obj。 BindRemoteObject.java
運行客戶端程序:遠程服務器啟動遠程對象服務後,客戶端就可以運行有關程序,訪問使用遠程對象。 ClientApplication.java - 8.echo服務器
??? package tcp;
import java.io.*;
import java.net.*;
/**
?* echo服務器
?*?功能:將客戶端發送的內容反饋給客戶端
?*/
public class SimpleSocketServer {
???????? public static void main(String[] args) {
?????????????????? ServerSocket serverSocket = null;
?????????????????? Socket socket = null;
?????????????????? OutputStream os = null;
?????????????????? InputStream is = null;
?????????????????? //監聽端口號
?????????????????? int port = 10000;
?????????????????? try {
??????????????????????????? //建立連接
??????????????????????????? serverSocket = new ServerSocket(port);
??????????????????????????? //獲得連接
??????????????????????????? socket = serverSocket.accept();
??????????????????????????? //接收客戶端發送內容
??????????????????????????? is = socket.getInputStream();
??????????????????????????? byte[] b = new byte[1024];
??????????????????????????? int n = is.read(b);
??????????????????????????? //輸出
??????????????????????????? System.out.println("客戶端發送內容為:" + new String(b,0,n));
??????????????????????????? //向客戶端發送反饋內容
??????????????????????????? os = socket.getOutputStream();
??????????????????????????? os.write(b, 0, n);
?????????????????? } catch (Exception e) {
??????????????????????????? e.printStackTrace();
?????????????????? }finally{
??????????????????????????? try{
???????????????????????????????????? //關閉流和連接
???????????????????????????????????? os.close();
???????????????????????????????????? is.close();
???????????????????????????????????? socket.close();
???????????????????????????????????? serverSocket.close();
??????????????????????????? }catch(Exception e){}
?????????????????? }
???????? }
}
學習總結
理解 URL類是對統一資源定位符的抽象,使用URL創建對象的應用程序稱作客戶端程序。
網絡套接字是基於TCP協議的有連接通信,套接字連接就是客戶端的套接字對象和服務器端的套接字對象通過輸入、輸出流連接在一起。
基於UDP的通信和基於TCP的通信不同,基於UDP的信息傳遞更快,但不提供可靠性保證。
設計廣播數據報網絡程序時,必須將要廣播或接收廣播的主機加入到同一個D類地址。D類地址也稱作個組播地址。
RMI是一種分布式技術,使用RMI可以讓一個虛擬機(JVM)上的應用程序請求調用位於網絡上另一處的JVM上的對象方法RMI是一種分布式技術。
提交代碼截圖
代碼推送
代碼托管
第十一周java學習總結