java之網絡編程



網絡編程
一、通訊要素
①通訊要素1:IP 和 端口號
    IP:InetAddress
    端口號:標識正在計算機上運行的進程(程序)
        不同的進程有不同的端口號,被規定爲一個 16 位的整數 0~65535。
        其中,0~1023被預先定義的服務通信佔用(如MySql佔用端口3306,http佔用端口80等)。
        除非我們需要訪問這些特定服務,否則,就應該使用 1024~65535 這些端口中的某一個進行通信,以免發生端口衝突
socket:端口號與IP地址的組合得出一個網絡套接字
InetAddress類
    InetAddress類主要表示IP地址,兩個子類:Inet4Address、Inet6Address
  1)InetAddress類沒有提供公共的構造器,而是提供瞭如下兩個靜態方法來獲取InetAddress實例
    InetAddress getByName(String host):在給定主機名的情況下確定主機的IP地址
    InetAddress getByAddress(byte[] addr) :在給定原始IP地址的情況下,返回InetAddress對象
  2)InetAddress提供瞭如下幾個常用的方法
    String getHostAddress() :返回IP地址字符串
    String getHostName() :返回IP地址的主機名
    InetAddress getLocalHost():返回本地主機
    boolean isReachable(int timeout) :測試是否可以到達該地址,timeout爲毫秒數
    String getCanonicalHostName() :獲取次IP地址的完全限定域名
②通訊要素2:網絡通信協議
傳輸層協議中有兩個非常重要的協議:
  1)傳輸控制協議TCP(Transmission Control Protocol)
  2)用戶數據報協議UDP(User Datagram Protocol)。
TCP協議:
    使用TCP協議前,須先建立TCP連接,形成傳輸數據通道
    傳輸前,採用“三次握手”方式,是可靠的
    TCP協議進行通信的兩個應用進程:客戶端、服務端
    在連接中可進行大數據量的傳輸
    傳輸完畢,需釋放已建立的連接,效率低
UDP協議:
    將數據、源、目的封裝成數據包,不需要建立連接
    每個數據報的大小限制在64K內
    因無需連接,故是不可靠的
    發送數據結束時無需釋放資源,速度快
③基於Socket的TCP編程
Java語言的基於套接字編程分爲服務端編程(ServerSocket)和客戶端編程(Socket).
Socket類的常用方法
  1)InetAddress getLocalAddress():返回對方Socket中的IP的InetAddress對象
  2)int getLocalPort():返回本地Socket中的端口號
  3)InetAddress getInetAddress():返回對方Socket中IP地址
  4)int getPort():返回對方Socket中的端口號
  5)void close() throws IOException:關閉Socket,不可在以後的網絡連接中使用,除非創建新的套接字
  6)InputStream getInputStream() throws IOException:獲取與Socket相關聯的字節輸入流,用於從Socket中讀數據
  7)OutputStream getOutputStream() throws IOException:獲取與Socket相關聯的字節輸出流,用於向Socket中寫數據。
ServerSocket類的常用方法
  1)Socket accept() throws IOException :等待客戶端的連接請求,返回與該客戶端進行通信用的Socket對象
  2)void setSoTimeout(int timeout) throws SocketException :設置accept()方法等待連接的時間爲timeout毫秒。
    若時間已到,還沒有客戶端連接,則拋出InterruptedIOException異常,accept()方法不再阻塞,該傾聽Socket可繼續使用。
    若timeout值爲0,則表示accept()永遠等待。該方法必須在傾聽Socket創建後,在accept()之前調用纔有效
  3)void close()throws IOException:關閉監聽Socket
  4)InetAddress getInetAddress():返回此服務器套接字的本地地址
  5)int getLocalPort():返回此套接字在其上監聽的端口號
  6)SocketAddress getLocalSocketAddress():返回此套接字綁定的端點的地址

④UDP網絡通信
  類 DatagramSocket 和 DatagramPacket 實現了基於 UDP 協議網絡程序。
  UDP數據報通過數據報套接字 DatagramSocket 發送和接收,系統不保證UDP數據報一定能夠安全送到目的地,也不能確定什麼時候可以抵達。
  DatagramPacket 對象封裝了UDP數據報,在數據報中包含了發送端的IP地址和端口號以及接收端的IP地址和端口號。
  UDP協議中每個數據報都給出了完整的地址信息,因此無須建立發送方和接收方的連接
  1)DatagramPacket:UDP數據報
     DatagramPacket(byte[ ] data, int length)
     DatagramPacket(byte[ ] data, int offset, int length)

     DatagramPacket(byte[ ] data, int length, InetAddress remoteAddr, int remotePort)
     DatagramPacket(byte[ ] data, int offset, int length, InetAddress remoteAddr, int remotePort)
     DatagramPacket(byte[ ] data, int length, SocketAddress sockAddr)
     DatagramPacket(byte[ ] data, int offset, int length, SocketAddress sockAddr)
   以上構造函數都創建一個數據部分包含在指定的字節數組中的數據報文,
   前兩種形式的構造函數主要用來創建接收的端的DatagramPackets實例,
   後四種形式主要用來創建發送端的DatagramPackets實例。
   常用方法
    InetAddress getAddress() :返回數據報中的Inetaddress對象
    byte[] getData() :返回數據報中的數據
    int getLength() :返回數據報中的數據的長度
    int getPort()  :返回數據報端口號
  3)DatagramSocket:UDP數據報socket:發送和接受數據報
    DatagramSocket()
    DatagramSocket(int port)
    常用方法
    send(DatagramPacket p) :發送數據報
    receive(DatagramPacket p) :接受數據報
⑤URL編程
   類 URL 和 URLConnection 提供了最高級網絡應用。URL 的網絡資源的位置來同一表示 Internet 上各種網絡資源。
   通過URL對象可以創建當前應用程序和 URL 表示的網絡資源之間的連接,這樣當前程序就可以讀取網絡資源數據,或者把自己的數據傳送到網絡上去。

    爲了表示URL,java.net 中實現了類 URL。我們可以通過下面的構造器來初始化一個 URL 對象:
    public URL (String spec):通過一個表示URL地址的字符串可以構造一個URL對象。例如:URL url = new URL ("http://www.atguigu.com/");
    public URL(URL context, String spec):通過基 URL 和相對 URL 構造一個 URL 對象。例如:URL downloadUrl = new URL(url, “download.html")
    public URL(String protocol, String host, String file); 例如:new URL("http", "www.atguigu.com", “download. html");
    public URL(String protocol, String host, int port, String file); 例如: URL gamelan = new URL("http", "www.atguigu.com", 80, “download.html");
  1)一個URL對象生成後,其屬性是不能被改變的,但可以通過它給定的方法來獲取這些屬性:
    public String getProtocol(  ):獲取該URL的協議名
    public String getHost(  ):獲取該URL的主機名
    public String getPort(  ):獲取該URL的端口號
    public String getPath(  ):獲取該URL的文件路徑
    public String getFile(  ):獲取該URL的文件名
    public String getRef(  ):獲取該URL在文件中的相對位置
    public String getQuery(   ):獲取該URL的查詢名:例如?a=b,?後面是信息就是查詢名

  2)針對HTTP協議的URLConnection類
    URL的方法 openStream():能從網絡上讀取數據
    若希望輸出數據,例如向服務器端的 CGI (公共網關接口-Common Gateway Interface-的簡稱,是用戶瀏覽器和服務器端的應用程序進行連接的接口)
    程序發送一些數據,則必須先與URL建立連接,然後才能對其進行讀寫,此時需要使用 URLConnection 。
    URLConnection:表示到URL所引用的遠程對象的連接。當與一個URL建立連接時,首先要在一個 URL 對象上通過方法
    openConnection() 生成對應的 URLConnection 對象。如果連接過程失敗,將產生IOException.
      URL netchinaren = new URL ("http://www.atguigu.com/index.shtml");
      URLConnectonn u = netchinaren.openConnection( );
    通過URLConnection對象獲取的輸入流和輸出流,即可以與現有的CGI程序進行交互。
      public Object getContent( ) throws IOException
      public int getContentLength( )
      public String getContentType( )
      public long getDate( )
      public long getLastModified( )
      public InputStream getInputStream( )throws IOException
      public OutputSteram getOutputStream( )throws IOException


發佈了146 篇原創文章 · 獲贊 260 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章