亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java必學必會之網絡編程

 更新時間:2015年12月03日 10:52:49   作者:孤傲蒼狼  
java必學必會之網絡編程,學習了解java網絡編程、網絡通信協(xié)議、TCP協(xié)議和UDP協(xié)議,對各個協(xié)議進行深入學習,做到必學必會

一、網絡基礎概念  

首先理清一個概念:網絡編程 != 網站編程,網絡編程現在一般稱為TCP/IP編程。

  

二、網絡通信協(xié)議及接口

  

三、通信協(xié)議分層思想

  

四、參考模型

  

五、IP協(xié)議

  

  每個人的電腦都有一個獨一無二的IP地址,這樣互相通信時就不會傳錯信息了。

  IP地址是用一個點來分成四段的,在計算機內部IP地址是用四個字節(jié)來表示的,一個字節(jié)代表一段,每一個字節(jié)代表的數最大只能到達255。

六、TCP協(xié)議和UDP協(xié)議

  

  TCP和UDP位于同一層,都是建立在IP層的基礎之上。由于兩臺電腦之間有不同的IP地址,因此兩臺電腦就可以區(qū)分開來,也就可以互相通話了。通話一般有兩種通話方式:第一種是TCP,第二種是UDP。TCP是可靠的連接,TCP就像打電話,需要先打通對方電話,等待對方有回應后才會跟對方繼續(xù)說話,也就是一定要確認可以發(fā)信息以后才會把信息發(fā)出去。TCP上傳任何東西都是可靠的,只要兩臺機器上建立起了連接,在本機上發(fā)送的數據就一定能傳到對方的機器上,UDP就好比發(fā)電報,發(fā)出去就完事了,對方有沒有接收到它都不管,所以UDP是不可靠的。TCP傳送數據雖然可靠,但傳送得比較慢,UDP傳送數據不可靠,但是傳送得快。

七、Socket編程

  一般的網絡編程都稱為Socket編程,Socket的英文意思是“插座”。

  

  兩臺電腦都安裝上一個插座,然后使用一根線的兩端插到兩臺電腦的插座上,這樣兩臺電腦就建立好了連接。這個插座就是Socket。

  因為互相之間都能互相通信,我說你是我的Server只是從邏輯意義上來講,我應該把東西先發(fā)到你那里去,然后由你來處理,轉發(fā)。所以你叫Server。但從技術意義上來講,只有TCP才會分Server和Client。對于UDP來說,從嚴格意義上來講,并沒有所謂的Server和Client。TCP的Server的插座就叫ServerSocket,Client的插座就叫Socket。

  兩臺計算機互相連接,那么首先必須得知道它們的IP地址,但是只提供IP地址是不夠的,還必須要有連接的端口號,也就是要連接到哪個應用程序上。

  端口號是用來區(qū)分一臺機器上不同的應用程序的。端口號在計算機內部是占2個字節(jié)。一臺機器上最多有65536個端口號。一個應用程序可以占用多個端口號。端口號如果被一個應用程序占用了,那么其他的應用程序就無法再使用這個端口號了。記住一點,我們編寫的程序要占用端口號的話占用1024以上的端口號,1024以下的端口號不要去占用,因為系統(tǒng)有可能會隨時征用。端口號本身又分為TCP端口和UDP端口,TCP的8888端口和UDP的8888端口是完全不同的兩個端口。TCP端口和UDP端口都有65536個。

八、TCP Socket通信模型

  

九、Socket使用范例

服務器端ServerSocket

import java.net.*;
import java.io.*;
public class TestServerSocket{
    public static void main(String args[]) throws Exception{
        ServerSocket ss = new ServerSocket(6666);
        /*創(chuàng)建一個ServerSocket對象時往往會給它指定一個端口號
        指定端口號的意思是這個new出來的ServerSocket對象要使用的
        是哪一個端口號,通過哪一個端口號來監(jiān)聽客戶端的連接
        因此指定一個端口號的意義就是為了告訴計算機ServerSocket對象
        在哪個地方監(jiān)聽客戶端的連接*/
        /*服務器端接收客戶端連接的請求是不間斷地接收的,所以服務器端的
        編程一般都是死循環(huán),永不休止地運行著。*/
        while(true){
              Socket s = ss.accept();
              /*在服務器端調用accept()方法接受客戶端的連接對象,accept()方法是
              一個阻塞式方法,一直在傻傻地等待著是否有客戶端申請連接上來
              然后服務器端的Socket插座就和客戶端的Socket插座建立了連接了*/
              /*客戶端能否連接上服務器端,取決于服務器端是否接受客戶端的連接請求
              如果接受了客戶端的連接請求,那么在服務器端就安裝上一個Socket插座
              通過這個插座與連接上的客戶端就可以建立連接,互相通信了*/
              System.out.println("A Client Connected!");
              /*使用InputStream流接收從客戶端發(fā)送過來的信息,使用DataInputStream數據流處理接收到的信息*/
        DataInputStream dis = new DataInputStream(s.getInputStream());
              /*使用readUTF(方法將接收到的信息全部讀取出來,存儲到變量str里面
              readUTF()方法也是一個阻塞式方法,會傻傻地等待客戶端發(fā)送信息過來,然后將接收到的信息讀取出來
              如果客戶端不寫東西過來,它就一直在服務器端傻傻地等待著,直到客戶端寫東西過來為止
              堵塞式的方法效率往往是不高的,比如說一個客戶端連接上來了,但是它遲遲不發(fā)送信息,
              那么服務器端的程序就阻塞住了,這樣另外一個客戶端就連接不上來了,因為另外一個客戶端要想連接
              上服務器端,就必須得在服務器端調用accept()方法,可accept()方法必須得在下一次循環(huán)時才能夠被
              調用,現在服務器端的程序運行到調用readUTF()這個方法時就阻塞住了,它要等待著已經連接上來的
              那個客戶端發(fā)送信息過來后將信息讀取出來,如果客戶端一直不發(fā)信息到服務器端,那么readUTF()方法
              就一直無法讀取到信息,那么服務器端的程序會阻塞在這里,無法進行下次循環(huán),這樣其他的客戶端就
              無法連接到服務器端了*/
              String str = dis.readUTF();
              System.out.println(str);
          }
      }
  }

客戶端Socket

import java.net.*;
import java.io.*;
public class TestClientSocket{
  public static void main(String args[]) throws Exception{
    Socket s = new Socket("127.0.0.1",6666);
    /*Client申請連接到Server端上*/
    /*連接上服務器端以后,就可以向服務器端輸出信息和接收從服務器端返回的信息
    輸出信息和接收返回信息都要使用流式的輸入輸出原理進行信息的處理*/
    /*這里是使用輸出流OutputStream向服務器端輸出信息*/
    OutputStream os = s.getOutputStream();
    DataOutputStream dos = new DataOutputStream(os);
    Thread.sleep(30000);/*客戶端睡眠30秒后再向服務器端發(fā)送信息*/
    dos.writeUTF("Hello Server!");
  }
}

  客戶端通過端口6666向服務器端請求連接,服務器端接受客戶端的連接請求以后,就在服務器端上安裝一個Socket,然后讓這個Socket與客戶端的Socket連接,這樣服務器端就可以與客戶端互相通信了,當有另外一個客戶端申請連接時,服務器端接受了以后,又會安裝另外一個Socket與這個客戶端的Socket進行連接。

相關文章

  • MyBatis寫入Json字段以及Json字段轉對象示例詳解

    MyBatis寫入Json字段以及Json字段轉對象示例詳解

    這篇文章主要給大家介紹了關于MyBatis寫入Json字段以及Json字段轉對象的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 淺談synchronized加鎖this和class的區(qū)別

    淺談synchronized加鎖this和class的區(qū)別

    synchronized 是 Java 語言中處理并發(fā)問題的一種常用手段,本文主要介紹了synchronized加鎖this和class的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2021-11-11
  • 如何獲取java新IO的Path文件大小

    如何獲取java新IO的Path文件大小

    這篇文章主要介紹了如何獲取java新IO的Path文件大小,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java中常用的設計模式之模板模式詳解

    Java中常用的設計模式之模板模式詳解

    這篇文章主要為大家詳細介紹了Python實現學生成績管理系統(tǒng),使用數據庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java線程并發(fā)semaphore類示例

    java線程并發(fā)semaphore類示例

    Java 5.0里新加了4個協(xié)調線程間進程的同步裝置,它們分別是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介紹Semaphore,Semaphore是用來管理一個資源池的工具,可以看成是個通行證
    2014-01-01
  • Java面向對象之猜拳游戲

    Java面向對象之猜拳游戲

    這篇文章主要為大家詳細介紹了Java面向對象之猜拳游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 詳解Spring Security中權限注解的使用

    詳解Spring Security中權限注解的使用

    這篇文章主要為大家詳細介紹一下Spring Security中權限注解的使用方法,文中的示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以參考一下
    2022-05-05
  • Java判斷數字位數的方法總結

    Java判斷數字位數的方法總結

    本文給大家整理了Java判斷數字位數的兩種常用方法,對此有興趣的可以跟著小編一起學習下。
    2018-02-02
  • Java ArrayList擴容問題實例詳解

    Java ArrayList擴容問題實例詳解

    這篇文章主要介紹了Java ArrayList擴容問題實例詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Spring?AOP實現多數據源動態(tài)切換

    Spring?AOP實現多數據源動態(tài)切換

    本文主要介紹了Spring?AOP實現多數據源動態(tài)切換,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論