最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java必學(xué)必會(huì)之網(wǎng)絡(luò)編程

 更新時(shí)間:2015年12月03日 10:52:49   作者:孤傲蒼狼  
java必學(xué)必會(huì)之網(wǎng)絡(luò)編程,學(xué)習(xí)了解java網(wǎng)絡(luò)編程、網(wǎng)絡(luò)通信協(xié)議、TCP協(xié)議和UDP協(xié)議,對各個(gè)協(xié)議進(jìn)行深入學(xué)習(xí),做到必學(xué)必會(huì)

一、網(wǎng)絡(luò)基礎(chǔ)概念  

首先理清一個(gè)概念:網(wǎng)絡(luò)編程 != 網(wǎng)站編程,網(wǎng)絡(luò)編程現(xiàn)在一般稱為TCP/IP編程。

  

二、網(wǎng)絡(luò)通信協(xié)議及接口

  

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

  

四、參考模型

  

五、IP協(xié)議

  

  每個(gè)人的電腦都有一個(gè)獨(dú)一無二的IP地址,這樣互相通信時(shí)就不會(huì)傳錯(cuò)信息了。

  IP地址是用一個(gè)點(diǎn)來分成四段的,在計(jì)算機(jī)內(nèi)部IP地址是用四個(gè)字節(jié)來表示的,一個(gè)字節(jié)代表一段,每一個(gè)字節(jié)代表的數(shù)最大只能到達(dá)255。

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

  

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

七、Socket編程

  一般的網(wǎng)絡(luò)編程都稱為Socket編程,Socket的英文意思是“插座”。

  

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

  因?yàn)榛ハ嘀g都能互相通信,我說你是我的Server只是從邏輯意義上來講,我應(yīng)該把東西先發(fā)到你那里去,然后由你來處理,轉(zhuǎn)發(fā)。所以你叫Server。但從技術(shù)意義上來講,只有TCP才會(huì)分Server和Client。對于UDP來說,從嚴(yán)格意義上來講,并沒有所謂的Server和Client。TCP的Server的插座就叫ServerSocket,Client的插座就叫Socket。

  兩臺(tái)計(jì)算機(jī)互相連接,那么首先必須得知道它們的IP地址,但是只提供IP地址是不夠的,還必須要有連接的端口號(hào),也就是要連接到哪個(gè)應(yīng)用程序上。

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

八、TCP Socket通信模型

  

九、Socket使用范例

服務(wù)器端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)建一個(gè)ServerSocket對象時(shí)往往會(huì)給它指定一個(gè)端口號(hào)
        指定端口號(hào)的意思是這個(gè)new出來的ServerSocket對象要使用的
        是哪一個(gè)端口號(hào),通過哪一個(gè)端口號(hào)來監(jiān)聽客戶端的連接
        因此指定一個(gè)端口號(hào)的意義就是為了告訴計(jì)算機(jī)ServerSocket對象
        在哪個(gè)地方監(jiān)聽客戶端的連接*/
        /*服務(wù)器端接收客戶端連接的請求是不間斷地接收的,所以服務(wù)器端的
        編程一般都是死循環(huán),永不休止地運(yùn)行著。*/
        while(true){
              Socket s = ss.accept();
              /*在服務(wù)器端調(diào)用accept()方法接受客戶端的連接對象,accept()方法是
              一個(gè)阻塞式方法,一直在傻傻地等待著是否有客戶端申請連接上來
              然后服務(wù)器端的Socket插座就和客戶端的Socket插座建立了連接了*/
              /*客戶端能否連接上服務(wù)器端,取決于服務(wù)器端是否接受客戶端的連接請求
              如果接受了客戶端的連接請求,那么在服務(wù)器端就安裝上一個(gè)Socket插座
              通過這個(gè)插座與連接上的客戶端就可以建立連接,互相通信了*/
              System.out.println("A Client Connected!");
              /*使用InputStream流接收從客戶端發(fā)送過來的信息,使用DataInputStream數(shù)據(jù)流處理接收到的信息*/
        DataInputStream dis = new DataInputStream(s.getInputStream());
              /*使用readUTF(方法將接收到的信息全部讀取出來,存儲(chǔ)到變量str里面
              readUTF()方法也是一個(gè)阻塞式方法,會(huì)傻傻地等待客戶端發(fā)送信息過來,然后將接收到的信息讀取出來
              如果客戶端不寫東西過來,它就一直在服務(wù)器端傻傻地等待著,直到客戶端寫東西過來為止
              堵塞式的方法效率往往是不高的,比如說一個(gè)客戶端連接上來了,但是它遲遲不發(fā)送信息,
              那么服務(wù)器端的程序就阻塞住了,這樣另外一個(gè)客戶端就連接不上來了,因?yàn)榱硗庖粋€(gè)客戶端要想連接
              上服務(wù)器端,就必須得在服務(wù)器端調(diào)用accept()方法,可accept()方法必須得在下一次循環(huán)時(shí)才能夠被
              調(diào)用,現(xiàn)在服務(wù)器端的程序運(yùn)行到調(diào)用readUTF()這個(gè)方法時(shí)就阻塞住了,它要等待著已經(jīng)連接上來的
              那個(gè)客戶端發(fā)送信息過來后將信息讀取出來,如果客戶端一直不發(fā)信息到服務(wù)器端,那么readUTF()方法
              就一直無法讀取到信息,那么服務(wù)器端的程序會(huì)阻塞在這里,無法進(jìn)行下次循環(huán),這樣其他的客戶端就
              無法連接到服務(wù)器端了*/
              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端上*/
    /*連接上服務(wù)器端以后,就可以向服務(wù)器端輸出信息和接收從服務(wù)器端返回的信息
    輸出信息和接收返回信息都要使用流式的輸入輸出原理進(jìn)行信息的處理*/
    /*這里是使用輸出流OutputStream向服務(wù)器端輸出信息*/
    OutputStream os = s.getOutputStream();
    DataOutputStream dos = new DataOutputStream(os);
    Thread.sleep(30000);/*客戶端睡眠30秒后再向服務(wù)器端發(fā)送信息*/
    dos.writeUTF("Hello Server!");
  }
}

  客戶端通過端口6666向服務(wù)器端請求連接,服務(wù)器端接受客戶端的連接請求以后,就在服務(wù)器端上安裝一個(gè)Socket,然后讓這個(gè)Socket與客戶端的Socket連接,這樣服務(wù)器端就可以與客戶端互相通信了,當(dāng)有另外一個(gè)客戶端申請連接時(shí),服務(wù)器端接受了以后,又會(huì)安裝另外一個(gè)Socket與這個(gè)客戶端的Socket進(jìn)行連接。

相關(guān)文章

  • Java利用Socket實(shí)現(xiàn)網(wǎng)絡(luò)通信功能

    Java利用Socket實(shí)現(xiàn)網(wǎng)絡(luò)通信功能

    在早期的網(wǎng)絡(luò)編程中,Socket是很常見的實(shí)現(xiàn)技術(shù)之一,比如早期的聊天室,就是基于這種技術(shù)進(jìn)行實(shí)現(xiàn)的,另外現(xiàn)在有些消息推送,也可以基于Socket實(shí)現(xiàn),本文小編給大家介紹了Java利用Socket實(shí)現(xiàn)網(wǎng)絡(luò)通信功能的示例,需要的朋友可以參考下
    2023-11-11
  • 在mybatis中使用mapper進(jìn)行if條件判斷

    在mybatis中使用mapper進(jìn)行if條件判斷

    這篇文章主要介紹了在mybatis中使用mapper進(jìn)行if條件判斷,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 詳解Java的日期時(shí)間新特性

    詳解Java的日期時(shí)間新特性

    隨著時(shí)間的不斷推移,現(xiàn)實(shí)的需求也在不斷更新,原先的一些API已經(jīng)難以滿足開發(fā)需求了,從JDK?8之后,為了滿足更多的開發(fā)需求,Java給我們增加了不少關(guān)于日期時(shí)間的新特性,接下來就帶各位來看看這些新特性有哪些,需要的朋友可以參考下
    2023-06-06
  • springboot項(xiàng)目配置logback-spring.xml實(shí)現(xiàn)按日期歸檔日志的方法

    springboot項(xiàng)目配置logback-spring.xml實(shí)現(xiàn)按日期歸檔日志的方法

    本文主要介紹了springboot項(xiàng)目配置logback-spring.xml實(shí)現(xiàn)按日期歸檔日志的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • springcloud?eureka切換nacos的配置方法

    springcloud?eureka切換nacos的配置方法

    這篇文章主要介紹了springcloud?eureka切換nacos,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • java如何實(shí)現(xiàn)抽取json文件指定字段值

    java如何實(shí)現(xiàn)抽取json文件指定字段值

    這篇文章主要介紹了java如何實(shí)現(xiàn)抽取json文件指定字段值,具有很好的參考價(jià)值,希望對大家有所幫助。
    2022-06-06
  • Java如何獲取Json中的數(shù)據(jù)實(shí)例代碼

    Java如何獲取Json中的數(shù)據(jù)實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java如何獲取Json中數(shù)據(jù)的相關(guān)資料,我們在日常開發(fā)中少不了和JSON數(shù)據(jù)打交道,那么我們來看看JAVA中常用的JSON獲取方式,需要的朋友可以參考下
    2023-09-09
  • 簡單了解java數(shù)組傳遞方法

    簡單了解java數(shù)組傳遞方法

    這篇文章主要介紹了簡單了解java數(shù)組傳遞方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot可以同時(shí)處理多少請求流程分析

    SpringBoot可以同時(shí)處理多少請求流程分析

    SpringBoot默認(rèn)的內(nèi)嵌容器是Tomcat,也就是我們的程序?qū)嶋H上是運(yùn)行在Tomcat里的,所以與其說SpringBoot可以處理多少請求,到不如說Tomcat可以處理多少請求,這篇文章主要介紹了SpringBoot可以同時(shí)處理多少請求,需要的朋友可以參考下
    2023-02-02
  • ReentrantLock可重入鎖原理解析

    ReentrantLock可重入鎖原理解析

    這篇文章主要為大家介紹了ReentrantLock可重入鎖原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評論

普安县| 铜川市| 英吉沙县| 陆良县| 金阳县| 江山市| 长沙市| 通榆县| 平利县| 东明县| 衡阳县| 东安县| 嘉兴市| 昌都县| 绿春县| 静海县| 监利县| 武城县| 湾仔区| 伊通| 雷波县| 竹溪县| 政和县| 宁德市| 旅游| 楚雄市| 肥西县| 定西市| 盐边县| 辽阳市| 佛冈县| 柳林县| 驻马店市| 焦作市| 青川县| 禄劝| 沂水县| 稻城县| 木兰县| 修水县| 商河县|