當前位置:首頁 » 編程軟體 » 網路編程實例

網路編程實例

發布時間: 2022-12-19 19:13:29

1. java網路編程如何初始化套接字

不同的構造方法不僅帶的參數不同,所具有的意義也不一樣。下面分別解析這兩個類的實例初始化過程。 ServerSocket 實例的初始化 ServerSocket 類提供了四個構造器: public Socket(String host, int port) throws UnknownHostException, IOException public Socket(InetAddress address, int port) throws IOException public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException public Socket() public Socket(Proxy proxy) 帶參構造器用來創建已綁定的伺服器套接字,也就是說構造成功後它就已經開始偵聽指定的埠,且能夠調用 accept() 方法來接受客戶端連接。默認構造器則會創建未綁定的伺服器套接字,構造成功後必須手動將其綁定到一個本地地址才能用,在綁定之前可以進行一些選項配置。 帶參構造器 總的來說,帶參構造器提供了三個參數: port 指定該伺服器套接字所要偵聽的本地埠。如果為 0,則由系統自動分配一個埠號,這必須以另外的方式讓客戶端獲取埠號。 backlog 這個名詞目前還沒有合適的譯名。底層系統的 TCP 實現會維護一個連接隊列,該隊列緩存了已被 TCP 處理完畢,但還沒有被伺服器套接字接受的客戶端連接。一旦某個連接被接受(通過調用 accept() 方法),它就會被從隊列中移除。backlog 參數就用於指定隊列的最大長度,默認值為 50,但這個值只是一個建議,底層系統可能根據需要自動調整。如果隊列滿了,則其行為是平台相關的:微軟的 WINSOCK 會拒絕新的連接,其他實現則什麼都不做。嚴格地說,微軟沒有遵守規范,破壞了游戲規則…… bindAddr 一台機器可能會有多個本地 IP 地址,例如同時使用多塊網卡。使用其他兩個帶參構造器時,該參數為 null,伺服器套接字會在所有的本地 IP 地址(0.0.0.0 或 ::0)上偵聽。如果希望只偵聽一個地址,則可使用該參數。 默認構造器 如果使用默認構造器,在綁定地址前,還可以做些配置。綁定操作由兩個 bind 方法定義,參數類似於帶參構造器。配置項包括以下方面(都必須在綁定前配置): 設置是否重用本地地址 該選項由 setReuseAddress(boolean on) 方法配置,對應底層系統的 SO_REUSEADDR 套接字選項。JDK 沒有定義該選項的默認值。如果該選項為 false,則在關閉 TCP 連接時,為了保證可靠性,該連接可能在關閉後的一段時間(大約兩分鍾)內保持超時狀態(通常稱為 TIME_WAIT 狀態或 2MSL 等待狀態),這段時間里無法將新建的伺服器套接字綁定到同一個地址。在開發階段,伺服器可能不斷重啟,打開改選項會非常有用。 設置接收緩沖區大小 該選項由 setReceiveBufferSize(int size) 方法配置,對應底層系統的 SO_RCVBUF 套接字選項,單位是位元組。《RFC 1323 - TCP Extensions for High Performance》將緩沖區大小定義為 64KB。該選項只是一個建議值,底層系統可能根據需要自行調整。 設置超時值 該選項由 setSoTimeout(int timeout) 方法配置,對應底層系統的 SO_TIMEOUT 套接字選項,單位是毫秒。默認值為 0。該選項影響 accept 方法的阻塞時間長度,如果超時將引發 SocketTimeoutException。如果設為 0,則表示永不超時。 設置性能首選項 性能首選項包括連接時間、延遲和帶寬三個選項,由 setPerformancePreferences(int connectionTime, int latency, int bandwidth) 方法配置。這三個數值分別表示短連接時間、低延遲和高帶寬的相對重要性,數值越大則越重要;其各自的絕對值沒有意義。該方法的初衷是為了讓 Java 能在用非 TCP/IP 實現的套接字環境下工作得更好,某些需要對網路進行調優的程序也可以將這三個首選項作為配置參數提供給用戶。 Socket 實例的初始化 Socket 類提供了六個公共構造器(已過時的除外): public Socket(String host, int port) throws UnknownHostException, IOException public Socket(InetAddress address, int port) throws IOException public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException public Socket() public Socket(Proxy proxy) 前四個構造器創建已連接的客戶端套接字,也就是說構造的時候就會去連接伺服器。前兩個構造器需要提供伺服器的地址和埠作為參數,本地地址和埠由系統自動分配;後兩個允許手動指定本地地址和埠,但極少使用。後兩個構造器創建未連接的套接字,創建後需要調用 connect 方法手動連接,連接之前可以做一些配置。最後一個構造器接受一個代表代理服務其的 Proxy 對象,JDK 支持 HTTP 和 SOCKS(V4 或 V5)兩種代理類型。 連接前的配置 在連接前,客戶端套接字不僅像伺服器套接字那樣可以設置是否重用本地地址、緩沖區大小、超時值和性能首選項,還能夠配置以下各項(都必須在連接前配置): 設置是否保持活躍 該選項由 setKeepAlive(boolean on) 方法配置,對應底層系統的 SO_KEEPALIVE 套接字選項。默認值為 false。如果打開該選項,則套接字會定期自動發送保持活躍的探測性消息,類似於心跳檢測。根據《RFC 1122 - Requirements for Internet Hosts》的規定,保持活躍機制只是 TCP 的一個可選功能,如果支持的話,默認必須為 false,而且這種機制默認在成功建立連接後,且連續兩小時沒有數據傳輸的情況下才會被激活。從另一方面來看,通過套接字的 I/O 操作完全可以知道連接是否還有效,所以該選項的實用價值不大。 設置是否收發帶外數據 該選項由 setOOBInline(boolean on) 方法配置,對應底層系統的 SO_OOBINLINE 套接字選項。默認值為 off。帶外數據(Out-of-band Data)也叫做緊急數據,表示數據很重要,需要使用不同於發送普通數據的一個專用通道來發送。打開該選項後,就可以調用 sendUrgentData(int data) 方法發送一個位元組的緊急數據。JDK 對帶外數據只提供了有限支持,緊急數據將會和普通數據一起被收到,並且無法自動區分。該選項對應用開發人員意義不大。 設置是否從容關閉連接 該選項由 setSoLinger(boolean on, int linger) 方法配置,對應底層系統的 SO_LINGER 套接字選項。默認為 false。該選項只會影響套接字的關閉,其中的 linger 參數表示超時時間,單位為秒。如果打開改選項:如果將 linger 設為 0,則關閉套接字的時候,未發送的數據會被丟棄,且另一端會出現連接被同位體重置的異常;如果 linger 非 0,則關閉套接字的線程將被阻塞,直到數據全部發送或超時,超時後的行為與底層系統相關,JDK 無法控制。如果關閉該選項,則套接字正常關閉,數據也會全部發送。由於底層實現的差異性,不提倡應用開發人員打開該選項。 設置是否延遲發送數據 該選項由 setTcpNoDelay(boolean on) 方法配置,對應底層系統的 TCP_NODELAY TCP 選項。默認值為 off。打開該選項將禁用 Nagle 演算法,TCP 包會立即發送;關閉該選項則會啟用 Nagle 演算法,多個較小的 TCP 包會被組合成一個大包一起發送,雖然發送延遲了,但有利於避免網路擁塞。默認為 false。該選項對實時性很強的程序可能有用,但一般的程序不需要關心。 設置流量類別 該選項由 setTrafficClass(int tc) 方法配置,對應底層系統的「流量類別」套接字屬性。該選項用於向網路(例如路由器)提示從該套接字發送的包需要獲取哪些服務類型,對本地 TCP 協議棧沒有影響。IPv4 和 IPv6 分別定義了多個不同的值,例如 IPv4 將 0x08 定義為最大吞吐量,0x10 定義為最小延遲,等等。可以用或運算將多個值合並為一個選項。該選項用來調整性能,需要根據實際情況設置。由於只是建議值,可能被網路忽略。

2. java網路編程中如何知道對方發消息過來了

可以參考一下這段代碼

//1.構造ServerSocket實例,指定服務埠。
ServerSocketservSock=newServerSocket(servPort);


while(true)
{
//2.調用accept方法,建立和客戶端的連接
SocketclntSock=servSock.accept();
SocketAddressclientAddress=
clntSock.getRemoteSocketAddress();
System.out.println("Handlingclientat"+clientAddress);

//3.獲取連接的InputStream,OutputStream來進行數據讀寫
InputStreamin=clntSock.getInputStream();
OutputStreamout=clntSock.getOutputStream();

while((recvMsgSize=in.read(receiveBuf))!=-1)
{
out.write(receiveBuf,0,recvMsgSize);
}
//4.操作結束,關閉socket.
clntSock.close();
}

3. 麻煩給完整編程

print('\n'.join(input('請輸入多種水果名稱:').strip().split()))

4. JSP網路編程從基礎到實踐鄧子雲實例38

java.lang.NullPointerException。。。。。。。。。。。。

打開work目錄下的你的項目裡面的file11_jsp.java看看93行是什麼空指針的。

5. vb 例子

1..

Dim Words, Chars, MyString
For Words = 10 To 1 Step -1 ' 建立 10 次循環。
For Chars = 0 To 9 ' 建立 10 次循環。
MyString = MyString & Chars ' 將數字添加到字元串中。
Next Chars ' Increment counter
MyString = MyString & " " ' 添加一個空格。
Next Words

2.
Do...Loop 語句示例
本示例示範如何使用 Do...Loop 語句。內層的 Do...Loop 語句循環到第 10 次時將標志值設置為 False,並用 Exit Do 語句強制退出內層循環。外層循環則在檢查到標志值為 False 時,馬上退出。

Dim Check, Counter
Check = True: Counter = 0 ' 設置變數初始值。
Do ' 外層循環。
Do While Counter < 20 ' 內層循環。
Counter = Counter + 1 ' 計數器加一。
If Counter = 10 Then ' 如果條件成立。
Check = False ' 將標志值設成 False。
Exit Do ' 退出內層循環。
End If
Loop
Loop Until Check = False ' 退出外層循環。

3.
While...Wend 語句示例
本示例使用 While...Wend 語句來增加計數變數的值。如果條件判斷值為 True,則循環內的語句將一直執行下去。

Dim Counter
Counter = 0 ' 設置變數初值。
While Counter < 20 ' 測試計數器的值。
Counter = Counter + 1 ' 將計數器的值加一。
Wend ' 當 Counter > 19 時則循環終止。
Debug.Print Counter ' 在「立即」窗口中顯示數字 20。

Select Case 語句示例
本示例使用 Select Case 語句來判斷變數的值。示例中第二個 Case 子句包含了變數值,故只有此區塊內的語句會被完成到。

Dim Number
Number = 8 ' 設置變數初值。
Select Case Number ' 判斷 Number 的值。
Case 1 To 5 ' Number 的值在 1 到 5 之間,包含1 和 5 。
Debug.Print "Between 1 and 5"
' 下一個 Case 子句是本示例中唯一判斷值為 True 的子句。
Case 6, 7, 8 ' Number 的值在 6 到 8 之間。
Debug.Print "Between 6 and 8"
Case 9 到 10 ' Number 的值為 9 或 10。
Debug.Print "Greater than 8"
Case Else ' 其他數值。
Debug.Print "Not between 1 and 10"
End Select

6. 神經網路的硬限幅函數是什麼舉個例子

基於MATLAB的神經網路編程

(1)編程理論

作為比較成熟的演算法,軟體Matlab中有神經網路工具箱,所以可以藉助Matlab神經網路工具箱的強大功能,在此基礎上進行二次開發,從繁瑣的編程工作中解脫出來,大大提高工作效率。

Matlab的神經網路工具箱是在Matlab環境下所開發出來的許多工具箱之一,它以人工神經網路理論為基礎,用Matlab語言構造出典型神經網路的激活函數(如S型、線性等激活函數),使使用者對所選定網路的輸出計算編程對激活函數的調用;另外,根據各種修改網路權值的規律,加上網路的訓練過程,用Matlab編寫出各種網路訓練的子程序。這樣,使用者可以根據自己的應用要求,直接調用(或加進自己編寫的)神經網路子函數,而不必要從事繁瑣的編程。

基於Matlab的BP神經網路編程過程如下:
(1)對樣本集進行歸一化
確定輸入樣本和輸出樣本,並對它們進行歸一化,將輸入和輸出樣本變換到(0.1,0.9)區間,由於Matlab的歸一化函數premnmx把數據變換到(-1,1)之間,所以使用自編premnmx2歸一化函數。
(2)創建BP神經網路
在樣本集確定之後,即可進行網路的結構設計,在Matlab中一般使用newff創建函數,它不但創建了網路對象,還自動初始化網路的權重和閾值。如果需要重新初始化網路權重和閾值,可以使用Init函數。
關鍵語句如下:
net=newff(輸入樣本的取值范圍,[網路各層的神經元數目],{網路各層神經元的激活函數},『訓練函數',『學習函數』,『性能函數』)
一般選用三層BP網路,輸入層、輸出層的神經元個數根據具體情況確定,而隱層神經元個數目前多採用經驗的方法確定。
(3)設置網路的訓練參數
net.trainParam.epochs―最大收斂次數;
net.trainParam.goal―收斂誤差;
net.trainParam.show―顯示間隔;
以上在一般的神經網路訓練中都有使用,本文使用Levenberg-Marquart優化演算法進行訓練,還需設置的參數有:
net.trainParam.mu―Levenberg-Marquart優化演算法中的
net.trainParam.mu_dec― 的縮減因子;

7. 請給一些Windows中網路編程的資料

為一個不斷進取的編程者,我們常常不滿足於編程語言所提供的一般功能,總是希望能夠實現一些特殊的功能,這有時不但是我們程序的要求,有時也是編程者心理上需要(試想,還會有什麼比在深夜中巧妙解決一個難題而更令人興奮呢?)。VisualBasic,做為一個當前最流行的快速編程環境,就給我們提供了實現這些目標的平台,事實上,它無限擴展的API介面可以實現所有WINDOWS下可以實現的功能。然而對於初學者來說,「浩瀚「的API函數總是顯得那麼神奇與不可琢磨,因此在實際應用過程中不能夠靈活應用。下面我將結合兩個小例子來示範介紹VB中調用API函數的步驟和功能,並總結說明在實際工作中如何提高這方面的技巧。例子在WINDOWS98下採用VB6.0編譯
一.限制滑鼠的移動
---- 有時我們的軟體要求用戶在未完成某一任務時,滑鼠不能移出當前活動控制項,換句話就是將滑鼠限制在控制項的內部,直到任務完成或用戶中斷為止。這個功能藉助API函數實現起來思路很清楚,代碼也很簡潔。其思路是先確定當前滑鼠的位置;然後確定當前活動控制項的大小;最後將滑鼠限制在活動控制項內。(下面忽略項目建立等過程)
---- 1.建立一個新項目:新窗體為form1,在form1上添加一個commandbutton,設置其Name=CMButton1;Caption=「將滑鼠限制在此按鈕中「

---- 2.拷貝API函數和POINTAPI結構:打開VB6.0自帶的API瀏覽器,調入WIN32API.txt文件,復制以下結構和函數聲明到form1的聲明部分:

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function ClientToScreen Lib
「user32「 Alias 「ClientToScreen「 (ByVal
hwnd As Long, lpPoint As POINTAPI) As Long
『用來確定當前滑鼠的位置

Private Declare Function ClipCursor Lib
「user32「 Alias 「ClipCursor「 (lpRect As Any)
As Long 『用來限定當前滑鼠的活動范圍

---- 3.定義一個通用過程ConfineTo
Public Sub ConfineTo (myCtl As Object)
On Error Resume Next
Dim tmpRect As RECT
Dim pt As POINTAPI

With myCtl
If TypeOf myCtl Is Screen Then 『鎖定在屏幕范圍內
tmpRect.Left = 0
tmpRect.Top = 0
tmpRect.Right = (.Width \ Screen.TwipsPerPixelX)
tmpRect.Bottom = (.Height \ Screen.TwipsPerPixelY)
Elseif TypeOf myCtl Is form 『鎖定在窗體范圍內
tmpRect.Left = (.Left \ Screen.TwipsPerPixelX)
tmpRect.Top = (.Top \ Screen.TwipsPerPixelY)
tmpRect.Right = (.Left + .Width) \ Screen.TwipsPerPixelX
tmpRect.Bottom = (.Top + .Height) \ Screen.TwipsPerPixelY
else
pt.X = 0
pt.Y = 0
Call ClientToScreen(.hWnd, pt)
『獲取當前控制項在屏幕上的位置
tmpRect.Left = pt.X
『保存當前控制項位置
tmpRect.Top = pt.Y
pt.X = .Width
pt.Y = .Height
Call ClientToScreen(.hWnd, pt)
tmpRect.Bottom = pt.Y
tmpRect.Right = pt.X
End If
Call ClipCursor(tmpRect)
End With
End Sub

---- 4.在 CMButton1_Click()中加入以下代碼
Static Cliped As Boolean
『靜態變數用來控制狀態切換
If Not Cliped Then
ConfineTo Cmbutton1
Cliped = True
Else
ConfineTo Screen 『取消滑鼠限制
Cliped = True
End If

---- 5. 運行後,滑鼠點擊cmbutton1,此時滑鼠只能被鎖定在此按鈕內部,再次點擊按鈕,限製取消。
二.創建臨時文件
---- 臨時文件用來保存軟體運行過程中的臨時變化,這對於熟悉WORD等軟體的人來說,經常會遇到。那麼臨時文件是如何產生的呢,其實很簡單,只需要一個API函數就可以。
---- 1.拷貝聲明函數(方法同前)

Private Declare Function GetTempFileName Lib 「kernel32「 _
Alias 「GetTempFileNameA「 (ByVal lpszPath As String, _
ByVal lpPrefixString As String, ByVal wUnique As Long, _
ByVal lpTempFileName As String) As Long
參數定義如下:
lpszPath =傳入保存臨時文件的路徑 ,如「C:\mytemp「
lpPrefixString=傳入臨時文件名開始的前三個字母,
起到幫助識別臨時文件來源的作用。
wUnique =0 ,windows隨機產生文件名;否則安其值定義文件名。
lpTempFileName=返回隨機文件名

---- 2.返回臨時文件名
Private Function GenTempName(sPath As String)
Dim sPrefix As String
Dim lUnique As Long
Dim sTempFileName As String

If IsEmpty(sPath) Then sPath = 「c:\temp「
sPrefix = 「TVB「
lUnique = 0 『windows隨機給名

sTempFileName = Space$(100)
GetTempFileName sPath, sPrefix, lUnique, sTempFileName
sTempFileName = Mid$(sTempFileName, 1,
InStr(sTempFileName, Chr$(0)) - 1) 『去掉多餘空格
GenTempName = sTempFileName
End Function

---- 3.將下面代碼加入到form1_click()事件中
MsgBox GenTempName(「c:\temp「)

---- 4.運行,滑鼠點擊form,彈出msgbox,顯示生成「c:\temp\TVB724.tmp「文件,用文件管理器查看,在c:\temp下有TVB724.tmp 文件,長度為0K。
---- 需要注意的是,傳入的路徑必須是有效路徑,否則GenTempName函數返回0,lpTempFileName中也沒有臨時文件名。

三.結束語
---- 從上面可以看出,API函數的確簡單高效,但也充滿一些看似高深的變數而使人卻步。我們不禁會問,究竟什麼時候要用到API函數?具體哪些函數可以解決我的問題?,那些函數中的變數都代表什麼?其實對這些問題,即使對一個VB高手也難給出明確的回答,因為API函數庫實在太龐大了,每一個人最終只能熟悉其中的一小部分(這也可能是調用API的文章層出不窮的原因吧)。總結自己的一點經驗,我覺得應該注意以下幾點。
---- 1.熟練掌握VB基本技巧,了解其所能所不能,這是最基本的要求。

---- 2.了解WINDOWS內部控制機理,這樣對一些復雜的問題就可以逐步分析其調用機制,初步確定採用哪部分的API函數來解決問題。

---- 3.案頭必備一本最新的VB版的WINDOWS API 大全,推薦機械工業出版社的< >。書中給出了每一個VB可以調用的API函數的詳細說明,可以幫助精確了解所需要的API函數的變數聲明。

---- 4.多看別人的程序。報紙雜志,尤其是網上這方面的文章數不清。這是最快的方法。

---- 5.隨用隨查。永遠不要在用不到的函數上浪費寶貴的時間

8. 求助網路編程題目.C++

一.概述
TCP/IP協議是一個四層協議,它由應用層、傳輸層、網路層和鏈路層構成。TCP/IP協議棧的每一層都由許多協議構成,從而構成了一個協議簇。
應用層主要包括的協議有Telnet、ftp、HTTP、SMTP/POP3和DNS等。

傳輸層主要包括的協議有TCP和UDP。

網路層主要包括IP和IP的附屬協議。

數據鏈路層主要包括的協議有ARP(地址解析協議)、RARP協議、Ethernet協議等。
FTP(File Transfer Protocol)協議主要用來在網路上進行文件傳輸。FTP通訊除了有一個默認的埠21外,還有其他埠,同城兩個埠同時進行數據傳輸。一個是默認的埠(通常為21),主要進行控制連接,即進行命令協議及伺服器端響應碼的傳輸。另一個非標准埠主要進行數據,上傳下載文件等。

關於FTP協議和FTP命令的詳細描述,參考《Visual C 網路通信編程實用案例精選》。
實現FTP協議,有兩種方式,實用WinInet API和使用基本Winsock。對於一般應用,用WinInet效率要高,而且簡單。也可以用Winsock來編寫,這樣更加靈活,但是復雜度高且需要對協議非常熟悉。

二.VC開發
在項目中,為了開發效率,使用了WinInet的方式。

FTP是MFC的WinInet支持的三個Internet功能(HTTP, gopher)之一,我們需要先創建一個CInternetSession實例和一個CFtpConnection對象就可以實現和一個 FTP伺服器的通信。不需要直接創建CFtpConnection對象,而是通過調用CInternetsession::GetFtpConnection來完成這項工作。它創建CFtpConnection對象並返回一個指向該對象的指針。

要聯接到FTP伺服器,需要兩個步驟,首先必須創建一個CInternetSession對象,用類CInternetSession創建並初始化一個或幾個同時存在的Internet會話(session),並描述與代理伺服器的連接(如果有必要的話),如果在程序運行期間需要保持與Internet的連接,可以創建一個CInternetsession對象作為類CWinApp的成員。

然後利用CInternetsession對象獲取CFtpConnection對象。MFC中的類CFtpConnection管理我們與Internet伺服器的連接,並直接操作伺服器上的目錄和文件。

1.Ftp連接類的信息
下面我們簡要介紹連接類的信息

1.1 建立連接
CInternetsession對象

CInternetsession(LPCTSTR pstrAgent, DWORD dwConText, DWORD dwACCESSType, LPCTSTR pstrProxyName, LPCTSTR pstrProxyBypass, DWORD dwFlags);

在創建CInternetSession對象時調用這個成員函數,CInternetsession是應用程序第一個要調用的Internet函數,它將創始化內部數據結構,以備將來在應用程序中調用。如果dwFlags包含INTERNET_FLAG_ASYNC,那末從這個句柄派生的所有的句柄,在狀態回調常式注冊之前,都會出現非同步狀態。如果沒有打開Internet連接,CInternetsession就會拋出一個例外,AfxThrowInternetException。

GetFtpConnection()函數

CFtpConnection* CIternetsession::GetFtpConnection(LPCTSTR pstrServer, LPCTSTR pstrUserName, LPCTSTR pstrPassword, INTERNET_PORT nPort, BOOL bPassive);

調用這個函數建立一個FTP連接,並獲得一個指向CFtpConnection對象的指針,GetFtpConnection連接到一個FTP伺服器,創建並返回指向CFtpConnection對象的指針,它不在伺服器上進行任何操作。如果打算讀寫文件,必須進行分步操作。關於查找,打開和讀寫文件的信息需參考CFtpConnection和CFtpFileFind類。

對這個函數的調用返回一個指向CFtpConnection對象的指針。如果調用失敗,檢查拋出的CInternetException對象,就可以確定失敗的原因。

1.2 遠程目錄操作
CreateDirectory()函數

BOOL CreateDirectory( LPCTSTR pstrDirName );

Return Value

Nonzero if successful; otherwise 0. If the call fails, the Windows functionGetLastError may be called to determine the cause of the error.

Parameters

pstrDirName

A pointer to a string containing the name of the directory to create.

Remarks

Call this member function to create a directory on the connected server.

Use GetCurrentDirectory to determine the current working directory for this connection to the server. Do not assume that the remote system has connected you to the root directory.

The pstrDirName parameter can be either a partially or a fully qualified filename relative to the current directory. A backslash (\) or forward slash (/) can be used as the directory separator for either name. CreateDirectory translates the directory name separators to the appropriate characters before they are used.

注意:CreateDir 在FTP伺服器上創建已經存在的文件夾時會 返回FALSE,而且只能創建到當前(根)目錄下

RemoveDirectory()函數

BOOL RemoveDirectory( LPCTSTR pstrDirName );

Return Value

Nonzero if successful; otherwise 0. If the call fails, the Win32 functionGetLastError may be called to determine the cause of the error.

Parameters

pstrDirName

A pointer to a string containing the directory to be removed.

Remarks

Call this member function to remove the specified directory from the connected server.

Use GetCurrentDirectory to determine the server』s current working directory. Do not assume that the remote system has connected you to the root directory.

The pstrDirName parameter can be either a partially or fully qualified filename relative to the current directory. A backslash (\) or forward slash (/) can be used as the directory separator for either name. RemoveDirectory translates the directory name separators to the appropriate characters before they are used.

注意:DeleteDir文件夾中有內容,先刪除文件夾中文件,才可以刪文件夾,否則返回FALSE, 刪除不存在的文件夾返回FALSE

1.3 文件上傳下載刪除
GetFile()函數

BOOL GetFile(LPCTSTR pstrRemoteFile, LPCTSTR pstrLocalFile, BOOL bFailExists, DWORD dwAttributes, DWORD dwFlags, DWORD dwContext);

調用這個成員函數,可以從FTP伺服器取得文件,並且把文件保存在本地機器上。GetFile()函數是一個比較高級的常式,它可以處理所有有關從FTP伺服器讀文件,以及把文件存放在本地機器上的工作。如果dwFlags為 FILE_TRANSFER_TYPE_ASCII,文件數據的傳輸也會把控制和格式符轉化為Windows中的等階符號。默認的傳輸模式是二進制模式,文件會以和伺服器上相同的格式被下載。

pstrRemoteFile和 pstrLocalFile可以是相對於當前目錄的部分文件名,也可以是全文件名,在這兩個名字中間,都既可以用反斜杠(\)或者正斜杠(/)來作為文件名的目錄分隔符,GetFile()在使用前會把目錄分隔符轉化為適當的字元。

可以用自己選擇的值來取代dwContext默認的值,設置為上下文標識符與CFtpConnection對象的定位操作有關,這個操作由CFtpConnection中的CInternetSession對象創建。返回給CInternetsession::OnStatusCallBack的值指出了所標識操作的狀態。

如果調用成功,函數的返回為非0,否則返回0,如果調用失敗,可以調用Win32函數GetLastError(),確認出錯的原因。

需要注意:本地路徑須為絕對路徑,遠程路徑可為相對路徑,如hello/hello.zip,如果本地文件已經存在,則返回FALSE。

PutFile()函數

BOOL PutFile(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoveFile ,DWORD dwFlags, DWORD dwContext);

調用這個成員函數可以把文件保存到FTP伺服器。PutFile()函數是一個比較高級的常式,它可以處理有關把文件存放到伺服器上的工作。只發送數據,或要嚴格控制文件傳輸的應用程序,應該調用OpenFile和 CInternet::Write。利用自己選擇的值來取代dwContext默認的值,設置為上下文標識符,上下文標識符是 CInternetSession對象創建的CFtpConnection對象的特定操作有關,這個值返回給CInternetsession::OnStateCallBack,從而把操作的狀態通報給它所標識的上下文。

如果調用成功,函數的返回為非0,否則返回0,如果調用失敗,可以調用Win32函數GetLastError(),確認出錯的原因。

主要注意:如果重復上傳文件,會把伺服器上的文件覆蓋掉,且可以上傳特定文件夾下,如hello/hello.zip

Remove()函數

BOOL Remove( LPCTSTR pstrFileName );

如果調用成功,函數的返回為非0,否則返回0,如果調用失敗,可以調用Win32函數GetLastError(),確認出錯的原因。

pstrFileName

需要刪除的伺服器上的文件名

Call this member function to delete the specified file from the connected server.

The pstrFileName parameter can be either a partially qualified filename relative to the current directory or fully qualified. A backslash (\) or forward slash (/) can be used as the directory separator for either name. The Remove function translates the directory name separators to the appropriate characters before they are used.

注意:Remove如果刪除的文件不存在,則返回FALSE,支持相對路徑

2. 測試實例
2.1 例一 連接到FTP站點

建立連接到ftp.microsoft.com的程序,它是一個單文檔程序。並且連接由視圖類的構造函數完成。

建立單文檔程序ftp

在ftpview.h中加入包含#include < afxinet.h >

在ftpview.h中添加如下的成員變數

public:

CInternetSession *m_pInetsession;

CFtpConnection *m_pFtpConnection;

在ftpview.cpp中的ftpview構造函數中加入下面的代碼

CFtpView::CFtpView()

{

m_pInetSession=new CInternetsession

(AfxGetAppName(),1,

PRE_CONFIG_INTERNET_ACCESS);

try

{

m_pFtpConnection=m_pInetsession->

GetFtpConnection("FTP.MICROSOFT.COM");

}

catch(CInternetException *pEx)

{

TCHAR szError[1024];

if(pEx->GetErrorMessage(szError,1024))

AfxMessageBox(szError);

else

AfxMessageBox("There was an exception");

pEx->Delete();

m_pFtpConnection=NULL;

}

}

在ftpview.cpp中的ftpview析構函數中加入下面的代碼

CFtpView::~CFtpView()

{

if(m_pFtpConnection!=NULL)

{

m_pFtpConnection->Close();

delete m_pFtpConnection;

}

delete m_pInetsession;

}

編譯並且執行程序,如果連接出現問題,將會在一個消息框中報告出錯消息。

2.2 例二 發送文件到FTP文件伺服器

創建一個發送文件到FTP文件伺服器的程序

建立單文檔程序ftpfw, 在ftpfwview.h中加入包含 #include < afxinet.h >

在ftpfwview.h中添加如下的成員變數

public:

bool m_bConnectionAttempted;

int m_nFileStatus;

在ftpview.cpp中的ftpview構造函數中加入下面的代碼

CFtpfwView::CFtpfwView()

{

m_bConnectionAttempted=false;

}

使用ClassWizard加入新的類CFtpThread,該類派生於CWinThread 在ftpthread.h中加入如下變數

public:

static UINT PutFile(LPVOID Status);

添加新類成員函數代碼

UINT CFtpThread::PutFile(LPVOID Status)

{

int *pnFileStatus;

CInternetSession *pInetsession;

CFtpConnection *pFtpConnection=NULL;

pnFileStatus=(int *)Status;

*pnFileStatus=0;

pInetsession=new CInternetsession(AfxGetAppName(),1,

PRE_CONFIG_INTERNET_ACCESS);

try

{

pFtpConnection=pInetsession->

GetFtpConnection("192.34.45.0");

}

catch(CInternetException *pEx)

{

pEx->Delete();

pFtpConnection=NULL;

*pnFileStatus=-1;

goto BallOut;

}

*pnFileStatus =1;

pFtpConnection->Remove("test.txt");

if(!pFtpConnection->PutFile

("test.txt","test.txt"))

*pnFileStatus=-2;

else

*pnFileStatus=2;

BallOut:

if(pFtpConnection!=NULL)

{

pFtpConnection->Close();

delete pFtpConnection;

}

delete pInetsession;

AfxEndThread(0);

return false;

}

編輯ftpfwview.cpp中的OnDraw()函數

void CFtpfwView::OnDraw(CDC* pDC)

{

CFtpfwDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if(!m_bConnectAttempted)

{

m_bConnectAttempted=TRUE;

AfxBeginThread((AFX_THREADPROC)

CFtpThread::PutFile,&m_nFileStatus);

}

}

編譯並且執行程序,在連接和傳輸的過程中,應用程序仍然可以作自己的工作,這是因為傳輸的過程發生在線程中。

3.封裝FTPTransfer類
3.1 頭文件
///////////////////////////////////////////////////////////

// FTPTransfer.h

// interface of the FTPTransfer mole

// Created on: 24-July-2010

// Original author: Andrew Zhang

///////////////////////////////////////////////////////////

#ifndef _FTPTRANSFER_H_

#define _FTPTRANSFER_H_

#include <afxinet.h> // for ftp api functions

class FTPTransfer

{

public:

FTPTransfer();

~FTPTransfer();

BOOL Login();

void Logout();

BOOL CreateRemoteDir(LPCTSTR pstrDirName);

BOOL DeleteRemoteDir(LPCTSTR pstrDirName);

BOOL Upload(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoteFile);

BOOL Download(LPCTSTR pstrRemoteFile, LPCTSTR pstrLocalFile);

BOOL DeleteRemoteFile(LPCTSTR pstrFileName);

BOOL UploadAll();

CString GetLastError();

protected:

private:

void Config();

CString m_csServer;

CString m_csUsername;

CString m_csPassword;

unsigned int m_nPort;

CInternetSession *m_pSession;

CFtpConnection *m_pConn;

static CString lastError;

public:

// 需要傳輸的文件夾

CStringArray m_astrAllDirName;

CString m_csLocalDir; // 本地圖像所在路徑,需要外界賦值。

};

#endif

3.2 設置配置項
可以配置伺服器的IP,Port,用戶名,密碼等

配置項樣例:

[FTPTransfer]

FTPServer = 192.168.29.253

Username = andrew

Password = zhang

Port = 21

;Ftp伺服器的IP 賬戶 密碼

3.3 使用說明
FTPTransfer transfer;

transfer.m_csLocalDir = url + strImgNo.c_str();

transfer.m_astrAllDirName.Add(csImgNo);

try

{

if (!transfer.UploadAll())

{

CString strlog(_T("[threadOperationTransfer]: "));

ServiceLog.write_log("[threadOperationTransfer]: ERROR! Upload error.");

CString csError = transfer.GetLastError();

ServiceLog.write_log((LPCWSTR)(strlog+ csError));

return -1; // FTP Error;

}

}

catch (...)

{

CString strlog(_T("[threadOperationTransfer]: "));

ServiceLog.write_log("[threadOperationTransfer]: ERROR! upload except:");

CString csError = transfer.GetLastError();

ServiceLog.write_log((LPCWSTR)(strlog+ csError));

return -1;

}

三.總結
通過以上的程序我們可以明白FTP的工作原理,因為基於應用,解釋的還比較淺顯。另外上傳和下載需要比較久的時間,可以考慮設計多線程的方式來實現,這樣不至於程序阻塞。

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/loadstar_kun/archive/2010/08/06/5790288.aspx

9. c#網路編程的問題,關於TcpClient類。

問題3:實例化client後要開一個線程來讀寫數據的。

1:對,read放在while循環 當然這樣cpu會掛,不過Read會讓線程掛起 還需要一個推出線程的方法,就是while循環何時break 需要ManualResetEvent這個類來控制

2: Read是阻塞的,伺服器不發消息Read一直阻塞,Read一個byte[]是你自己指定 比如
byte[] buffer=new byte[512] Read的第三個參數size就是512
比如伺服器發來1025個位元組 第一次Read512個 第二次Read512個 第三次Read1個 第四次Read會掛起了 接受了多少個位元組? Read返回int 相加肯定是1025了

目的是緩存 如果TcpServer發來1G的數據 client不用緩存讀肯定掛了。

10. web開發技術與網路編程技術的區別是什麼請舉幾個例子

1、Web技術強調網頁設計(包括靜態/動態頁面),也包括你所提及的網路編程技術,還強調網站Web伺服器的建設。
2、網路編程強調的是編程。需要使用具體的程序語言。比如你所提到的Java。(初步學習的時候用到如JavaApplet、JSP、Servlet,大型用到J2EE、J2SE等)
3、歡迎高人指點。

熱點內容
生化危機5配置要求怎麼樣 發布:2025-07-14 15:38:56 瀏覽:300
蘋果電話為什麼打不開密碼 發布:2025-07-14 15:33:45 瀏覽:44
安卓如何取消短消息通知 發布:2025-07-14 15:30:54 瀏覽:372
輿情監測演算法 發布:2025-07-14 15:29:19 瀏覽:13
android搜索聯系人 發布:2025-07-14 15:27:34 瀏覽:332
省唄上傳學歷 發布:2025-07-14 15:21:54 瀏覽:633
linux伺服器tomcat 發布:2025-07-14 15:19:41 瀏覽:191
東風風神奕炫max怎麼配置 發布:2025-07-14 15:13:44 瀏覽:746
蘋果安卓不知道到底怎麼選 發布:2025-07-14 15:07:52 瀏覽:925
資料庫spl 發布:2025-07-14 15:05:22 瀏覽:436