201711671203《Java程式設計》第十二週學習報告(2)
上一份學習報告寫完之後,拖了兩天緩了緩。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Java網路程式設計
(1)URL類
Java使用URL建立物件的應用程式稱為客戶端程式。一個URL物件封裝著一個具體的資源的引用,客戶可以通過利用URL物件獲取URL中的資源。一個URL物件包括最基本的三部分資訊:協議、地址、資源。協議是URL物件所在的Java虛擬機器支援的協議,常用的Http、Ftp、File協議都是虛擬機器支援的協議。地址必須是能連線的有效的IP地址或域名;資源則是主機上任何一個檔案。
URL類構造方法: public URL (String spec) throws MalfformedURLException 其中spec是虛擬機器支援的協議格式的地址,例
try{URL url = new URL("http://www.google.com");
}
catch(MalfformedURLException e){
System.out.println("bad URL:"+url);
}
(2)InetAddress類
主要作用是作為其他的方法使用的引數,使用例子
import java.net.*; public class Example13_2 { public static void main(String args[]) { try{ InetAddress address_1=InetAddress.getByName("www.sina.com.cn"); System.out.println(address_1.toString()); InetAddress address_2=InetAddress.getByName("166.111.222.3"); System.out.println(address_2.toString()); } catch(UnknownHostException e) { System.out.println("無法找到 www.sina.com.cn"); } } }
(3)套接字
網路通訊使用IP地址標識Internet上的計算機,使用埠號標識伺服器上的程序。反過來說,加入伺服器上一個程式不佔用一個埠號,使用者程式就無法找到它,無法與該程式互動資訊。通常我們使用1024~65535號埠進行通訊,避免埠衝突。
若兩個程式需要通訊時,我們可以使用Socket類建立套接字物件並連線在一起(埠號與IP地址組合得到一個網路套接字)
構造方法是Socket(String host,int port),host是伺服器IP地址,port是埠號,建立套接字物件可能會發生IOException異常,所以要使用try-catch語句捕獲異常。
客戶負責建立連線到伺服器的套接字物件,即客戶負責呼叫。相對的伺服器應當建立一個ServerSocket物件,與客戶端的套接字物件連線起來,從而達到連線的目的。構造方法是ServerSocket(int port),port是埠號,同樣使用try-catch語句捕獲異常
當伺服器的ServerSocket物件Serverclient建立後,就可以使用方法accept()將客戶端和伺服器端的套接字連線起來,程式碼如下
try{Socket sc = Serverclient.accept();
}
catch(IOException e){}
這個sc物件會駐留在伺服器端,呼叫getOutputStream()獲得的輸出流將指向客戶端物件的輸入流,反之亦然,如此達到互動的目的。,與從檔案中讀取資料不同,可能在另一端資料傳送之前,就已經開始讀取了,因此會阻塞本執行緒,直到該讀取方法成功讀取到資訊,本執行緒才繼續執行後續操作。
為此,我們可以使用多執行緒技術,啟動一個專門為該客戶服務的執行緒。可以用Socket類的不帶引數的構造方法建立一個套接字物件,再呼叫public void connect(SocketAddress endpoint)throws IOException請求和引數SocketAddress指定地址的伺服器端的套接字建立連線。為使用connect方法,可以使用SocketAddress的子類InetSocketAddress建立一個物件,構造方法是public InetSocketAddress(InetAddress addr,int port)
(4)UDP資料報
套接字是基於TCP協議的網路通訊,UDP資料報則基於UDP協議,它的資訊傳遞更快,但不提供可靠性保證。在資料傳輸過程中,使用者無法知道資料能否正確到達目的地主機,也不能確定資料達到目的地的順序是否和傳送的順序相同。UDP需要將資料打包,再發送。,用DatagramPacket類將資料打包。接收資料時,先用DatagramPacket(int port)建立物件,其中引數與待接收的資料包埠號相同,然後用該物件呼叫方法receive(DatagramPacket pack)接收資料包。方法receive把收到的資料包傳給引數pack,因此要準備一個數據包以便接收資料包,呼叫DatagramPacket類的另外一個構造方法DatagramPacket(byte data[],int length)建立一個數據包。該資料包將接收長度是length個位元組的資料放入data。
(5)廣播資料報
Internet的地址是a.b.c.d的形式,根據a的大小劃分地址類別,224.0.0.0~239.255.255.255是保留地址,稱作D類地址。要廣東貨接收廣播的主機必須加入到同一個d類地址。給出例子
import java.net.*;
public class BroadCast {
String s="國慶放假時間是9月30日";
int port=5858; //組播的埠
InetAddress group=null; //組播組的地址
MulticastSocket socket=null; //多點廣播套接字
BroadCast() {
try {
group=InetAddress.getByName("239.255.8.0");//設定廣播組的地址為239.255.8.0
socket=new MulticastSocket(port); //多點廣播套接字將在port埠廣播
socket.setTimeToLive(1); //多點廣播套接字傳送資料報範圍為本地網路
socket.joinGroup(group); //加入group後,socket傳送的資料報被group中的成員接收到
}
catch(Exception e) {
System.out.println("Error: "+ e);
}
}
public void play() {
while(true) {
try{ DatagramPacket packet=null; //待廣播的資料包
byte data[]=s.getBytes();
packet=new DatagramPacket(data,data.length,group,port);
System.out.println(new String(data));
socket.send(packet); //廣播資料包
Thread.sleep(2000);
}
catch(Exception e) {
System.out.println("Error: "+ e);
}
}
}
public static void main(String args[]) {
new BroadCast().play();
}
}
import java.net.*;
import java.util.*;
public class Receiver {
public static void main(String args[]) {
int port = 5858; //組播的埠
InetAddress group=null; //組播組的地址
MulticastSocket socket=null; //多點廣播套接字
try{
group=InetAddress.getByName("239.255.8.0");//設定廣播組的地址為239.255.8.0
socket=new MulticastSocket(port); //多點廣播套接字將在port埠廣播
socket.joinGroup(group); //加入group
}
catch(Exception e){}
while(true) {
byte data[]=new byte[8192];
DatagramPacket packet=null;
packet=new DatagramPacket(data,data.length,group,port); //待接收的資料包
try { socket.receive(packet);
String message=new String(packet.getData(),0,packet.getLength());
System.out.println("接收的內容:\n"+message);
}
catch(Exception e) {}
}
}
}
(6)Java遠端呼叫
Java遠端呼叫(RMI)是一種分散式技術,使用RMI可以讓一個虛擬機器上的應用程式請求呼叫位於網路上另一處虛擬機器上的物件。習慣上將發出請求的虛擬機器稱為(本地)客戶機,接收並執行的為(遠端)伺服器。
首先,RMI不希望客戶應用程式直接與遠端物件互動,取而代之讓程式與遠端物件的代理打交道。代理的特點是,它與遠端物件實現了相同的介面,向用戶公開了相同的方法。RMI會生出一個存根(Stub):一種特殊的位元組碼。這個存根產生的物件作為遠端物件的代理。代理會駐留在客戶端,就是說,使用者需要把RMI生成的存根複製或下載到客戶端。
RMI為了標識一個物件時遠端物件,要求遠端物件必須實現java.rmi包中的Remote介面。該介面沒有方法,僅僅是一個標識作用,使用者不必編寫和遠端代理有關得到程式碼,只需知道遠端代理和遠端物件實現了相同的介面。
在遠端伺服器建立遠端物件之前,RMI要求遠端伺服器首先啟動註冊rmiregistry。註冊後遠端伺服器就可以啟動遠端物件服務,級變成程式來建立和註冊遠端物件,並執行該程式
import java.rmi.*;
public class BindRemoteObject{
public static void main(String args[]){
try{
RemoteConcreteSubject remoteObject=new RemoteConcreteSubject();
Naming.rebind("rmi://127.0.0.1/rect",remoteObject);
System.out.println("be ready for client server...");
}
catch(Exception exp){
System.out.println(exp);
}
}
}
學習過程遇到的問題
有所疑惑
敲程式碼遇到的問題
慢慢思索
程式碼行數 | 部落格量 | 學習時長 | |
第一週 | 53 | 1 | 3 |
二 | 186 | 1 | 5 |
三 | 134 | 1 | 4 |
五 | 233 | 1 | 6 |
六 | 425 | 1 | 9 |
七 | 202 | 1 | 5 |
八 | 62 | 1 | 4 |
九 | 176 | 1 | 7 |
十 | 130 | 0 | 6 |
十一 | 56 | 1/9 | 8 |
十二 | 442/2073 | 2/11 | 14/71 |