導航:首頁 > 編程語言 > java網路編程ftp

java網路編程ftp

發布時間:2023-05-27 02:58:38

java網路編程基本概念是什麼

1、Java網路編程基本概念——主機的網路層


主機網路層定義特定網路介面(如乙太網或WiFi天線)如何通過物理連接將IP數據報發送到本地網路或世界其他地方。在主機網路層中,連接不同計算機的硬體部分(電纜、光纖、無線電波或煙霧信號)有時被稱為網路的物理層。Java程序員不需要擔心這一層,除非出現錯誤,例如計算機後面的插頭脫落或有人切斷了您與外部世界之間的T-1線。換句話說,Java將永遠看不到物理層。


2、Java網路編程基本概念——網路層


Internet層的下一層是主機網路層,這是Java程序員需要考慮的第一層。網際網路層協議定義了數據位和位元組如何組織成更大的組,稱為包,也定義了不同計算機互相查找的定址機制。Internet Protocol (IP)是世界上使用最廣泛的Internet層協議,也是Java唯一了解的Internet層協議。


網際網路協議基本上是兩種協議:IPV4使用32位地址,IPV6使用128位地址,並增加了技術特性來幫助路由。這是兩種完全不同的網路協議,如果沒有特殊的網關/隧道協議,它們甚至不能在同一網路上互操作,但是Java向您隱藏了幾乎所有這些差異。


除了路由和定址之外,網際網路層的第二個作用是使不同類型的主機網路層能夠彼此對話。網際網路路由器在WiFi和乙太網、乙太網和DSL、DSL和光纖往返協議之間進行交換。沒有網際網路層或類似的分層,每台計算機只能與同一類型網路上的其他計算機通信。網際網路層負責使用適當的協議將異類網路彼此連接起來。


3、Java網路編程基本概念——傳輸層


原始數據報有一些缺點。最明顯的缺點是無法保證可靠的傳輸,即使可以保證,也可能在傳輸過程中被損壞。頭檢查只能檢測頭中的損壞,而不能檢測數據報的數據部分。最後,即使數據報沒有損壞地到達了它的目的地,它也可能不能按照發送的順序到達。


傳輸層負責確保按發送的順序接收數據包,確保沒有數據丟失或銷毀。如果數據包丟失,傳輸層要求發送方重新傳輸該數據包。為此,IP網路向每個數據報添加了一個額外的頭,其中包含更多信息。


這個級別有兩個主要協議。第一個是傳輸控制協議(TCP),這是一個昂貴的協議,允許丟失或損壞的數據按照發送順序重新傳輸。第二個協議是用戶數據報協議(User Datagram Protocol, UDP),它允許接收方檢測損壞的數據包,而不保證它們按照正確的順序發送(或者根本不發送)。然而,UDP通常比TCP快。TCP被稱為可靠協議。UDP是不可靠的。


4、Java網路編程基本概念——應用程序層


向用戶交付數據的層稱為應用層。以下三個層定義如何將數據從一台計算機傳輸到另一台計算機。應用層決定數據傳輸後的操作。有HTTP為用戶Web, SMTP, POP, IMAP為用戶電子郵件;FSP, TFTP用於文件傳輸,NFS用於文件訪問;文件共享使用Gnutella和BitTorrent;會話發起協議(SIP)和Skype用於語音通信。此外,您的程序可以在必要時定義自己的應用程序級協議。(頁面)


5、Java網路編程基本概念——IP、TCP、UDP


IP被設計成允許任意兩點之間有多條路由,繞過損壞的路由器來路由數據包。由於兩點之間有多條路由,而且由於網路流量或其他因素,它們之間的最短路徑可能會隨著時間而變化,因此構成特定數據流的數據包可能不會走同一條路由。即使它們全部到達,也可能不是按照它們被發送的順序到達的。為了改進這一基本機制,TCP被放置在IP上,以便連接的兩端可以確認收到的IP數據包,並請求重傳丟失或損壞的數據包。此外,TCP允許接收端上的數據包按照發送的順序重新分組。


然而,TCP有很多開銷。因此,如果單個數據包的丟失不會完全破壞數據,那麼可以使用UDP發送數據包,而不需要TCP提供的保證。UDP是一種不可靠的協議。它不能保證信息包將到達它們的目的地,或者它們將以它們被發送的相同順序到達。


6、Java網路編程基本概念——IP地址和域名


IPv4網路上的每台計算機都有一個4位元組的數字ID。通常在一個點上以四段格式寫,比如192.1.32.90,每個數字是一個無符號位元組,范圍從0到255。IPv4網路上的每台計算機都有一個唯一的四段地址。當數據通過網路傳輸時,包的報頭包括要發送到的機器的地址(目的地址)和要發送到的機器的地址(源地址)。路由上的路由器通過檢查目的地址來選擇發送包的最佳路徑。包含源地址是為了讓收件人知道該對誰進行回復。


雖然計算機可以很容易地處理數字,但人類並不擅長記住它們。因此,域名系統(DNS)被開發出來,用來將容易記住的主機名(如www.12345.com)轉換成數字互聯網地址(如208.201.243.99)。當Java程序訪問網路時,它們需要同時處理數字地址和相應的主機名。這些方法由java.net.InetAddress類提供。


7、Java網路編程基本概念——港口


如果每台計算機一次只做一件事,地址就足夠了。但是現代計算機同時做許多不同的事情。電子郵件需要與FTP請求分開,而FTP請求也需要與Web通信分開。這是通過埠完成的。具有IP地址的每台計算機有數千個邏輯埠(確切地說,每個傳輸層協議有65,535個埠)。這些只是計算機內存中的抽象,不代表任何物理對象,不像USB埠。每個埠在1到65535之間進行數字標識。每個埠可以分配給一個特定的服務。


8、Java網路編程基本概念——一個防火牆


在互聯網上有一些頑皮的人。要排除它們,通常需要在本地網路上設置一個接入點,並檢查進出該接入點的所有流量。位於網際網路和本地網路之間的一些硬體和軟體會檢查所有輸入和輸出的數據,以確保它是防火牆。防火牆通常是路由器的一部分,它將本地網路連接到更大的網際網路,並可以執行其他任務,如網路地址轉換。另外,防火牆可以是單獨的機器。防火牆仍然主要負責檢查進出其網路介面的數據包,根據一組規則接收或拒絕數據包。


本篇《什麼是Java網路編程基本概念?看完這篇文章你一定可以明白》到這里就已經結束了,小編一直認為,某一個編程軟體受歡迎是有一定原因的,首先吸引人的一定是其功能,環球網校的小編祝您java學習之路順利,如果你還想知道更多java知識,也可以點擊本站的其他文章進行學習。

Ⅱ 在javasocket網路編程中,開發基於udp協議的程序使用的套接字有哪些

一、 填空題

___ IP地址____用來標志網路中的一個通信實體的地址。通信實體可以是計算機,路由器等。
統一資源定位符URL是指向互聯網「資源」的指針,由4部分組成:協議、存放資源的主機域名、__埠___和資源路徑和文件名。
URL 是統一資源定位器的簡稱,它表示Internet上某一資源的地址。
在Socket編程中,IP地址用來標志一台計算機,但是一台計算機上可能提供多種應用程序,使用 埠 來區分這些應用程序。
在Java Socket網路編程中,開發基於TCP協議的伺服器端程序使用的套接字是 ServerSocket 。
在Java Socket網路編程中,開發基於UDP協議的程序使用的套接字是 DatagramSocket 。
二、 選擇題

1.以下協議都屬於TCP/IP協議棧,其中位於傳輸層的協議是(AD)。(選擇二項)
A TCP
B.HTTP
C.SMTP
D.UDP
2.以下協議中屬於TCP/IP協議棧中應用層協議的是(A)。(選擇一項)
A HTTP
B.TCP
C.UDP
D.IP
3.以下說法中關於UDP協議的說法正確的是(AD)。(選擇二項)
A.發送不管對方是否准備好,接收方收到也不確認
B.面向連接
C.佔用系統資源多、效率低
D.非常簡單的協議,可以廣播發送
4.在基於TCP網路通信模式中,客戶與伺服器程序的主要任務是(BC)。(選擇二項)
A 客戶程序在網路上找到一條到達伺服器的路由
B.客戶程序發送請求,並接收伺服器的響應
C.伺服器程序接收並處理客戶請求,然後向客戶發送響應結果
D.如果客戶程序和伺服器都會保證發送的數據不會在傳輸途中丟失
5.在Java網路編程中,使用客戶端套接字Socket創建對象時,需要指定(A)。慧宏(選擇一項)
A 伺服器主機名稱和埠
B.伺服器埠和文件
C.伺服器名稱和文件
D.伺服器地址和文件
6.ServerSocket的監聽滑碧尺方法accept( )方法的返回值類型是(A )。(選擇一項)
A.Socket
B.Void
C.Object
D.DatagramSocket
7.Java UDP Socket編程主要用到的兩個類是(BD)。(選擇二項信高)
A UDPSocket
B.DatagramSocket
C.UDPPacket
D.DatagramPacket
8.在使用UDP套接字通信時,常用(D)類把要發送的信息打包。(選擇一項)
A String
B.DatagramSocket
C.MulticastSocket
D.DatagramPacket

三、 判斷題

1. Socket是傳輸層供給應用層的編程介面,是應用層與傳輸層之間的橋梁 。( T )
2. TCP/IP傳輸控制協議是Internet的主要協議,定義了計算機和外設進行通信的規則。TCP/IP網路參考模型包括七個層次:應用層、會話層、表示層、傳輸層、網路層、鏈路層和物理層。( F )
3. TCP協議一種面向連接的、可靠的、基於位元組流的通信協議 。HTTP、FTP、TELNET、SMTP 都是基於TCP協議的應用層協議。( T )
4. UDP協議是一種面向無連接的、可靠的、基於位元組流的傳輸層通信協議,該協議佔用系統資源多、效率較低。( F )

四、 簡答題

1.TCP/IP協議棧中,TCP協議和UDP協議的聯系和區別?

2.簡述基於TCP的Socket編程的主要步驟。提示:分別說明伺服器端和客戶端的編程步驟。

3.簡述基於UDP的Socket編程的主要步驟。提示:分別說明伺服器端和客戶端的編程步驟。

五、 編碼題

1.使用基於TCP的Java Socket編程,完成如下功能:

1) 要求從客戶端錄入幾個字元,發送到伺服器端。

2) 由伺服器端將接收到的字元進行輸出。

3) 伺服器端向客戶端發出「您的信息已收到」作為響應。

4) 客戶端接收伺服器端的響應信息。

提示:

伺服器端:PrintWriter out =new PrintWriter(socket.getOutputStream(),true);

客戶端:BufferedReader line=new BufferedReader(new InputStreamReader(System.in));

Ⅲ 怎樣學習java

給你個詳細的,可以按照這階段學習。

第一階段

技術名稱

技術內容

J2SE (java基礎部分)

java開發前奏

計算機基本原理,Java語言發展簡史以及開發環境的搭建,體驗Java程序的開發,環境變數的設置,程序的執行過程, 相關反編譯工具介紹,java開發工具Eclipse的安裝和使用,javadoc的說明。

Java基礎語法

Java語法格式,常量和變數,變數的作用域,方法和方法的重載,運算符,程序流程式控制制,數組和操作數組的類, 對數組循環遍歷以及針對數組的常用查找、排序演算法原理,最後使用Java程序進行功能實現。

面向對象編程

理解對象的本質,以及面向對象,類與對象之間的關系,如何用面向對象的思想分析和解決顯示生活中的問題, 並java程序的手段編寫出來。 如何設計類,設計類的基本原則,類的實例化過程,類元素:構造函數、this關鍵字、方法和方法的參數傳遞過程、 static關鍵字、內部類,Java的垃圾對象回收機制。 對象的三大特性:封裝、繼承和多態。子類對象的實例化過程、方法的重寫和重載、final關鍵字、抽腔滑象類、介面、 繼承的優點和缺點。 對象的多態性:子類和父類之間的轉換、父春舉類紙箱子類的引用、抽象類和介面在多態中的應 用、多態優點。常用設計模式如單利、模版等模式。 什麼是異常異常的捕捉和拋出異常捕捉的原則 finally的使用,package的應用 import關鍵字。

多線程應用

多線程的概念,如何在程序中創建多線程(Thread、Runnable),線程安全問題,線程的同步,線伍森臘程之間的通訊、 死鎖問題的剖析。

javaAPI詳解

JavaAPI介紹、String和StringBuffer、各種基本數據類型包裝類,System和Runtime類,Date和DateFomat類等。 常用的集合類使用如下:Java Collections Framework:Collection、Set、List、ArrayList、Vector、LinkedList、Hashset、TreeSet、Map、HashMap、 TreeMap、Iterator、Enumeration等常用集合類API。

IO技術

什麼是IO,File及相關類,位元組流InputStream和OutputStream,字元流Reader和Writer,以及相應緩沖流和管道流,位元組和字元的轉化流,包裝流,以及常用包裝類使用,分析java的IO性能。

網路編程

Java網路編程,網路通信底層協議TCP/UDP/IP,Socket編程。網路通信常用應用層協議簡介:HTTP、FTP等,以及WEB伺服器的工作原理。

java高級特性

遞歸程序,Java的高級特性:反射、代理和泛型、枚舉、Java正則表達式API詳解及其應用。

第二階段

技術名稱

技術內容

資料庫技術

Oracle 基礎管理

Oracle背景簡介,資料庫的安裝,資料庫的用戶名和密碼,客戶端登錄資料庫服務SQLPLUS,資料庫基本概。

SQL語句

資料庫的創建,表的創建,修改,刪除,查詢,索引的創建,主從表的建立,數據控制授權和回收,事務控制,查詢語句以及運算符的詳解,sql中的函數使用。

多表連接和子查詢

等值和非等值連接,外連接,自連接;交叉連接,自然連接,using子句連接,完全外連接和左右外連接,子查詢使用以及注意事項。

觸發器、存儲過程

觸發器和存儲過程使用場合,通過實例進行詳解。

資料庫設計優化

WHERE子句中的連接順序,選擇最有效率的表名順序,SELECT子句中避免使用 『 * 『 計算記錄條數等等。

數據備份與移植

移植技巧,備份方案;導入導出等。

第三階段

技術名稱

技術內容

jdbc技術

JDBC基礎

JDBC Connection、Statement、PreparedStatement、CallableStatement、ResultSet等不同類的使用。

連接池技術

了解連接池的概念,掌握連接池的建立、治理、關閉和配置。

ORM與DAO封裝

對象關系映射思想,jdbc的封裝,實現自己的jdbc。

第四階段

技術名稱

技術內容

web基礎技術 (項目實戰)

Xml技術

使用jdom和dom4j來對xml文檔的解析和生成操作,xml 的作用和使用場合。

html/css

Java掌握基本的html標簽的格式和使用,css層疊樣式表對div的定義,實現對網站布局的基本實現。

Javascript

了解javascript的基本語法以及相關函數的使用,並結合html頁面實現流程式控制制和頁面效果展示。 什麼是異常異常的捕捉和拋出異常捕捉的原則 finally的使用,package的應用 import關鍵字。

jsp/servlet

Servlet和SP 技術、上傳下載、 Tomcat 伺服器技術、servlet 過濾器和監聽器。

jstl和EL

JSTL核心標簽庫、函數標簽庫、格式化標簽庫、自定義標簽技術、EL表達式在jsp頁面的使用。

ajax及框架技術

了解和屬性原生態的ajax的使用,ajax使用的場合,使用ajax的好處,ajax框架jquery渲染頁面效果和相關的強大的第三方類庫,dwr如何和後台服務進行數據傳輸,以及頁面邏輯控制等。

JSON高級應用

Java使用json支持的方式對字元串進行封裝和解析,實現頁面和java後台服務的數據通信。

Fckeditor編輯器

FCKEditor在線編輯器技術、配置、處理圖片和文件上傳。

javaMail技術

了解域名解析與MX記錄、電子郵件工作原理、郵件傳輸協議:SMTP、POP3、IMAP、郵件組織結構:RFC822郵件格式、MIME協議、郵件編碼、復合郵件結構分析、JavaMail API及其體系結構、編程創建郵件內容:簡單郵件內容、包含內嵌圖片的復雜郵件、包含內嵌圖片和附件的復雜郵件。

JfreeChart報表

統計報表;圖表處理。

BBS項目實戰

採用Jquery+dwr+jsp+servlet+Fckeditor+JfreeChart+tomcat+jdbc(oracle) 完成BBS項目的實戰。

實戰價值

學完此課程你至少已經是擁有近1年開發經驗的程序員了,但是你不應該滿足現狀,下面的課程會更加吸引你!

第五經典階段

技術名稱

技術內容

web主流框架技術 (項目實戰)

struts2.x

struts2框架的工作原理和架構分析,struts-default.xml與default.properties文件的作用,struts。Xml中引入多個配置文件。OGNL表達式、Struts2 UI和非UI標簽、輸入校驗、使用通配符定義action、動態方法調用、多文件上傳、自定義類型轉換器、為Action的屬性注入值、自定義攔截器、異常處理、使用struts2實現的CRUD操作的案例。

hibernate3.x

Hibernate應用開發基礎; ORM基礎理論; 關系映射技術; 性能調優技術; 性能優化 一級緩存 二級緩存 查詢緩存 事務與並發 悲觀鎖、樂觀鎖。

spring3.x

Spring IoC技術; Spring AOP技術; Spring 聲明事務管理; Spring 常用功能說明,spring3.0的新特性, Spring整合struts2和hibernate3的運用。

Log4j和Junit

Logging API; JUnit單元測試技術; 壓力測試技術:badboy 進行測試計劃跟蹤獲取以及JMeter壓力測試。

在線支付技術

完成支付寶的支付介面的在線支付功能。

電子商務網實戰

採用spring3+hibernate3+struts2+jquery+dwr+FckEditor+tomcat 完成電子商務網站實戰開發。

實戰價值

項目實戰價值完全高標準的高要求的迎合企業的需求,學完此課程,全部消化了,你已經就是一個地地道道的高級程序員,已經為你的職業生涯鋪平了道路,你還等什麼,向著高薪沖刺吧!

第六進階階段

技術名稱

技術內容

web高級進階 (項目實戰)

openJpa技術

JPA介紹及開發環境搭建、單表實體映射、一對多/多對一、一對一、多對多關聯、實體繼承、復合主鍵、JPQL語句、EntityManager API、事務管理,了解一下jpa2.0的新特性以及應用。

lucene搜索引擎

了解全文搜索原理、全文搜索引擎、什麼是OSEM、OSEM框架Compass、基於使用Lucene使用Compass實現全文增量型索引創建和搜索、探索Lucene 3.0以及API。

電子商務網重構

此項目採用了Lucene+compass+openJpa+上一版電子商務網站的技術進行重構。

實戰價值

此項目的實戰價值是前所未有的超值,已經超越了企業的實際要求,你已經是企業的搶手人才,一旦進入企業,便讓你立於不敗之地,輕松成為公司的技術骨乾和精英,技術已經改變了你一生!

Excel/pdf文檔處理技術

java對excel和pdf文檔分別利用poi和itext來進行解析和生成。此技術在企業級系統的報表中經常使用。

OA工作流技術JBPM

工作流是什麼、JBPM介紹、JBPM的主要用法、各類節點的用法、任務各種分派方式、JBPM的整體架構原理、工作流定義模型分析、運行期工作流實例模型分析、資料庫表模型分析、流程定義管理、流程實例監控、對JBPM的相關介面進行封裝,構建自己的工作流應用平台等。

WebService技術

WebService技術原理、WebService技術的應用、Soap服務的創建與管理、WSDL描述文檔規范、UDDI 注冊中心運行原理;使用Axis和Xfire創建WEB服務、Webservice客戶端的編寫、使用TCPMonitor監聽SOAP協議、異構平台的整合。

linux技術

Linux 系統安裝,卸載、linux 使用的核心思想、linux下的用戶管理,文件管理,系統管理、程序的安裝,使用,卸載。linux下作為server的基本應用:web伺服器,j2ee伺服器,ftp伺服器的安裝和項目的部署。

CRM項目實戰

此項目能了解和熟悉客戶關系管理的基本流程以及功能的實現,採用上面幾個階段學到的主流框架實現,同時加入了JBPM的技術。

實戰價值

學完這個系統會讓你輕松進入企業級的大型項目的開發,倍感得心應手。完備的知識體系和最前沿的開發技術,帶給你的將是在精神上不同目光的瞻望和物質上高薪資回報的喜悅,帶你進入人生的新的轉折點和起點!

第七架構階段

技術名稱

技術內容

大型高並發網站優化方案 (項目實戰)

如何構建一個高性能網站詳解

什麼樣的網站需要高性能,高性能的指標體系,構建高性能網站需要做哪些工作,注意哪些細節。

SSI技術

什麼是SSI,使用他有什麼好處,什麼樣的系統才使用SSI,SSI技術詳解和使用,應用到項目中。

生成靜態頁技術

什麼是靜態頁,為什麼需要靜態頁以及帶來的好處,生成靜態頁的模版技術Velocity和Freemark,生成靜態頁的訪問規則等。

緩存技術

為什麼使用緩存技術,oscache緩存技術的介紹和使用,memcached緩存技術的介紹和使用、兩者緩存技術的比較和如何去使用。

經典web伺服器

什麼是web伺服器,什麼是javaweb伺服器,他們存在什麼關系,當前技術主流中常用的web伺服器有哪些, web伺服器apache和nginx的應用。

nginx架構實戰

什麼是反向代理,負載均衡以及集群,在nginx中如何實現這些高性能的系統架構。

實戰價值

此課程已經將你領入了技術經理和主管以及架構師的門檻了,稍微用心學習加上實戰你就是技術牛人了,薪水非常高,同時很快你就是公司的技術中層管理者,你的人生就此又一次的發生巨大的轉折!

第八特色階段

技術名稱

技術內容

Ⅳ 怎麼用Java實現FTP上傳

sun.net.ftp.FtpClient.,該類庫主要提供了用於建立FTP連接的類。利用這些類的方法,編程人員可以遠程登錄到FTP伺服器,列舉該伺服器上的目錄,設置傳輸協議,以及傳送文件。FtpClient類涵蓋了幾乎所有FTP的功能,FtpClient的實例變數保存了有關建立"代理"的各種信息。下面給出了這些實例變數:
public static boolean useFtpProxy
這個變數用於表明FTP傳輸過程中是否使用了一個代理,因此,它實際上是一個標記,此標記若為TRUE,表明使用了一個代理主機。
public static String ftpProxyHost
此變數只有在變數useFtpProxy為TRUE時才有效,用於保存代理主機名。
public static int ftpProxyPort此變數只有在變數useFtpProxy為TRUE時才有效,用於保存代理主機的埠地址。
FtpClient有三種不同形式的構造函數,如下所示:
1、public FtpClient(String hostname,int port)
此構造函數利用給出的主機名和埠號建立一條FTP連接。
2、public FtpClient(String hostname)
此構造函數利用給出的主機名建立一條FTP連接,使用默認埠號。
3、FtpClient()
此構造函數將創建一FtpClient類,但不建立FTP連接。這時,FTP連接可以用openServer方法建立。
一旦建立了類FtpClient,就可以用這個類的方法來打開與FTP伺服器的連接。類ftpClient提供了如下兩個可用於打開與FTP伺服器之間的連接的方法。
public void openServer(String hostname)
這個方法用於建立一條與指定主機上的FTP伺服器的連接,使用默認埠號。
public void openServer(String host,int port)
這個方法用於建立一條與指定主機、指定埠上的FTP伺服器的連接。
打開連接之後,接下來的工作是注冊到FTP伺服器。這時需要利用下面的方法。
public void login(String username,String password)
此方法利用參數username和password登錄到FTP伺服器。使用過Intemet的用戶應該知道,匿名FTP伺服器的登錄用戶名為anonymous,密碼一般用自己的電子郵件地址。
下面是FtpClient類所提供的一些控制命令
public void cd(String remoteDirectory):該命令用於把遠程系統上的目錄切換到參數remoteDirectory所指定的目錄。
public void cdUp():該命令用於把遠程系統上的目錄切換到上一級目錄。
public String pwd():該命令可顯示遠程系統上的目錄狀態。
public void binary():該命令可把傳輸格式設置為二進制格式。
public void ascii():該命令可把傳輸協議設置為ASCII碼格式。
public void rename(String string,String string1):該命令可對遠程系統上的目錄或者文件進行重命名操作。
除了上述方法外,類FtpClient還提供了可用於傳遞並檢索目錄清單和文件的若干方法。這些方法返回的是可供讀或寫的輸入、輸出流。下面是其中一些主要的方法。
public TelnetInputStream list()
返回與遠程機器上當前目錄相對應的輸入流。
public TelnetInputStream get(String filename)
獲取遠程機器上的文件filename,藉助TelnetInputStream把該文件傳送到本地。
public TelnetOutputStream put(String filename)
以寫方式打開一輸出流,通過這一輸出流把文件filename傳送到遠程計算機

package myUtil;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;

/**
* ftp上傳,下載

*
* @author why 2009-07-30
*
*/
public class FtpUtil {
private String ip = "";
private String username = "";
private String password = "";
private int port = -1;
private String path = "";
FtpClient ftpClient = null;
OutputStream os = null;
FileInputStream is = null;
public FtpUtil(String serverIP, String username, String password) {
this.ip = serverIP;
this.username = username;
this.password = password;
}
public FtpUtil(String serverIP, int port, String username, String password) {
this.ip = serverIP;
this.username = username;
this.password = password;
this.port = port;
}
/**
* 連接ftp伺服器
*
* @throws IOException
*/
public boolean connectServer() {
ftpClient = new FtpClient();
try {
if (this.port != -1) {
ftpClient.openServer(this.ip, this.port);
} else {
ftpClient.openServer(this.ip);
}
ftpClient.login(this.username, this.password);
if (this.path.length() != 0) {
ftpClient.cd(this.path);// path是ftp服務下主目錄的子目錄
}
ftpClient.binary();// 用2進制上傳、下載
System.out.println("已登錄到\"" + ftpClient.pwd() + "\"目錄");
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/**
* 斷開與ftp伺服器連接
*
* @throws IOException
*/
public boolean closeServer() {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpClient != null) {
ftpClient.closeServer();
}
System.out.println("已從伺服器斷開");
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/**
* 檢查文件夾在當前目錄下是否存在
*
* @param dir
*@return
*/
private boolean isDirExist(String dir) {
String pwd = "";
try {
pwd = ftpClient.pwd();
ftpClient.cd(dir);
ftpClient.cd(pwd);
} catch (Exception e) {
return false;
}
return true;
}
/**
* 在當前目錄下創建文件夾
*
* @param dir
* @return
* @throws Exception
*/
private boolean createDir(String dir) {
try {
ftpClient.ascii();
StringTokenizer s = new StringTokenizer(dir, "/"); // sign
s.countTokens();
String pathName = ftpClient.pwd();
while (s.hasMoreElements()) {
pathName = pathName + "/" + (String) s.nextElement();
try {
ftpClient.sendServer("MKD " + pathName + "\r\n");
} catch (Exception e) {
e = null;
return false;
}
ftpClient.readServerResponse();
}
ftpClient.binary();
return true;
} catch (IOException e1) {
e1.printStackTrace();
return false;
}
}
/**
* ftp上傳 如果伺服器段已存在名為filename的文件夾,該文件夾中與要上傳的文件夾中同名的文件將被替換
*
* @param filename
* 要上傳的文件(或文件夾)名
* @return
* @throws Exception
*/
public boolean upload(String filename) {
String newname = "";
if (filename.indexOf("/") > -1) {
newname = filename.substring(filename.lastIndexOf("/") + 1);
} else {
newname = filename;
}
return upload(filename, newname);
}
/**
* ftp上傳 如果伺服器段已存在名為newName的文件夾,該文件夾中與要上傳的文件夾中同名的文件將被替換
*
* @param fileName
* 要上傳的文件(或文件夾)名
* @param newName
* 伺服器段要生成的文件(或文件夾)名
* @return
*/
public boolean upload(String fileName, String newName) {
try {
String savefilename = new String(fileName.getBytes("GBK"),
"GBK");
File file_in = new File(savefilename);// 打開本地待長傳的文件
if (!file_in.exists()) {
throw new Exception("此文件或文件夾[" + file_in.getName() + "]有誤或不存在!");
}
if (file_in.isDirectory()) {
upload(file_in.getPath(), newName, ftpClient.pwd());
} else {
uploadFile(file_in.getPath(), newName);
}
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
return true;
} catch (Exception e) {
e.printStackTrace();
System.err.println("Exception e in Ftp upload(): " + e.toString());
return false;
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 真正用於上傳的方法
*
* @param fileName
* @param newName
* @param path
* @throws Exception
*/
private void upload(String fileName, String newName, String path)
throws Exception {
String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");
File file_in = new File(savefilename);// 打開本地待長傳的文件
if (!file_in.exists()) {
throw new Exception("此文件或文件夾[" + file_in.getName() + "]有誤或不存在!");
}
if (file_in.isDirectory()) {
if (!isDirExist(newName)) {
createDir(newName);
}
ftpClient.cd(newName);
File sourceFile[] = file_in.listFiles();
for (int i = 0; i < sourceFile.length; i++) {
if (!sourceFile[i].exists()) {
continue;
}
if (sourceFile[i].isDirectory()) {
this.upload(sourceFile[i].getPath(), sourceFile[i]
.getName(), path + "/" + newName);
} else {
this.uploadFile(sourceFile[i].getPath(), sourceFile[i]
.getName());
}
}
} else {
uploadFile(file_in.getPath(), newName);
}
ftpClient.cd(path);
}
/**
* upload 上傳文件
*
* @param filename
* 要上傳的文件名
* @param newname
* 上傳後的新文件名
* @return -1 文件不存在 >=0 成功上傳,返迴文件的大小
* @throws Exception
*/
public long uploadFile(String filename, String newname) throws Exception {
long result = 0;
TelnetOutputStream os = null;
FileInputStream is = null;
try {
java.io.File file_in = new java.io.File(filename);
if (!file_in.exists())
return -1;
os = ftpClient.put(newname);
result = file_in.length();
is = new FileInputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
return result;
}
/**
* 從ftp下載文件到本地
*
* @param filename
* 伺服器上的文件名
* @param newfilename
* 本地生成的文件名
* @return
* @throws Exception
*/
public long downloadFile(String filename, String newfilename) {
long result = 0;
TelnetInputStream is = null;
FileOutputStream os = null;
try {
is = ftpClient.get(filename);
java.io.File outfile = new java.io.File(newfilename);
os = new FileOutputStream(outfile);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
result = result + c;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 取得相對於當前連接目錄的某個目錄下所有文件列表
*
* @param path
* @return
*/
public List getFileList(String path) {
List list = new ArrayList();
DataInputStream dis;
try {
dis = new DataInputStream(ftpClient.nameList(this.path + path));
String filename = "";
while ((filename = dis.readLine()) != null) {
list.add(filename);
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
public static void main(String[] args) {
FtpUtil ftp = new FtpUtil("192.168.11.11", "111", "1111");
ftp.connectServer();
boolean result = ftp.upload("C:/Documents and Settings/ipanel/桌面/java/Hibernate_HQL.docx", "amuse/audioTest/music/Hibernate_HQL.docx");
System.out.println(result ? "上傳成功!" : "上傳失敗!");
ftp.closeServer();
/**
* FTP遠程命令列表 USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT PASS PASV STOR
* REST CWD STAT RMD XCUP OPTS ACCT TYPE APPE RNFR XCWD HELP XRMD STOU
* AUTH REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ QUIT MODE SYST ABOR
* NLST MKD XPWD MDTM PROT
* 在伺服器上執行命令,如果用sendServer來執行遠程命令(不能執行本地FTP命令)的話,所有FTP命令都要加上\r\n
* ftpclient.sendServer("XMKD /test/bb\r\n"); //執行伺服器上的FTP命令
* ftpclient.readServerResponse一定要在sendServer後調用
* nameList("/test")獲取指目錄下的文件列表 XMKD建立目錄,當目錄存在的情況下再次創建目錄時報錯 XRMD刪除目錄
* DELE刪除文件
*/
}
}

Ⅳ 網路編程socketserver的方法有哪些

Java網路編程精解之ServerSocket用法詳解一

第3章 ServerSocket用法詳解 第10章 Java語言的反射機制 第13章 基於MVC和RMI的分布
ServerSocket用法詳解一
Java語言的反射機制一
基於MVC和RMI的分布式應用一
ServerSocket用法詳解二
Java語言的反射機制二
基於MVC和RMI的分布式應用二
ServerSocket用法詳解三
在客戶/伺服器通信模式中,伺服器端需要創建監聽特定埠的ServerSocket,ServerSocket負責接收客戶連接請求。本章首先介紹ServerSocket類的各個構造方法,以及成員方法的用法,接著介紹伺服器如何用多線程來處理與多個客戶的通信任務。
本章提供線程池的一種實現方式。線程池包括一個工作隊列和若干工作線程。伺服器程序向工作隊列中加入與客戶通信的任務,工作線程不斷從工作隊列中取出任務並執行它。本章還介紹了java.util.concurrent包中的線程池類的用法,在伺服器程序中可以直接使用它們。
3.1 構造ServerSocket
ServerSocket的構造方法有以下幾種重載形式:
◆ServerSocket()throws IOException
◆ServerSocket(int port) throws IOException
◆ServerSocket(int port, int backlog) throws IOException
◆ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
在以上構造方法中,參數port指定伺服器要綁定的埠(伺服器要監聽的埠),參數backlog指定客戶連接請求隊列的長度,參數bindAddr指定伺服器要綁定的IP地址。
3.1.1 綁定埠
除了第一個不帶參數的構造方法以外,其他構造方法都會使伺服器與特定埠綁定,該埠由參數port指定。例如,以下代碼創建了一個與80埠綁定的伺服器:
ServerSocket serverSocket=new ServerSocket(80);
如果運行時無法綁定到80埠,以上代碼會拋出IOException,更確切地說,是拋出BindException,它是IOException的子類。BindException一般是由以下原因造成的:
◆埠已經被其他伺服器進程佔用;
◆在某些操作系統中,如果沒有以超級用戶的身份來運行伺服器程序,那麼操作系統不允許伺服器綁定到1~1023之間的埠。
如果把參數port設為0,表示由操作系統來為伺服器分配一個任意可用的埠。由操作系統分配的埠也稱為匿名埠。對於多數伺服器,會使用明確的埠,而不會使用匿名埠,因為客戶程序需要事先知道伺服器的埠,才能方便地訪問伺服器。在某些場合,匿名埠有著特殊的用途,本章3.4節會對此作介紹。
3.1.2 設定客戶連接請求隊列的長度
當伺服器進程運行時,可能會同時監聽到多個客戶的連接請求。例如,每當一個客戶進程執行以下代碼:
Socket socket=new Socket(www.javathinker.org,80);
就意味著在遠程www.javathinker.org主機的80埠上,監聽到了一個客戶的連接請求。管理客戶連接請求的任務是由操作系統來完成的。操作系統把這些連接請求存儲在一個先進先出的隊列中。許多操作系統限定了隊列的最大長度,一般為50。當隊列中的連接請求達到了隊列的最大容量時,伺服器進程所在的主機會拒絕新的連接請求。只有當伺服器進程通過ServerSocket的accept()方法從隊列中取出連接請求,使隊列騰出空位時,隊列才能繼續加入新的連接請求。
對於客戶進程,如果它發出的連接請求被加入到伺服器的隊列中,就意味著客戶與伺服器的連接建立成功,客戶進程從Socket構造方法中正常返回。如果客戶進程發出的連接請求被伺服器拒絕,Socket構造方法就會拋出ConnectionException。
ServerSocket構造方法的backlog參數用來顯式設置連接請求隊列的長度,它將覆蓋操作系統限定的隊列的最大長度。值得注意的是,在以下幾種情況中,仍然會採用操作系統限定的隊列的最大長度:
◆backlog參數的值大於操作系統限定的隊列的最大長度;
◆backlog參數的值小於或等於0;
◆在ServerSocket構造方法中沒有設置backlog參數。
以下常式3-1的Client.java和常式3-2的Server.java用來演示伺服器的連接請求隊列的特性。
常式3-1 Client.java
import java.net.*;
public class Client {
public static void main(String args[])throws Exception{
final int length=100;
String host="localhost";
int port=8000;
Socket[] sockets=new Socket[length];
for(int i=0;i<length;i++){ ="" 試圖建立100次連接
sockets[i]=new Socket(host, port);
System.out.println("第"+(i+1)+"次連接成功");
}
Thread.sleep(3000);
for(int i=0;i<length;i++){
sockets[i].close(); //斷開連接
}
}
}
#p#
常式3-2 Server.java
import java.io.*;
import java.net.*;
public class Server {
private int port=8000;
private ServerSocket serverSocket;
public Server() throws IOException {
serverSocket = new ServerSocket(port,3); //連接請求隊列的長度為3
System.out.println("伺服器啟動");
}
public void service() {
while (true) {
Socket socket=null;
try {
socket = serverSocket.accept(); //從連接請求隊列中取出一個
連接
System.out.println("New connection accepted " +
socket.getInetAddress() + ":" +socket.getPort());
}catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(socket!=null)socket.close();
}catch (IOException e) {e.printStackTrace();}
}
}
}
public static void main(String args[])throws Exception {
Server server=new Server();
Thread.sleep(60000*10); //睡眠10分鍾
//server.service();
}
}
Client試圖與Server進行100次連接。在Server類中,把連接請求隊列的長度設為3。這意味著當隊列中有了3個連接請求時,如果Client再請求連接,就會被Server拒絕。下面按照以下步驟運行Server和Client程序。
(1)把Server類的main()方法中的「server.service();」這行程序代碼注釋掉。這使得伺服器與8000埠綁定後,永遠不會執行serverSocket.accept()方法。這意味著隊列中的連接請求永遠不會被取出。先運行Server程序,然後再運行Client程序,Client程序的列印結果如下:
第1次連接成功
第2次連接成功
第3次連接成功
Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.(Unknown Source)
at java.net.Socket.(Unknown Source)
at Client.main(Client.java:10)
從以上列印結果可以看出,Client與Server在成功地建立了3個連接後,就無法再創建其餘的連接了,因為伺服器的隊列已經滿了。
(2)把Server類的main()方法按如下方式修改:
public static void main(String args[])throws Exception {
Server server=new Server();
//Thread.sleep(60000*10); //睡眠10分鍾
server.service();
}
作了以上修改,伺服器與8 000埠綁定後,就會在一個while循環中不斷執行serverSocket.accept()方法,該方法從隊列中取出連接請求,使得隊列能及時騰出空位,以容納新的連接請求。先運行Server程序,然後再運行Client程序,Client程序的列印結果如下:
第1次連接成功
第2次連接成功
第3次連接成功

第100次連接成功
從以上列印結果可以看出,此時Client能順利與Server建立100次連接。
3.1.3 設定綁定的IP地址
如果主機只有一個IP地址,那麼默認情況下,伺服器程序就與該IP地址綁定。ServerSocket的第4個構造方法ServerSocket(int port, int backlog, InetAddress bindAddr)有一個bindAddr參數,它顯式指定伺服器要綁定的IP地址,該構造方法適用於具有多個IP地址的主機。假定一個主機有兩個網卡,一個網卡用於連接到Internet, IP地址為222.67.5.94,還有一個網卡用於連接到本地區域網,IP地址為192.168.3.4。如果伺服器僅僅被本地區域網中的客戶訪問,那麼可以按如下方式創建ServerSocket:
ServerSocket serverSocket=new ServerSocket(8000,10,InetAddress.getByName ("192.168.3.4"));
3.1.4 默認構造方法的作用
ServerSocket有一個不帶參數的默認構造方法。通過該方法創建的ServerSocket不與任何埠綁定,接下來還需要通過bind()方法與特定埠綁定。
這個默認構造方法的用途是,允許伺服器在綁定到特定埠之前,先設置ServerSocket的一些選項。因為一旦伺服器與特定埠綁定,有些選項就不能再改變了。
在以下代碼中,先把ServerSocket的SO_REUSEADDR選項設為true,然後再把它與8000埠綁定:
ServerSocket serverSocket=new ServerSocket();
serverSocket.setReuseAddress(true); //設置ServerSocket的選項
serverSocket.bind(new InetSocketAddress(8000)); //與8000埠綁定
如果把以上程序代碼改為:
ServerSocket serverSocket=new ServerSocket(8000);
serverSocket.setReuseAddress(true); //設置ServerSocket的選項
那麼serverSocket.setReuseAddress(true)方法就不起任何作用了,因為SO_ REUSEADDR選項必須在伺服器綁定埠之前設置才有效。
#p#
3.2 接收和關閉與客戶的連接
ServerSocket的accept()方法從連接請求隊列中取出一個客戶的連接請求,然後創建與客戶連接的Socket對象,並將它返回。如果隊列中沒有連接請求,accept()方法就會一直等待,直到接收到了連接請求才返回。
接下來,伺服器從Socket對象中獲得輸入流和輸出流,就能與客戶交換數據。當伺服器正在進行發送數據的操作時,如果客戶端斷開了連接,那麼伺服器端會拋出一個IOException的子類SocketException異常:
java.net.SocketException: Connection reset by peer
這只是伺服器與單個客戶通信中出現的異常,這種異常應該被捕獲,使得伺服器能繼續與其他客戶通信。
以下程序顯示了單線程伺服器採用的通信流程:
public void service() {
while (true) {
Socket socket=null;
try {
socket = serverSocket.accept(); //從連接請求隊列中取出一個連接
System.out.println("New connection accepted " +
socket.getInetAddress() + ":" +socket.getPort());
//接收和發送數據

}catch (IOException e) {
//這只是與單個客戶通信時遇到的異常,可能是由於客戶端過早斷開連接引起的
//這種異常不應該中斷整個while循環
e.printStackTrace();
}finally {
try{
if(socket!=null)socket.close(); //與一個客戶通信結束後,要關閉
Socket
}catch (IOException e) {e.printStackTrace();}
}
}
}
與單個客戶通信的代碼放在一個try代碼塊中,如果遇到異常,該異常被catch代碼塊捕獲。try代碼塊後面還有一個finally代碼塊,它保證不管與客戶通信正常結束還是異常結束,最後都會關閉Socket,斷開與這個客戶的連接。
3.3 關閉ServerSocket
ServerSocket的close()方法使伺服器釋放佔用的埠,並且斷開與所有客戶的連接。當一個伺服器程序運行結束時,即使沒有執行ServerSocket的close()方法,操作系統也會釋放這個伺服器佔用的埠。因此,伺服器程序並不一定要在結束之前執行ServerSocket的close()方法。
在某些情況下,如果希望及時釋放伺服器的埠,以便讓其他程序能佔用該埠,則可以顯式調用ServerSocket的close()方法。例如,以下代碼用於掃描1~65535之間的埠號。如果ServerSocket成功創建,意味著該埠未被其他伺服器進程綁定,否者說明該埠已經被其他進程佔用:
for(int port=1;port<=65535;port++){
try{
ServerSocket serverSocket=new ServerSocket(port);
serverSocket.close(); //及時關閉ServerSocket
}catch(IOException e){
System.out.println("埠"+port+" 已經被其他伺服器進程佔用");
}
}
以上程序代碼創建了一個ServerSocket對象後,就馬上關閉它,以便及時釋放它佔用的埠,從而避免程序臨時佔用系統的大多數埠。
ServerSocket的isClosed()方法判斷ServerSocket是否關閉,只有執行了ServerSocket的close()方法,isClosed()方法才返回true;否則,即使ServerSocket還沒有和特定埠綁定,isClosed()方法也會返回false。
ServerSocket的isBound()方法判斷ServerSocket是否已經與一個埠綁定,只要ServerSocket已經與一個埠綁定,即使它已經被關閉,isBound()方法也會返回true。
如果需要確定一個ServerSocket已經與特定埠綁定,並且還沒有被關閉,則可以採用以下方式:
boolean isOpen=serverSocket.isBound() && !serverSocket.isClosed();
3.4 獲取ServerSocket的信息
ServerSocket的以下兩個get方法可分別獲得伺服器綁定的IP地址,以及綁定的埠:
◆public InetAddress getInetAddress()
◆public int getLocalPort()
前面已經講到,在構造ServerSocket時,如果把埠設為0,那麼將由操作系統為伺服器分配一個埠(稱為匿名埠),程序只要調用getLocalPort()方法就能獲知這個埠號。如常式3-3所示的RandomPort創建了一個ServerSocket,它使用的就是匿名埠。
#p#
常式3-3 RandomPort.java
import java.io.*;
import java.net.*;
public class RandomPort{
public static void main(String args[])throws IOException{
ServerSocket serverSocket=new ServerSocket(0);
System.out.println("監聽的埠為:"+serverSocket.getLocalPort());
}
}
多次運行RandomPort程序,可能會得到如下運行結果:
C:\chapter03\classes>java RandomPort
監聽的埠為:3000
C:\chapter03\classes>java RandomPort
監聽的埠為:3004
C:\chapter03\classes>java RandomPort
監聽的埠為:3005
多數伺服器會監聽固定的埠,這樣才便於客戶程序訪問伺服器。匿名埠一般適用於伺服器與客戶之間的臨時通信,通信結束,就斷開連接,並且ServerSocket佔用的臨時埠也被釋放。
FTP(文件傳輸)協議就使用了匿名埠。如圖3-1所示,FTP協議用於在本地文件系統與遠程文件系統之間傳送文件。

圖3-1 FTP協議用於在本地文件系統與遠程文件系統之間傳送文件
FTP使用兩個並行的TCP連接:一個是控制連接,一個是數據連接。控制連接用於在客戶和伺服器之間發送控制信息,如用戶名和口令、改變遠程目錄的命令或上傳和下載文件的命令。數據連接用於傳送文件。TCP伺服器在21埠上監聽控制連接,如果有客戶要求上傳或下載文件,就另外建立一個數據連接,通過它來傳送文件。數據連接的建立有兩種方式。
(1)如圖3-2所示,TCP伺服器在20埠上監聽數據連接,TCP客戶主動請求建立與該埠的連接。

圖3-2 TCP伺服器在20埠上監聽數據連接
(2)如圖3-3所示,首先由TCP客戶創建一個監聽匿名埠的ServerSocket,再把這個ServerSocket監聽的埠號(調用ServerSocket的getLocalPort()方法就能得到埠號)發送給TCP伺服器,然後由TCP伺服器主動請求建立與客戶端的連接。

圖3-3 TCP客戶在匿名埠上監聽數據連接
以上第二種方式就使用了匿名埠,並且是在客戶端使用的,用於和伺服器建立臨時的數據連接。在實際應用中,在伺服器端也可以使用匿名埠。
3.5 ServerSocket選項
ServerSocket有以下3個選項。
◆SO_TIMEOUT:表示等待客戶連接的超時時間。
◆SO_REUSEADDR:表示是否允許重用伺服器所綁定的地址。
◆SO_RCVBUF:表示接收數據的緩沖區的大小。
3.5.1 SO_TIMEOUT選項
◆設置該選項:public void setSoTimeout(int timeout) throws SocketException
◆讀取該選項:public int getSoTimeout () throws IOException
SO_TIMEOUT表示ServerSocket的accept()方法等待客戶連接的超時時間,以毫秒為單位。如果SO_TIMEOUT的值為0,表示永遠不會超時,這是SO_TIMEOUT的默認值。
當伺服器執行ServerSocket的accept()方法時,如果連接請求隊列為空,伺服器就會一直等待,直到接收到了客戶連接才從accept()方法返回。如果設定了超時時間,那麼當伺服器等待的時間超過了超時時間,就會拋出SocketTimeoutException,它是InterruptedException的子類。
如常式3-4所示的TimeoutTester把超時時間設為6秒鍾。
#p#
常式3-4 TimeoutTester.java
import java.io.*;
import java.net.*;
public class TimeoutTester{
public static void main(String args[])throws IOException{
ServerSocket serverSocket=new ServerSocket(8000);
serverSocket.setSoTimeout(6000); //等待客戶連接的時間不超過6秒
Socket socket=serverSocket.accept();
socket.close();
System.out.println("伺服器關閉");
}
}
運行以上程序,過6秒鍾後,程序會從serverSocket.accept()方法中拋出Socket- TimeoutException:
C:\chapter03\classes>java TimeoutTester
Exception in thread "main" java.net.SocketTimeoutException: Accept timed out
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(Unknown Source)
at java.net.ServerSocket.implAccept(Unknown Source)
at java.net.ServerSocket.accept(Unknown Source)
at TimeoutTester.main(TimeoutTester.java:8)
如果把程序中的「serverSocket.setSoTimeout(6000)」注釋掉,那麼serverSocket. accept()方法永遠不會超時,它會一直等待下去,直到接收到了客戶的連接,才會從accept()方法返回。
Tips:伺服器執行serverSocket.accept()方法時,等待客戶連接的過程也稱為阻塞。本書第4章的4.1節(線程阻塞的概念)詳細介紹了阻塞的概念。
3.5.2 SO_REUSEADDR選項
◆設置該選項:public void setResuseAddress(boolean on) throws SocketException
◆讀取該選項:public boolean getResuseAddress() throws SocketException
這個選項與Socket的SO_REUSEADDR選項相同,用於決定如果網路上仍然有數據向舊的ServerSocket傳輸數據,是否允許新的ServerSocket綁定到與舊的ServerSocket同樣的埠上。SO_REUSEADDR選項的默認值與操作系統有關,在某些操作系統中,允許重用埠,而在某些操作系統中不允許重用埠。
當ServerSocket關閉時,如果網路上還有發送到這個ServerSocket的數據,這個ServerSocket不會立刻釋放本地埠,而是會等待一段時間,確保接收到了網路上發送過來的延遲數據,然後再釋放埠。
許多伺服器程序都使用固定的埠。當伺服器程序關閉後,有可能它的埠還會被佔用一段時間,如果此時立刻在同一個主機上重啟伺服器程序,由於埠已經被佔用,使得伺服器程序無法綁定到該埠,伺服器啟動失敗,並拋出BindException:
Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
為了確保一個進程關閉了ServerSocket後,即使操作系統還沒釋放埠,同一個主機上的其他進程還可以立刻重用該埠,可以調用ServerSocket的setResuse- Address(true)方法:
if(!serverSocket.getResuseAddress())serverSocket.setResuseAddress(true);
值得注意的是,serverSocket.setResuseAddress(true)方法必須在ServerSocket還沒有綁定到一個本地埠之前調用,否則執行serverSocket.setResuseAddress(true)方法無效。此外,兩個共用同一個埠的進程必須都調用serverSocket.setResuseAddress(true)方法,才能使得一個進程關閉ServerSocket後,另一個進程的ServerSocket還能夠立刻重用相同埠。
3.5.3 SO_RCVBUF選項
◆設置該選項:public void setReceiveBufferSize(int size) throws SocketException
◆讀取該選項:public int getReceiveBufferSize() throws SocketException
SO_RCVBUF表示伺服器端的用於接收數據的緩沖區的大小,以位元組為單位。一般說來,傳輸大的連續的數據塊(基於HTTP或FTP協議的數據傳輸)可以使用較大的緩沖區,這可以減少傳輸數據的次數,從而提高傳輸數據的效率。而對於互動式的通信(Telnet和網路游戲),則應該採用小的緩沖區,確保能及時把小批量的數據發送給對方。
SO_RCVBUF的默認值與操作系統有關。例如,在Windows 2000中運行以下代碼時,顯示SO_RCVBUF的默認值為8192:
ServerSocket serverSocket=new ServerSocket(8000);
System.out.println(serverSocket.getReceiveBufferSize()); //列印8192
無論在ServerSocket綁定到特定埠之前或之後,調用setReceiveBufferSize()方法都有效。例外情況下是如果要設置大於64K的緩沖區,則必須在ServerSocket綁定到特定埠之前進行設置才有效。例如,以下代碼把緩沖區設為128K:
ServerSocket serverSocket=new ServerSocket();
int size=serverSocket.getReceiveBufferSize();
if(size<131072) serverSocket.setReceiveBufferSize(131072); //把緩沖區的大小設為128K
serverSocket.bind(new InetSocketAddress(8000)); //與8 000埠綁定
執行serverSocket.setReceiveBufferSize()方法,相當於對所有由serverSocket.accept()方法返回的Socket設置接收數據的緩沖區的大小。
3.5.4 設定連接時間、延遲和帶寬的相對重要性
◆public void setPerformancePreferences(int connectionTime,int latency,int bandwidth)
該方法的作用與Socket的setPerformancePreferences()方法的作用相同,用於設定連接時間、延遲和帶寬的相對重要性,參見本書第2章的2.5.10節(設定連接時間、延遲和帶寬的相對重要性)。

Ⅵ 什麼是JAVA

「什麼是Java?」

Java,由Sun Microsystems公司於1995年5月推出,它是一種可以編寫跨平台應用軟體、完全面向對象的程序設計語言。

不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。

B站尚學堂Java基礎教程

「什麼樣的人適合學Java?」

● 邏輯思維能力強

對於Java來說所有功能都是通過編寫代碼實現的,需要開發人員具備較強的邏輯性和運算性。

● 端正心態、踏實耐心

在平時的工作中會有一大部分時間是花費在解決bug上,在遇到問題後一遍遍的排查代碼,所以擁有良好的心態也是必不可少的優勢。

● 不斷學習的能力

隨著科技的發展會不斷出現各種新型的技術,開發人員需要及時的關注這些新技術並且轉化為自己技能。

Ⅶ java網路編程方向具體該怎麼去學。。。

Java前景是很不錯的,像Java這樣的專業還是一線城市比較好,師資力量跟得上、就業的薪資也是可觀的,學習Java可以按照路線圖的順序,

0基礎學習Java是沒有問題的,關鍵是找到靠譜的Java培訓機構,你可以深度了解機構的口碑情況,問問周圍知道這家機構的人,除了口碑再了解機構的以下幾方面:

1. 師資力量雄厚

要想有1+1>2的實際效果,很關鍵的一點是師資隊伍,你接下來無論是找個工作還是工作中出任哪些的人物角色,都越來越愛你本身的技術專業java技術性,也許的技術專業java技術性則絕大多數來自你的技術專業java教師,一個好的java培訓機構必須具備雄厚的師資力量。

2. 就業保障完善

實現1+1>2效果的關鍵在於能夠為你提供良好的發展平台,即能夠為你提供良好的就業保障,讓學員能夠學到實在實在的知識,並向java學員提供一對一的就業指導,確保學員找到自己的心理工作。

3. 學費性價比高

一個好的Java培訓機構肯定能給你帶來1+1>2的效果,如果你在一個由專業的Java教師領導並由Java培訓機構自己提供的平台上工作,你將獲得比以往更多的投資。

希望你早日學有所成。

Ⅷ FTPClient.pwd()、FTPClient.dir()的作用、參數意義、返回值

沒分 不多做解答了。
建議你去看Java網路編程技答宴術與清差銀實踐的第六章,裡面有個FTP界面客戶端開發,這些常用的方法、參數在裡面都慶殲有提到。

閱讀全文

與java網路編程ftp相關的資料

熱點內容
吃雞國際服為什麼會伺服器匆忙 瀏覽:244
微信中如何打開定位伺服器 瀏覽:203
java並發編程書籍 瀏覽:280
android601源碼 瀏覽:788
程序員離職了還能幹嘛 瀏覽:156
少林功法pdf 瀏覽:471
安卓80版本小游戲怎麼玩 瀏覽:632
奇書pdf 瀏覽:836
伺服器的管理口有什麼用 瀏覽:641
澳洲加密資產新政策 瀏覽:155
哈利波特連接伺服器失敗什麼意思 瀏覽:234
提取手機上安裝的app並反編譯 瀏覽:964
人工智慧演算法書 瀏覽:604
安卓如何傳輸圖片給蘋果 瀏覽:829
可編程式控制制器原理應用網路 瀏覽:587
社畜解壓是什麼意思 瀏覽:436
吉利博越用哪個app啊 瀏覽:513
西安單片機晶振電容 瀏覽:187
分地面積的演算法 瀏覽:179
安卓手機升級包後怎麼安裝 瀏覽:262