標籤:網路編程 黑馬程式員 技術
點擊開啟連結 點擊開啟連結 點擊開啟連結 android培訓、<a">點擊開啟連結 點擊開啟連結 java培訓、期待與您交流!">點擊開啟連結 點擊開啟連結
網路編程網路模型
l OSI參考模型
l TCP/IP參考模型
網路通訊要素
l IP地址:網路中裝置的標識,不易記憶,可用主機名稱,本地迴環地址,127.0.0.1 主機名稱:localhost
l 連接埠號碼:用於標識進程的邏輯地址,不同進程的標識,有效連接埠:0~65535,其中0~1024系統使用或保留連接埠
l 傳輸協議:通訊的規則,常見協議:TCP、UDP
網路通訊的一般過程
1.找到對方IP
2.資料要發送到對方指定的應用程式上,為了標識這些應用程式,所以給這些網路應用程式都用數字進行標識。為了方便稱呼這個數字,叫做 連接埠,邏輯連接埠。0~65535
3.定義一個通訊規則。這個通訊規則成為協議。國際組織定義了通用協議TCP/IP通訊。UDP
InetAddress類:此類表示互連網協議(IP)地址
static InetAddress | getLocalHost():擷取本地主機
String | getHostAddress():返回IP地址字串
String | getHostName():擷取此IP地址的主機名稱
static InetAdress | getByAddress(byte[] addr):再給定原始IP地址的情況下,返回InetAddress對象
Static InetAddress | getByAddress(String host,byte[] addr):根據給定主機和IP地址建立InetAddress。
Static InetAddress | getByName(String host)在給定主機的情況下確定主機的IP地址。
static InetAddress[] | getAllBynames(String host):在給定主機名稱的情況下,根據系統上配置的名稱服務返回其所組成的數組。
TCP和UDP
UDP:聊天,視頻會議
將資料及源和目的封裝成資料包中,不需要建立串連
每個資料報的大小限制在64K內
因無串連,是不可靠協議
不需要建立串連,速度快
TCP:下載
建立串連,形成傳輸資料的通道
在串連中進行大資料量傳輸
通過三向交握完成串連,是可靠協議
必須建立串連,效率會稍低
UDP傳輸
DatagramSocket類:此類表示用來發送和接收資料報包的通訊端。
建構函式:DatagramSocket(int port):指定連接埠
DatagramSocket():
重要方法:
void | send(DatagramPacket p):發送資料報包
void | receive(DatagramPacket p) :接收資料報包
DatagramPacket 類:此類表示資料報包。
建構函式:
DatagramPacket(byte[] buf,int length)
DatagramPacket(byte[] buf,int length,InetAddress address,int port)
重要方法:
InetAddress | getAddress():返回此資料報將要發往該主機或者從該機器接收到的IP地址。
byte[] | getData():返回緩衝區資料
int | getLength():返回將要發生或接收到的資料的長度
int | getPort():擷取此資料報將要發送往該主機或從該主機接收到的連接埠
通過UDP傳輸方式,將一段文字資料發送出去。
1.建立updSocket服務
2.提供資料,並將資料封裝到資料包中
3.通過socket服務的發送功能,將資料包發送出去
4.關閉資源
定義一個應用程式,用於接收UDP傳輸的資料並處理
1.定義udpSocket服務,通常會接收一個連接埠,其實就是給這個網路應用程式定義數位識別碼,方便於明確哪些資料過來該應用程式可以處理。
2.定義一個資料包,因為要儲存接收到的資料,資料包對象中有更多功能可以提前位元組資料中的不同資料資訊。
3.通過socket服務的receive方法將收到的資料存入已定義好的資料包中
4.通過資料包特有的功能,將這些不同的資料取出,列印在控制台上
5.關閉資源
UDP練習:
import java.util.*;import java.io.*;import java.net.*;class UDP3 {public static void main(String[] args) {new Thread(new UDPSend3()).start();new Thread(new UDPReceive3()).start();}}class UDPSend3 implements Runnable{public void run(){ try {DatagramSocket ds=new DatagramSocket();//建立一個IO流接收資料BufferedReader br=new BufferedReader(new InputStreamReader(System.in));for(String str=br.readLine();str!=null;str=br.readLine()){ byte[] buf=str.getBytes(); DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),1002); ds.send(dp); if("over".equals(str)) break;}ds.close(); } catch (Exception e) { System.out.println(e); } }}class UDPReceive3 implements Runnable{ public void run(){ try { DatagramSocket ds=new DatagramSocket(1002); while(true) {byte[] buf=new byte[1024];DatagramPacket dp=new DatagramPacket(buf,buf.length);ds.receive(dp);String info=new String(buf,0,dp.getLength());System.out.println(dp.getAddress()+"::"+info);if("over".equals(info))break; } ds.close(); } catch (Exception e) { System.out.println(e); }}}
TCP傳輸
Socket和ServerSocket
l 建立用戶端和伺服器端
l 建立串連後,通過Socket中的IO流進行資料的傳輸
l 關閉Socket
l 同樣,用戶端和伺服器端是兩個獨立的應用程式。
Socket類:此類實現客服端通訊端
常用建構函式:Socket() Socket(InetAddress address,int port) Socket()
常用方法:
Void | close():關閉此通訊端
Void | connect(SocketAddress endpoint):將此通訊端串連到伺服器。
InetAdddress | getInetAddress():返回此通訊端串連的地址
InputStream | getInputStream():返回此通訊端的輸入資料流
OutputStream | getOutputStream():返回此通訊端的輸出資料流
Int | getPort():返回此通訊端串連到的遠程連接埠
Void | shutdownInput():此通訊端的輸入資料流置於“流的末尾”。
Void | shutdowmOutput():禁用此通訊端的輸出資料流。
ServerSocke此類實現伺服器通訊端
常用建構函式:ServerSocket() ServerSocket(int port)
常用方法:
Socket | accept():偵聽並接受到此通訊端的串連
URL類:代表一個統一資源定位器,它是指向互連網“資源”的指標。
URL(String spec)
重要方法:
String | getFile():擷取此URL的檔案名稱
String | getHost():擷取此URL的主機名稱
String | getPath():擷取此URL的路徑部分
String | getProtocol():擷取此URL的協議名稱
String | getQuery():擷取此URL的查詢部分
URLConnection | openConnection():返回一個表示到URL所引用的遠程對象的串連。
InputStream | openStream():開啟到此URL的串連並返回一個用於從該串連讀入的InputStream。
URLConnection類:抽象類別,代表應用程式和URL之間的通訊串連。
重要方法:
InputStream | getInputStream():返回從此開啟的串連讀取的輸入資料流
OutputStream | getOutputStream():返回寫入到此連結的輸入資料流。
用戶端
通過查閱socket對象,發現在該對象建立時,就可以去串連指定主機,因為TCP是連線導向的,所以在建立socket服務時,就要有服務端存在,並串連成功,形成通路後,在該通道進行資料的傳輸。
步驟:
1.建立socket服務,並指定要串連的主機和連接埠。
Socket(String host,int port);
2.為了發送資料,應該擷取socket流中的輸出資料流
getOutputStream()
Write()
3.關閉服務
服務端
1.建立服務端的socket服務,ServerSocket。
ServerSocket(int port)接聽一個連接埠
2.擷取串連過來的客服端對象。
通過accept()方法,擷取Socket,沒有串連就會等,所以這個方法是阻塞式的
3.客服端如果發送過來資料,那麼服務端使用對應的客服端對象,並擷取到該客服端對象的讀取流來讀取發過來的資料,並列印在控制台。
4.關閉服務端(可選)
//TCP終極練習import java.net.*;import java.io.*;import java.awt.*;import java.awt.event.*;class TCP{private Frame f;private TextField tf;private Button bt;private TextArea ta;TCP(){init();}public void init(){f=new Frame("我的瀏覽器");f.setBounds(100,100,600,600);f.setLayout(new FlowLayout());tf=new TextField(60);bt=new Button("轉到");ta=new TextArea(30,66);f.add(tf);f.add(bt);f.add(ta); myEvent();f.setVisible(true);}public void myEvent(){bt.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {try {ta.setText(""); String ip=tf.getText(); URL url=new URL(ip); URLConnection uc=url.openConnection(); InputStream In = uc.getInputStream(); byte[] buf=new byte[1024];int len=0; while((len=In.read(buf,0,buf.length))!=-1) { ta.append(new String(buf,0,len)); } } catch (Exception ee) { throw new RuntimeException("登陸伺服器失敗!"); } }});f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});}public static void main(String[] args) {new TCP();}}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
黑馬程式員——java高新技術——網路編程