第一篇:RTSP協議學習筆記(學習流媒體的時候自己總結的)
RTSP協議學習筆記
目錄
RTSP協議學習筆記..........................................................................................................1 第一部分:RTSP協議..................................................................................................2
一、RTSP協議概述.....................................................................................2二、三、1.2.3.4.RTSP協議與HTTP協議區別................................................................2 RTSP重要術語.....................................................................................3 集合控制(Aggregate control):............................................................3 實體(Entity):.......................................................................................3 容器文件(Container file):..............................................................3 RTSP會話(RTSP session):..................................................................3
四、RTSP請求消息.....................................................................................3 1.消息格式:..............................................................................................3
五、RTSP回應消息.....................................................................................4 1.消息格式:..............................................................................................4
六、RTSP 重要方法....................................................................................4 1.OPTIONS:...................................................................................................4 2.DESCRIBE:..............................................................................................5 3.SETUP:....................................................................................................6 4.PLAY:......................................................................................................7 5.PAUSE:....................................................................................................8 6.TEARDOWN:...........................................................................................8
七、1.2.RTSP重要頭字段參數..........................................................................9 Accept:....................................................................................................9 Bandwidth:...............................................................................................9 3.CSeq:........................................................................................................9 4.Rang:........................................................................................................9 5.Session:...................................................................................................9 6.Transport:.................................................................................................9
八、簡單的RTSP消息交互過程................................................................10 1.第一步:查詢服務器端可用方法............................................................10 2.3.4.5.6.一、二、三、一、第二步:得到媒體描述信息...................................................................10 第三步:建立RTSP會話........................................................................10 第四步:請求開始傳送數據...................................................................10 第五步: 數據傳送播放中.....................................................................10 第六步:關閉會話,退出.......................................................................10 SDP協議概述.....................................................................................11 SDP格式............................................................................................11 SDP示例...........................................................................................12 MMS協議概述...................................................................................13 第二部分:SDP協議..................................................................................................11 第三部分:MMS協議................................................................................................13
第一部分:RTSP協議
一、RTSP協議概述
RTSP(Real-Time Stream Protocol)是一種基于文本的應用層協議,在語法及一些消息參數等方面,RTSP協議與HTTP協議類似。
RTSP被用于建立的控制媒體流的傳輸,它為多媒體服務扮演“網絡遠程控制”的角色。盡管有時可以把RTSP控制信息和媒體數據流交織在一起傳送,但一般情況RTSP本身并不用于轉送媒體流數據。媒體數據的傳送可通過RTP/RTCP等協議來完成。
一次基本的RTSP操作過程是:首先,客戶端連接到流服務器并發送一個RTSP描述命令(DESCRIBE)。流服務器通過一個SDP描述來進行反饋,反饋信息包括流數量、媒體類型等信息。客戶端再分析該SDP描述,并為會話中的每一個流發送一個RTSP建立命令(SETUP),RTSP建立命令告訴服務器客戶端用于接收媒體數據的端口。流媒體連接建立完成后,客戶端發送一個播放命令(PLAY),服務器就開始在UDP上傳送媒體流(RTP包)到客戶端。在播放過程中客戶端還可以向服務器發送命令來控制快進、快退和暫停等。最后,客戶端可發送一個終止命令(TERADOWN)來結束流媒體會話
二、RTSP協議與HTTP協議區別
1.RTSP引入了幾種新的方法,比如DESCRIBE、PLAY、SETUP 等,并且有不同的協議標識符,RTSP為rtsp 1.0,HTTP為http 1.1;
2.HTTP是無狀態的協議,而RTSP為每個會話保持狀態;
3.RTSP協議的客戶端和服務器端都可以發送Request請求,而在HTTPF 協議中,只有客戶端能發送Request請求。
4.在RTSP協議中,載荷數據一般是通過帶外方式來傳送的(除了交織的情況),及通過RTP協議在不同的通道中來傳送載荷數據。而HTTP協議的載荷數據都是通過帶內方式傳送的,比如請求的網頁數據是在回應的消息體中攜帶的。
5.使用ISO 10646(UTF-8)而不是ISO 8859-1,以配合當前HTML的國際化; 6.RTSP使用URI請求時包含絕對URI。而由于歷史原因造成的向后兼容性問題,HTTP/1.1只在請求中包含絕對路徑,把主機名放入單獨的標題域中;
三、RTSP重要術語
1.集合控制(Aggregate control):
對多個流的同時控制。對音頻/視頻來講,客戶端僅需發送一條播放或者暫停消息就可同時控制音頻流和視頻流。
2.實體(Entity):
作為請求或者回應的有效負荷傳輸的信息。由以實體標題域(entity-header field)形式存在的元信息和以實體主體(entity body)形式存在的內容組成
3.容器文件(Container file):
可以容納多個媒體流的文件。RTSP服務器可以為這些容器文件提供集合控制。
4.RTSP會話(RTSP session):
RTSP交互的全過程。對一個電影的觀看過程,會話(session)包括由客戶端建立媒體流傳輸機制(SETUP),使用播放(PLAY)或錄制(RECORD)開始傳送流,用停止(TEARDOWN)關閉流。
四、RTSP請求消息
1.消息格式:
方法 URI RTSP版本 CR LF 消息頭 CR LF CR LF 消息體 CR LF
其中方法包括OPIONS、DESCRIBE、SETUP、PLAY、TEARDOWN等,URI是接受方的地址,例如:rtsp://192.168.0.1/video1.3gp。
RTSP版本一般都是 RTSP/1.0。每行后面的CR LF表示回車換行,需要接受端有相應的解析,最后一個消息頭需要有兩個CR LF 消息體是可選的,有的Request消息并不帶消息體。
五、RTSP回應消息
1.消息格式:
RTSP版本 狀態碼 解釋 CR LF 消息頭 CR LF CR LF 消息體 CR LF 其中RTSP版本一般都是RTSP/1.0,狀態碼是一個數值,用于表示Request消息的執行結果,比如200表示成功,解釋是與狀態碼對應的文本解釋.六、RTSP 重要方法
1.OPTIONS:
用于得到服務器提供的可用方法; 如: OPTIONS rtsp://192.168.20.136:5000/xxx666 RTSP/1.0 CSeq: 1 服務器的回應信息會在Public字段列出提供的方法。如: RTSP/1.0 200 OK CSeq: 1 //每個回應消息的cseq數值和請求消息的cseq相對應 Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE 2.DESCRIBE:
客戶端向服務器端發送DESCRIBE,用于得到URI所指定的媒體描述信息,一般是SDP信息。客戶端通過Accept頭指定客戶端可以接受的媒體述信息類型。
如:
C->S: DESCRIBE rtsp://server.example.com/fizzle/foo RTSP/1.0 CSeq: 312 Accept: application/sdp, application/rtsl, application/mheg)服務器回應URI指定媒體的描述信息: 如: S->C: RTSP/1.0 200 OK CSeq: 312 Date: 23 Jan 1997 15:35:06 GMT Content-Type: application/sdp //表示回應為SDP信息 Content-Length: 376 //這里為一個空行 //以下為具體的SDP信息 v=0 o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4 s=SDP Seminar i=A Seminar on the session description protocol u=http://www.tmdps.cn/foo/bar/baz.rm RTSP/1.0 CSeq: 302 Transport: RTP/AVP;unicast;client_port=4588-4589 服務器端對SETUP Request產生一個Session Identifiers。如: S->C: RTSP/1.0 200 OK CSeq: 302 Date: 23 Jan 1997 15:35:06 GMT Session: 47112344 //產生一個Session ID Transport: RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257
4.PLAY:
PLAY方法告知服務器通過SETUP中指定的機制開始發送數據。在尚未收到SETUP請求的成功應答之前,客戶端不可以發出PLAY請求。
PLAY請求將正常播放時間(normal play time)定位到指定范圍的起始處,并且傳輸數據流直到播放范圍結束。PLAY請求可能被管道化(pipelined),即放入隊列中(queued);服務器必須將PLAY請求放到隊列中有序執行。也就是說,后一個PLAY請求需要等待前一個PLAY請求完成才能得到執行。
比如,在下例中,不管到達的兩個PLAY請求之間有多緊湊,服務器首先play第10到15秒,然后立即第20到25秒,最后是第30秒直到結束。
C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0 CSeq: 835 Session: 12345678 Range: npt=10-15 C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0 CSeq: 836 Session: 12345678 Range: npt=20-25 C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0 CSeq: 837 Session: 12345678 Range: npt=30-
Range頭可能包含一個時間參數。該參數以UTC格式指定了播放開始的時間。如果在這個指定時間后收到消息,那么播放立即開始。時間參數可能用來幫助同步從不同數據源獲取的數據流。
不含Range頭的PLAY請求也是合法的。它從媒體流開頭開始播放,直到媒體流被暫停。如果媒體流通過PAUSE暫停,媒體流傳輸將在暫停點(the pause point)重新開始。
如果媒體流正在播放,那么這樣一個PLAY請求將不起更多的作用,只是客戶端可以用此來測試服務器是否存活。
5.PAUSE:
PAUSE請求引起媒體流傳輸的暫時中斷。如果請求URL中指定了具體的媒體流,那么只有該媒體流的播放和記錄被暫停(halt)。比如,指定暫停音頻,播放將會無聲。如果請求URL指定了一組流,那么在該組中的所有流的傳輸將被暫停。如:
C->S: PAUSE rtsp://example.com/fizzle/foo RTSP/1.0 CSeq: 834 Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 834 Date: 23 Jan 1997 15:35:06 GMT
PAUSE請求中可能包含一個Range頭用來指定何時媒體流暫停,我們稱這個時刻為暫停點(pause point)。該頭必須包含一個精確的值,而不是一個時間范圍。媒體流的正常播放時間設置成暫停點。當服務器遇到在任何當前掛起(pending)的PLAY請求中指定的時間點后,暫停請求生效。如果Range頭指定了一個時間超出了任何一個當前掛起的PLAY請求,將返回錯誤“457 Invalid Range”。如果一個媒體單元(比如一個音頻或視頻禎)正好在一個暫停點開始,那么表示將不會被播放或記錄。如果Range頭缺失,那么在收到暫停消息后媒體流傳輸立即中斷,并且暫停點設置成當前正常播放時間。
6.TEARDOWN:
TEARDOWN請求終止了給定URI的媒體流傳輸,并釋放了與該媒體流相關的資源。如:
C->S: TEARDOWN rtsp://example.com/fizzle/foo RTSP/1.0 CSeq: 892
Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 892
七、RTSP重要頭字段參數
1.Accept:
用于指定客戶端可以接受的媒體描述信息類型。比如: Accept: application/rtsl, application/sdp;level=2 2.Bandwidth:
用于描述客戶端可用的帶寬值。
3.CSeq:
指定了RTSP請求回應對的序列號,在每個請求或回應中都必須包括這個頭字段。對每個包含一個給定序列號的請求消息,都會有一個相同序列號的回應消息。
4.Rang:
用于指定一個時間范圍,可以使用SMPTE、NTP或clock時間單元。
5.Session:
Session頭字段標識了一個RTSP會話。Session ID 是由服務器在SETUP的回應中選擇的,客戶端一當得到Session ID后,在以后的對Session 的操作請求消息中都要包含Session ID.6.Transport:
Transport頭字段包含客戶端可以接受的轉輸選項列表,包括傳輸協議,地址端口,TTL等。服務器端也通過這個頭字段返回實際選擇的具體選項。如: Transport: RTP/AVP;multicast;ttl=127;mode=“PLAY”, RTP/AVP;unicast;client_port=3456-3457;mode=“PLAY”
八、簡單的RTSP消息交互過程
C表示RTSP客戶端,S表示RTSP服務端
1.第一步:查詢服務器端可用方法
1.C->S:OPTION request //詢問S有哪些方法可用
1.S->C:OPTION response //S回應信息的public頭字段中包括提供的所有可用方法
2.第二步:得到媒體描述信息
2.C->S:DESCRIBE request //要求得到S提供的媒體描述信息 2.S->C:DESCRIBE response //S回應媒體描述信息,一般是sdp信息
3.第三步:建立RTSP會話
3.C->S:SETUP request //通過Transport頭字段列出可接受的傳輸選項,請求S建立會話
3.S->C:SETUP response //S建立會話,通過Transport頭字段返回選擇的具體轉輸選項,并返回建立的Session ID;4.第四步:請求開始傳送數據
4.C->S:PLAY request //C請求S開始發送數據 4.S->C:PLAY response //S回應該請求的信息
5.第五步: 數據傳送播放中
S->C:發送流媒體數據 // 通過RTP協議傳送數據
6.第六步:關閉會話,退出
6.C->S:TEARDOWN request //C請求關閉會話
6.S->C:TEARDOWN response //S回應該請求
上述的過程只是標準的、友好的rtsp流程,但實際的需求中并不一定按此過程。
其中第三和第四步是必需的!第一步,只要服務器客戶端約定好,有哪些方法可用,則option請求可以不要。第二步,如果我們有其他途徑得到媒體初始化描述信息(比如http請求等等),則我們也不需要通過rtsp中的describe請求來完成。
第二部分:SDP協議
一、SDP協議概述
SDP(Session Description Protocol)會話描述協議,用于描述多媒體會話,它為會話通知、會話初始和其它形式的多媒體會話初始等操作提供服務。
SDP 的設計宗旨是通用性協議,所有它可以應用于很大范圍的網絡環境和應用程序,但 SDP 不支持會話內容或媒體編碼的協商操作。
SDP信息包括:
? ? ? ? 會話名稱和目標; 會話活動時間; 構成會話的媒體;
有關接收媒體的信息、地址等。
二、SDP格式
SDP 信息是文本信息,UTF-8 編碼采用 ISO 10646 字符設置。SDP 會話描述如下(標注*符號的表示可選字段):
v=(協議版本)
? o=(所有者/創建者和會話標識符)? s=(會話名稱)? i=*(會話信息)?
? ? ? ? ? u=*(URI 描述)e=*(Email 地址)p=*(電話號碼)
c=*(連接信息 ― 如果包含在所有媒體中,則不需要該字段)b=*(帶寬信息)
一個或更多時間描述(如下所示): z=*(時間區域調整)? k=*(加密密鑰)
? a=*(0個或多個會話屬性線路)? 0個或多個媒體描述(如下所示)?
時間描述
t=(會話活動時間)
? r=*(0或多次重復次數)?
媒體描述
? ? ? ? ? ? m=(媒體名稱和傳輸地址)i=*(媒體標題)
c=*(連接信息 — 如果包含在會話層則該字段可選)b=*(帶寬信息)k=*(加密密鑰)
a=*(0個或多個會話屬性線路)
三、SDP示例
v=0 o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4 s=SDP Seminar i=A Seminar on the session description protocol u=http://www.tmdps.cnpatibility.Support for the protocol was finally dropped in Windows Media Services 2008[1].Note however that Microsoft still recommends[2] using “mms://” as a “protocol rollover[3] URL”.As part of protocol rollover a Windows Media Player 11 client opening an “mms://” URL will attempt to connect first with RTSP over UDP and if that fails it will attempt RTSP over TCP.Earlier Windows Media Player clients as well as version 11 after having failed RTSP will attempt MMS over UDP, then MMS over TCP.If MMS failed a modified version of a HTTP over TCP connection will be attempted, this modified version is also referred to as MMSH[4].
第二篇:常見接口協議學習筆記總結
SPI通信
SPI簡介:(高速,全雙工,4線同步串行總線)
SCK:主機輸出的用來同步數據傳輸的串行時鐘;MOSI:主機輸出從機輸入;MISO主機輸入從機輸出;NSS:由主機輸出的片選使能低電平有效 SPI例程相關配置如下:
注意事項:(與配置UART 類似)1.配置SPI x時應確保對應相應路的SPI 2.配置相關GPIO和使能其時鐘時要對應正確的管腳類型 3.特別注意配置各路SPI時,確定其對應的替代函數映射形式
硬件連接示意圖:
SPI通信是由主設備時鐘信號來確定主/從設備間的通信。一旦檢測到主設備的時鐘信號,在SCK(只由主機控制)的控制下,兩個串行移位寄存器進行數據交換。
注意:當一個系統下掛有多個SPI從機設備時,可以有GPIO口對使能端NSS進行控制,當只有一個從機時可以將使能端NSS直接接地拉低。
SPI寄存器數據傳輸圖示
SPI各個設備傳輸數據的過程中總是先發送或接收高字節數據,每個時鐘周期接收器或收發器左移1位數據。對于小于16位的數據在發送之前必須左對齊,如果接收的數據小于16位則采用軟件將無效的數據位屏蔽。特別注意:主機的時鐘極性和相位以從機為基準,要搞清楚數據傳輸是在上升沿輸出還是在下降沿接收數據等等,都要進行一一對應。
I2C通信
I2C簡介:一個雙向的兩線連續總線,一條數據線(SDA)和一條時鐘線(SCL)。I2C總線有三種數據傳輸速度:標準模式100Kbps,快速模式400Kbps和高速模式可達3.4Mbps。
I2C總線結構主要用于連接整體電路,一種雙向控制總線,即多個芯片(設備)可連接同一總線結構下,每個設備都可以作為實時數據傳輸的控制源,簡化了總線結構。外設連接示意圖:
在不發送任何數據的時候數據線和時鐘線都為高電平。
所以I2C通信在硬件設計,需要在數據線和時鐘線上分別加上兩個上拉電阻。其次,I2C控制硬件進行數據傳輸時,硬件狀態的改變需要一定的時間。
I2C例程配置如下:
注意事項:(與配置SPI,UART 類似)
1.配置I2C x時應確保對應相應路的I2C(例程為I2C3)2.配置相關GPIO和使能其時鐘時要對應正確的管腳類型 3.特別注意在主函數中,開始時要對相關的時鐘進行使能 數據通信時序簡介:
1.主機發送開始信號,將SDA拉低,此時SCL處于高電平狀態。2.從機檢測到開始信號,準備接收數據。
3.主機先拉低SCL將數據一位一位放在SDA上,然后再將SCL拉高(釋放)。
4.從機檢測到SCL的變化,會在SCL高電平期間(主機不會太長時間去等待從機接受)將下一個SDA數據放進自己的寄存器中待處理。
5.主機會在設定好的時間后將SCL拉低并放進下一個SDA,然后再拉高SCL,從機會在SCL高電平期間讀取SDA數據。
6.如此往復,完成8位數據(1Byte)傳輸,此時SCL處于低電平,SDA處于高電平。
總線死鎖現象分析與解決方法
I2C總線寫操作過程中,主機在產生啟動信號后控制SCL產生8個時鐘脈沖,然后拉低SCL信號為低電平,在這個時候,從機輸出應答信號,將SDA信號拉為低電平。如果這個時候主機異常復位,SCL就會被釋放為高電平。此時,如果從機沒有復位,就會繼續I2C的應答,將SDA一直拉為低電平,直到SCL變為低電平,才會結束應答信號。而對于主機來說,復位后檢測SCL和SDA信號,如果發現SDA信號為低電平,則會認為I2C總線被占用,會一直等待SCL和SDA信號變為高電平。這樣,主機等待從機釋放SDA信號,而同時從機又在等待主機將SCL信號拉低以釋放應答信號,兩者相互等待,I2C總線進人一種死鎖狀態。同樣,當I2C進行讀操作時,從機應答后輸出數據,如果在這個時刻主機異常復位而此時從機輸出的數據位正好為0,也會導致I2C總線進入死鎖狀態。解決方案通常有如下幾種:
(1)將從機的電源設計為可控,當發生總線死鎖時將從機復位
(2)可以在從機的程序中加入監測功能,如果總線長時間被拉低則釋放對總線的控制(3)在主機中增加I2C總線恢復程序。每次主機復位后,如果檢測到SDA被拉低,則控制SCL產生<=9個時鐘脈沖(針對8位數據的情況),每發送一個時鐘脈沖就檢測SDA是否被釋放,如果SDA已經被釋放就再模擬產生一個停止信號,這樣從機就可以完成被掛起的讀寫操作,從死鎖狀態中恢復過來。這種方法有一定的局限性,因為大部分主機的I2C模塊由內置的硬件電路來實現,軟件并不能夠直接控制SCL信號模擬產生需要時鐘脈沖。筆記:
時鐘SCL只能由主機控制,數據SDA主機從機都可控制。I2C主機通過地址選擇要與自己通信的從機; I2C起始信號:SCL = 1, SDA產生一個下降沿; I2C結束信號:SCL = 1,SDA產生一個上升沿;
在數據傳輸階段:SCL = 1的時候SDA數據線不能變化,如果SDA發生變化那意味著結束;
SCL = 1;SDA = 1;為空閑狀態;
總線上各器件的SCL、SDA為線與關系,某一個器件的引腳輸出低,則為低。通信過程中要注意應答信號,在第9個時鐘時,SDA=0(ack響應),SDA=1(nak不響應)。
第三篇:一個自己學習總結的php類學習筆記
1,類:類是一組具有相同數據結構和相同操作的對象的集合,類是對象的抽象,他將一組數據屬性和在數據上的一組合法操作抽象封裝,類好比是一個對象模板,基于類就可以生成多個具有不同屬性值的對象。
2,創建類:
Class classname
{
}
3,為該類添加屬性和方法:只需要在類中聲明變量即可。聲明了屬性之后可以獲取該屬性的值。
⑴創建屬性:Class classname
{
Var $myName;
Var $myAge;
}
⑵創建方法:class classname
{
Var $myName;
Var $myAge;
Function getName()
{
}
Function getAget($arg1,$arg2)
{
}
}
注:以上創建了兩個類的方法,方法名稱分別為:getName,getAge
4,構造函數:大多數的類都有構造函數,當一個類實例被調用時,將調用構造函數,通常在構造函數中將執行一些初始化的操作。
⑴在類中聲明構造函數:同聲明其他函數一樣,但是構造函數的名稱是固定的。即函數名必須為:__construct()
注:構造函數可以由編程人員主動調用,但大部分時候,都是在創建類對象實例的時候自動調用。構造函數也可以傳遞參數,這些參數可以在調用類的時候傳遞。
聲明構造函數的方法:
Class classname
{
Function __construct($param)
{
代碼
}}
⑵析構函數:是一種當對象被銷毀時,無論使用了unset()或簡單的脫離范圍,都會被自動調用的函數。
與構造函數的名稱類似,一個類的析構函數名稱必須是_destruct()
5,類的實例化:聲明了一個類之后,如果要使用該類,必須創建該類的一個實例,實際上也可以將該類作為一個變量,在使用之前必須手動定義。用關鍵字“new”來創建
一個類的實例。
Class classname
{
Function __construct($myName)
{echo(“我的名字是:$myName
”);}
}
$name1=new myName(“小豬”);
$name2=new myName(“小狗”);//創建了2個該類的實例
?>
注:new myName(“小豬”)中的參數“小豬”會被 自動傳遞到構造函數,然后構造函數直接使用該參數。
6,使用類的屬性:
在一個類中訪問類成員變量有一個特殊的指針:$this通過該指針可能方便的訪問類屬性或是給類屬性賦值。
Class classname
{
Var $myattrib;//定義屬性
Function operate($myparam)//為類創建方法
{
$this->myattrib=$myparam;//設置屬性值為$myparam
Echo $this->myattrib;//輸出屬性值
}
}
⑴如果要在類的外部訪問一個類的屬性,需要確定該屬性能否被外部訪問。因為在類中定義的屬性可以設置外界訪問的權限。
以上對屬性$myarrtib進行限制,外界可以直接訪問:
$newclass =new classname();//創建一個類classname實例
$newclass->myattrib=”小馬”;//給屬性賦值
Echo $newclass->myattrib;//輸出屬性
⑵從類的外部直接訪問類的屬性不是一個好的方法,面向對象方法的一個優點就是使用類的封裝。可以通過使用__get()和__set()函數來實現對該類屬性的訪問。
Class classname
{
Var $myattrib;//定義屬性
Function __get($attribName)//獲取屬性值的函數
{
Return $this->attribName;//返回該屬性的值
}
Function __set($arrtibName,$value)//設置屬性值的函數
{
$this->$attribName=$value;//設置屬性值
}
}
注:__get函數只有一個參數,該參數用來傳遞屬性的名稱,__set函數有兩個參數,第一個參數為屬性的名稱,第二個參數為要設置的屬性的值。可以通過這兩 個函數來檢查和設置任何屬性的值。
7,類的訪問控制:
Php5 支持的3 種控制符:
⑴public(默認的)public表示該屬性和方法在類的內部或外部都可以直接被訪問。
⑵private 表示該屬性和方法只能在類的內部進行訪問。如果沒有使用__get()和__set(),則可能對所有的屬性都使用這個關鍵字,也要選擇部分方法為私有,但私有的屬性和方法不能被繼承。
⑶Protected 表示被標記的屬性或方法只能在類的內部進行訪問,他也存在于任何子類中。Class classname
{
Public $myattrib;
Public function __get($attribName)//獲取屬性值的函數
{
Return $this->$attribName;//返回該屬性值
}
Public function __set($attribName,$value)//設置屬性值的函數
{
This->$attribName=$value;//設置屬性值
}
}
8,類方法的調用:
Class classname
{
Var $myAttrib;
Function func_1($param)//函數func_1
{
代碼
}
Function func_2($param1$param2)
{
代碼
}
Function func_3($param1$param2)
{
代碼
Return backvalue;
}
}
調用以上類的3個函數:
$newclass->func_1(“123”);
$newclass->func_2(“123”,”abc”);
$myvalue=$newclass->func_3(“123”,”abc”);//調用func_3并獲取返回值。
9,有關類的代碼:
$this通過該指針可能方便的訪問類屬性或是給類屬性賦值。class Employee//創建一個類“Employee”
{
var $empno;// 員工人數//定義類的屬性
var $empnm;// 員工姓名
function add_employee($in_num, $in_name)//創建類的方法為“add_employee”
{
$this->empno = $in_num;//給類的屬性賦值
$this->empnm = $in_name;
}
function show()//創建類的方法為“show”
{
echo “$this->empno, $this->empnm”;//輸出屬性值
return;
}
function changenm($in_name)
{
$this->empnm = $in_name;}
}
$sbabu = new Employee;
$sbabu->add_employee(10,“sbabu”);$sbabu->changenm(“babu”);$sbabu->show();
第四篇:網絡學習筆記總結
1需要掌握重點:
網絡的定義:網絡就是將兩臺或兩臺以上的計算機以一定方式連接起來,起到共享文件,程序數據的作用
網絡分類
1)按范圍分:lan,wan,man 2)按拓撲結構分:總線型,環形,星型,樹形
3)按傳輸介質分:雙絞線,同軸電纜,光纖,無線網絡
局域網中常用設備:交換機,路由器
十進制和二進制的轉換
十進制(逢十進一):范圍0-9 二進制(逢二進一):范圍0-1 轉換方式(二進制轉十進制:湊數法,在計算機中1為真,0為假,只取真值相加結果就為十進制,十進制轉二進制也同樣如此,詳見案例)
111011這個二進制轉十進制
64 32 16 8 4 2 1 0
0 1 1 0 1 1 結果:32+16+8+2+1=59
13這個十進制轉二進制 16 8 4 2 1 0 1 1 0 1 結果:1101
2需要掌握重點: Osi七層模型
物理層:bit流的傳輸
數據鏈路層:提供介質得到訪問的鏈路的管理 網絡層:尋址和路由選擇
傳輸層:建立主機端到端的連接 會話層:建立維護和管理會話
表示層:處理數據的加密和數據格式 應用層:提供程序間的通信
tcp/ip四層模型
層
封裝協議
網絡接口層: ppp,hdlc,fr 網絡層:
ip 傳輸層:
tcp/udp 應用層
http/telnet/ftp/dns等
3需要掌握重點 數據通信基礎:
1數據組成:字母和數字,如:圖片,視頻,文字等 2數據通信:
1)數據交換的過程
2)傳輸介質來進行數據傳輸 3)傳輸介質:網線,無線,光釬
網線做法:
A 白綠,綠,白橙,藍,白藍,橙,白棕,棕
B 白橙,橙,白綠,藍,白藍,綠,白棕,棕
(兩端都一致,在現實生活中98%都用這種,用于連接不同層的設備)
網線(最高傳輸距離為100m)分為: 全反線:配置路由器和交換機 直通線:不同層設備的連接 交叉線:相同層設備的連接
光釬:單模和多模
特點:傳輸帶寬高,距離遠,抗干擾能力強
3數據通信系統的組成 1)發送方 2)接收方 3)傳輸介質 4)預定--協議 5)數據包-報文
4數據流方向
1)單工,只接收數據,不發送(電視機,顯示器)2)半雙工,在發送的時候不能接收數據(對講機)3)全雙工,可以同時發送和接收數據
(手機)
4需要掌握重點
綜合布線系統(六大子系統)水平子系統 工作區子系統 管理子系統 垂直子系統 建筑群子系統 設備間子系統
5需要掌握重點
沖突域:在以太網中,當多個節點同時傳輸數據時,從多個設備發出的幀將會碰撞,在物理介質上相遇,彼此數據都將會被破壞,這樣的共享介質網段就叫沖突域 交換機隔離沖突域(交換機每一個端口就代表一個沖突域)
廣播域:廣播幀傳輸的網絡范圍,一般是由路由器來設定邊界的,(因為路由器不轉發廣播)路由器隔離廣播域(路由器的每一個端口代表一個廣播域)
交換機原理(工作在數據鏈路層):根據源mac地址學習,目標mac地址轉發,基于硬件轉發 三種轉發方式
1)對已知單播幀,只對應端口轉發 2)對未知單播幀,進行廣播 3)對廣播幀進行廣播
交換機分類:二層交換機,三層交換機,vlan型交換機
思科設備的命令行管理模式 用戶模式> 特權模式#
en
全局配置模式(config)conf t 接口模式(config)# int 接口類型、模塊號
如f0/1
Exit返回上一級 End 返回特權模式 Ctrl+z 返回特權模式
6需要掌握重點
Ip地址:主機唯一標識,是世界上唯一的,跟mac地址一樣,mac是物理地址,ip地址是邏輯地址,主要是保障主機間能正常通信,方便記憶
Ip地址分為ipv4(現在主流用的,幾乎接觸的100%都是這類地址)和ipv6
Ipv4地址分為兩部分來表示 網絡位--大廈名稱 主機位---門牌號
Ipv4表示方法:點分十進制,共4個字節(32個bit),每一個字節為一個單位,中間用“.”l來區分開
如:192.168.1.24/24
Ip地址分類:abc類最常用,d用于組播,e用于保留科研 類型
范圍
二進制網絡位
二進制主機位
可用主機數 A
0-127
2的24次方-2 B
128-191
2的16次方-2 C
192-223
2的8次方-2 D
224-239 E
240-255
子網掩碼:用來區分主機位和網絡位的7需要掌握重點 網絡層協議
功能:1)處理來自傳輸層得的分組發送請求 2)輸出輸入數據報文 3)處理icmp報文
Arp協議:(地址解析協議):負責將對應的ip地址解析成mac地址 Arp功能就是通過目標主機查詢其mac地址
Icmp協議:錯誤偵測與回饋機制,用來發送和控制消息 典型應用ping Ping語法
ping 空格
[選項]
8需要掌握重點
路由器工作原理:尋址和轉發
路由協議:直連路由,靜態路由,動態路由
靜態路由的優缺點 優點:
1)對硬件資源占用不高 2)不占用帶寬 3)增加網絡安全 缺點:
1)配置工作量大并且容易出錯 2)適應拓撲變化能力較差
靜態路由配置語法: ip route 目的ip網絡號
子網掩碼
直連路由的出口地址 默認路由配置語法: ip route 0.0.0.0 0.0.0.0 直連路由的出口地址
演示案例: 實驗拓撲圖:
配置命令:
實驗步驟:首先必須要配置好預配置,也就是把環境搭建好的情況下才可能完成此實驗,搭建環境包括,配置每個接口的ip地址,確保每個直連路由是ok的 en conf t host R1 inter f0/0 ip add 13.1.1.1 255.255.255.0 no shut inter s1/1 ip add 12.1.1.1 255.255.255.0 no shut inter lo 0 ip add 1.1.1.1 255.255.255.0 end
en conf t host R2 inter s1/0 ip add 12.1.1.2 255.255.255.0 no shut inter s1/1 ip add 23.1.1.2 255.255.255.0 no shut inter lo 0 ip add 2.2.2.2 255.255.255.0 end
en conf t host R3 inter f0/0
ip add 13.1.1.3 255.255.255.0 no shut inter s1/0 ip add 23.1.1.3 255.255.255.0 no shut inter lo 0 ip add 3.3.3.3 255.255.255.0 end
//配置好預配置之后,靜態路由的配置
R1的靜態路由配置
ip route 2.2.2.0 255.255.255.0 12.1.1.2 ip route 3.3.3.0 255.255.255.0 13.1.1.3 ip route 23.1.1.0 255.255.255.0 13.1.1.3
R2的靜態路由配置
ip route 1.1.1.0 255.255.255.0 12.1.1.1 ip route 3.3.3.0 255.255.255.0 23.1.1.0 ip route 13.1.1.0 255.255.255.0 12.1.1.1
R3的靜態路由配置
ip route 1.1.1.0 255.255.255.0 13.1.1.1 ip route 2.2.2.0 255.255.255.0 23.1.1.2 ip route 12.1.1.0 255.255.255.0 13.1.1.1
//刪除靜態路由 刪除R1的靜態路由
no ip route 2.2.2.0 255.255.255.0 12.1.1.2 no ip route 3.3.3.0 255.255.255.0 13.1.1.3 no ip route 23.1.1.0 255.255.255.0 13.1.1.3
刪除R2的靜態路由
no ip route 1.1.1.0 255.255.255.0 12.1.1.1 no ip route 3.3.3.0 255.255.255.0 23.1.1.0 no ip route 13.1.1.0 255.255.255.0 12.1.1.1
刪除R3的靜態路由
no ip route 1.1.1.0 255.255.255.0 13.1.1.1 no ip route 2.2.2.0 255.255.255.0 23.1.1.2 no ip route 12.1.1.0 255.255.255.0 13.1.1.1
//默認路由的配置 默認路由
R1: ip route 0.0.0.0 0.0.0.0 12.1.1.2 R2: ip route 0.0.0.0 0.0.0.0 23.1.1.3 R3: ip route 0.0.0.0 0.0.0.0 13.1.1.1
第五篇:java學習筆記總結
java 學習筆記總結
1.Java是什么呢?
Java不僅是一門語言,而且是一個完整的平臺,有一個龐大的庫,其中包含了很多可重用的代碼和一個提供安全性、跨操作系統的可移植性以及自動垃圾收集等服務的執行環境。
2.JDK 和 JRE 是什么?
JDK:全稱是 Java Development Kit,這是我們編寫java程序的開發人員需要的。我們首先要下載和安裝JDK,然后設置環境變量,具體操作可以加我扣:七零五叁零六久久久
JRE:全稱是 Java Runtime Environment,它包含虛擬機但不包含編譯器,這是運行java程序的用戶需要的環境
3.來個Hello World看看吧?
照例先創建一個類HelloWorld.java,源代碼如下: /** * @author 老孫
*/ public class HelloWorld {
public static void main(String[] args){
System.out.println(“Hello World”);
} } Java類名一般是以大寫字母開頭的名詞,多個單詞的話每個單詞首字母都應該大寫。Java源代碼以.java作為擴展名,而且文件名必須和文件里的公共類同名。
4.怎么用命令行運行java程序?
比如上面我們編寫了一個類叫做HelloWorld.java,首先打開一個終端;
? 然后進入到HelloWorld.java類所在的目錄; ? 輸入命令 javac HelloWorld.java。javac是一個java編譯器,注意該命令需要的是文件名,也就是要帶著.java后綴。? 輸入命令 java HelloWorld。java啟動Java虛擬機,該命令只需要類名,不需要帶著.java或者.class等后綴。?
5.Java代碼怎么加注釋?
// 單行注釋 和 /*{……}*/ 長篇注釋,這兩種方式很多語言都一樣,沒什么特別強調的。
另外還有一種注釋可以方便的生成java doc文檔,以/** 開頭,以*/結束。
6.Java的幾種基本數據類型是?
4種整型:byte(1字節),short(2字節),int(4字節),long(4字節)。(PS:Java沒有無符號整型)? 2種浮點型:float(4字節),double(8字節)? 字符類型:char ? 布爾類型:boolean
在Java種每個類型占用幾個字節是固定的,與運行java的機器無關,這點與C#不同,這也是Java具有可移植性的關鍵點。
浮點類型一般double比float常用,而且浮點型存在四舍五入的情況,如果用在對精確度要求高的商業場景,就得使用java.math.BigDecimal類型了。我們寫個demo看看: ?
/** * @author 老孫
*/ public class DemoDouble { public static void main(String[] args){
double d1=0.05;
double d2=0.01;
double result=d1+d2;
System.out.println(result);//結果:0.***005
BigDecimal bd1=new BigDecimal(“0.05”);
BigDecimal bd2=new BigDecimal(Double.valueOf(“0.01”));
double result2=bd1.add(bd2).doubleValue();
System.out.println(result2);//結果:0.06
} }
7.Java怎么定義常量?
使用關鍵字final定義常量,之前C#用的是const關鍵字,這一點不同要注意一下。命名規則上,常量一般使用大寫字母,中間用下劃線分隔。例如: private static final Integer MAX_SIZE=100;
8.String字符串怎么截取子串?
Substring(beginIndex,endIndex):返回子字符串,從beginIndex到endIndex-1。String s=“你好,今天是2018年1月5日,圣誕快樂!” String date = s.substring(6,17);System.out.println(date);// 輸出:2018年1月5日
注意:該方法的返回結果不包含最后一個位置的字符。如果有問題就問我:七零五叁零六久久久 9.Java字符串怎么拼接?
①最簡單的拼接方式就是使用+符號。
②String.join(char,str1,str2….strN):靜態方法拼接字符串,用字符char分隔,將字符串進行拼接。//拼接
String s2=String.join(“、”,“JAVA核心技術”,“JAVA編程思想”,“SpringBoot”);System.out.println(s2);//輸出:JAVA核心技術、JAVA編程思想、SpringBoot
③當有大量字符串拼接操作的時候使用StringBuilder,這跟C#基本相同。
10.怎么判斷兩個Java字符串是否相等?
equals方法判斷兩個字符串內容是否相等。而==判斷兩個字符串是否指向內存中同一位置。//比較
String s3=“abc”;String s4=“abc”;String s5=new String(“abc”);String s6=new String(“abc”);System.out.println(s3==s4);//true System.out.println(s3.equals(s4));//true System.out.println(s5==s6);//false System.out.println(s5.equals(s6));//true 這個demo中s3==s4返回true,因為在Java中字符串是不可修改的,編譯器有一些優化機制讓字符串共享,所以s3和s4實際上指向了內存中同一位置 11.Java數組有哪些常用操作?
①foreach循環數組
//foreach循環數組 int[] arr={1,3,5,7,9};for(int item:arr){ System.out.println(item);} ②打印數組元素
Arrays.toString(a):返回字符串,數組元素包含在方括號中,以逗號分隔。Arrays.deepToString(arr):用來打印多維數組。//打印數組
System.out.println(Arrays.toString(arr));//輸出 [1, 3, 5, 7, 9] int[][] arrM={{1,2,3},{11,12,13},{21,22,23}};System.out.println(Arrays.deepToString(arrM));//[[1, 2, 3], [11, 12, 13], [21, 22, 23]] ③拷貝數組元素
靜態方法Arrays.copyOf(originalArray,length):第一個參數是要拷貝的源數組,第二個元素是新數組的長度,如果第二個大于原數組長度,則自動填充默認值。//拷貝數組元素
int[] arr2=Arrays.copyOf(arr,arr.length);System.out.println(Arrays.toString(arr2));//輸出 [1, 3, 5, 7, 9] int[] arr3=Arrays.copyOf(arr,arr.length/2);System.out.println(Arrays.toString(arr3));//輸出 [1, 3] int[] arr4=Arrays.copyOf(arr,arr.length*2);System.out.println(Arrays.toString(arr4));//輸出 [1, 3, 5, 7, 9, 0, 0, 0, 0, 0] ④排序
靜態方法Arrays.sort()方法采用優化后的快速排序算法對數組元素進行排序。//排序
int[] arr6={12,4,53,78,21,943,3};Arrays.sort(arr6);System.out.println(Arrays.toString(arr6));//輸出 [3, 4, 12, 21, 53, 78, 943]
⑤查找
靜態方法Arrays.binarySearch(arr, valueToFind):二分查找,第一個參數是要查找的數組,第二個參數是要查找的目標元素。該方法有個前提是數組必須是有序的。//查找
int index=Arrays.binarySearch(arr6,12);//輸出 2 System.out.println(index);
⑥填充數組元素
靜態方法Arrays.fill(arr,item):將數組arr每個元素都填充為item.//填充數組元素
String[] arr7=new String[5];Arrays.fill(arr7,“*”);System.out.println(Arrays.toString(arr7));//[*, *, *, *, *]
⑦比較數組
注意要使用Arrays.equals(arr1,arr2)比較數組,如果兩個數組元素全部相同,則返回true。//比較數組元素
String[] arr8={“*”,“*”,“*”,“*”,“*”,};System.out.println(arr7.equals(arr8));//false System.out.println(Arrays.equals(arr7,arr8));//true
12.日期對象LocalDate ①獲取當前日期時間 //當前日期
LocalDate today=LocalDate.now();
System.out.println(today);//2017-12-26
//當前時間
LocalTime currentTime=LocalTime.now();
System.out.println(currentTime);//12:23:09.054
//當前日期時間
LocalDateTime dateTime=LocalDateTime.now();
System.out.println(dateTime);//2017-12-26T12:23:09.054
②構造某個指定日期
//構造指定日期
LocalDate newYear=LocalDate.of(2018,1,1);System.out.println(newYear);//2018-01-01
③解析日期字符串,如果不合法會拋出異常。
//解析日期字符串
LocalDate date1=LocalDate.parse(“2018-12-31”);System.out.println(date1);//2018-12-31//LocalDate.parse(“2018-11-31”);//拋出異常
④獲取若干天后的某個日期 //15天后
LocalDate date15=today.plusDays(15);System.out.println(date15);//2018-01-10
⑤獲取年份、月份、日期
//獲取年、月、日
System.out.println(date15.getYear());//2018 System.out.println(date15.getMonth());//JANUARY System.out.println(date15.getMonthValue());//1 System.out.println(date15.getDayOfMonth());//10 System.out.println(date15.getDayOfWeek());//WEDNESDAY System.out.println(date15.getDayOfYear());//10 注意:使用Date對象的getYear()方法,不能獲取當前的年份
System.out.println(new Date().getYear());//117,不是我們想要的結果2018 我們看一下該方法的源碼,計算的是當前年份和1900年的差值
public int getYear(){ return normalize().getYear()-1900;}
大家在學習的過程中遇到任何的問題都可以咨詢我(QQ:705306999,奔跑de蝸牛)
也可以加入到我們的免費學習交流群: 579016988(職坐標java編程交流群2)玩微信的朋友也可以加老孫的個人微信公眾號:微信右上角點擊加號--添加朋友--公眾號--搜索:我是老孫(如下圖),也會不定期發送技術文章,娛樂八卦,吃喝玩樂,房產頭條,心靈雞湯等信息!
加圖片說明文字
注意:添加時請注明微博
移除點擊此處添如果大家想看老孫的直播學習,可以加入咱們的免費公開課進行學習!騰訊課程地址:https://ke.qq.com/course/92963#tuin=2a0a2177
有的人會這樣說:“我只是在業余時間打盹而已,業余時間干嗎把自己弄得那么緊張?”
愛因斯坦就曾提出:“人的差異在于業余時間。”
一位在哈佛任教的朋友說,只要知道一個青年怎樣度過他的業余時間,就能預言出這個青年的前程怎樣。記得點贊和轉發哦!
片說明文字
移除點擊此處添加圖