① 客戶端怎麼使用httpclient向https伺服器發送數據
直接用HttpClient這個類庫,每次你都用同一個cookie去登錄就可以保持session了HttpClient是一個客戶端的HTTP通信實現庫,目標是發送和接受HTTP請求。HTTPClient維護cookies,session的保持在客戶端就是cookie的體現。HttpClinet的session的保持有兩種方式,一種是將HttpClient實例保存於web應用的session中,再次請求時取出,因為httpclient會維持cookies。另一種是再次請求時,將上次請求獲取的cookies帶入請求中,此種方式無需將httpclient保存於session中。NameValuePair[]param={newNameValuePair("username",userId),newNameValuePair("password",password)};//第一種方式httpclient保存於session,每次請求均為同一httpclient,httpclient維持cookies//HttpClientclient=(HttpClient)request.getSession().getAttribute("HTTPCLIENT");//第二種方式每次請求帶入之前請求獲取的cookies。HttpClientclient=newHttpClient();client.getState().addCookies(cookies);PostMethodpost=newPostMethod(url);client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"UTF-8");client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);post.setRequestBody(param);client.executeMethod(post);Cookie[]cookies=client.getState().getCookies();post.releaseConnection();
② 客戶端與伺服器進行數據交互的方法都有哪些
C/S模式和B/S各有其有點也各有其缺點,B/S模式在開發中需要考慮數據如何從客戶端提交到伺服器端,數據又如何返回到客戶端,這些是B/S模式所特有的,在去年之前,開發B/S模式的程序,我都是利用form來交互數據,當我看到XML之後,發現XML是個好冬冬,有很多優點,有好的東西當然不能獨享啦,想當年為了實現XML交互數據,幾乎把網路翻了個遍。咚,一塊磚頭上來了。呵呵,廢話少說,下面我們就進入正題。
B/S模式分為伺服器端和客戶端,客戶端接受用戶的請求,客戶端向應用服務提出請求,應用服務從資料庫服務中獲得數據,應用服務將數據進行計算並將結果提交給客戶端,客戶端將結果呈現給用戶。這樣,我們就看到了數據從客戶到伺服器,經過伺服器的處理再返回到客戶端,由客戶端軟體(如IE)顯示結果。
(以ASP教本語言為例,其它的語言一樣哈。)
1.Form方式
Form方式是最基本的向伺服器提交數據的方式。
test.asp文件代碼:
<%@ Language=VBScript %>
<%
Response.Expires=-1
Response.CharSet="UTF-8"
Session.CodePage="65001"
%>
<form name="frmTest" id="frmTest" action="test.asp" method="POST">
<input name="name" id=" name" type="text" value="">
<input type="hidden" name="number" id="number" value="10">
<input type="submit" value="Submit" name="B1">
</form>
<%
dim intnumber
dim strname
if IsEmpty(Request("name")) then
strname =""
else
strname =Request("name")
end if
if IsEmpty(Request("number")) then
intnumber =0
else
intnumber =Request("number")
end if
③ 客戶端是如何上傳數據到FTP伺服器和從FTP伺服器下載文件的
有專門的FTP軟體的
客戶端有flashfxp
服務端有Serv-U
FTP 是File Transfer Protocol(文件傳輸協議)的英文簡稱,而中文簡稱為「文傳協議」。用於Internet上的控制文件的雙向傳輸。同時,它也是一個應用程序(Application)。基於不同的操作系統有不同的FTP應用程序,而所有這些應用程序都遵守同一種協議以傳輸文件。在FTP的使用當中,用戶經常遇到兩個概念:"下載"(Download)和"上傳"(Upload)。"下載"文件就是從遠程主機拷貝文件至自己的計算機上;"上傳"文件就是將文件從自己的計算機中拷貝至遠程主機上。用Internet語言來說,用戶可通過客戶機程序向(從)遠程主機上傳(下載)文件。
TCP/IP協議中,FTP標准命令TCP埠號為21,Port方式數據埠為20。FTP的任務是從一台計算機將文件傳送到另一台計算機,不受操作系統的限制。
需要進行遠程文件傳輸的計算機必須安裝和運行ftp客戶程序。在windows操作系統的安裝過程中,通常都安裝了tcp/ip協議軟體,其中就包含了ftp客戶程序。但是該程序是字元界面而不是圖形界面,這就必須以命令提示符的方式進行操作,很不方便。
啟動ftp客戶程序工作的另一途徑是使用ie瀏覽器,用戶只需要在ie地址欄中輸入如下格式的url地址:ftp://[用戶名:口令@]ftp伺服器域名:[埠號]
(在CMD命令行下也可以用上述方法連接,通過put命令和get命令達到上傳和下載的目的,通過ls命令列出目錄,除了上述方法外還可以在cmd下輸入ftp回車,然後輸入open IP來建立一個連接,此方法還適用於linux下連接ftp伺服器)
通過ie瀏覽器啟動ftp的方法盡管可以使用,但是速度較慢,還會將密碼暴露在ie瀏覽器中而不安全。因此一般都安裝並運行專門的ftp客戶程序。
1.在本地電腦上登陸到國際互聯網。
2.搜索有文件共享主機或者個人電腦(一般有專門的FTP伺服器網站上公布的,上面有進入該主機或個人電腦的名稱,口令和路徑).
3.當與遠程主機或者對方的個人電腦建立連接後,用對方提供的用戶名和口令登陸到該主機或對方的個人電腦。
4.在遠程主機或對方的個人電腦登陸成功後,就可以上傳你想跟別人分享的東西或者下載別人授權共享的東西(這里的東西是指能放到電腦里去又能在顯示屏上看到的東西).
5.完成工作後關閉FTP下載軟體,切斷連接。
④ java中如何實現從客戶端發送文件到伺服器端
伺服器端源碼:x0dx0aimport java.io.BufferedReader;x0dx0aimport java.io.File;x0dx0aimport java.io.FileNotFoundException;x0dx0aimport java.io.FileOutputStream;x0dx0aimport java.io.IOException;x0dx0aimport java.io.InputStream;x0dx0aimport java.io.InputStreamReader;x0dx0aimport java.net.ServerSocket;x0dx0aimport java.net.Socket;x0dx0ax0dx0a/**x0dx0a *x0dx0a * 文件名:ServerReceive.javax0dx0a * 實現功能:作為伺服器接收客戶端發送的文件x0dx0a *x0dx0a * 具體實現過程:x0dx0a * 1、建立SocketServer,等待客戶端的連接x0dx0a * 2、當有客戶端連接的時候,按照雙方的約定,這時要讀取一行數據x0dx0a * 其中保存客戶端要發送的文件名和文件大小信息x0dx0a * 3、根據文件名在本地創建文件,並建立好流通信x0dx0a * 4、循環接收數據包,將數據包寫入文件x0dx0a * 5、當接收數據的長度等於提前文件發過來的文件長度,即表示文件接收完畢,關閉文件x0dx0a * 6、文件接收工作結束x0dx0ax0dx0apublic class ServerReceive {x0dx0a x0dx0a public static void main(String[] args) {x0dx0a x0dx0a /**與伺服器建立連接的通信句柄*/x0dx0a ServerSocket ss = null;x0dx0a Socket s = null;x0dx0a x0dx0a /**定義用於在接收後在本地創建的文件對象和文件輸出流對象*/x0dx0a File file = null;x0dx0a FileOutputStream fos = null;x0dx0a x0dx0a /**定義輸入流,使用socket的inputStream對數據包進行輸入*/x0dx0a InputStream is = null;x0dx0a x0dx0a /**定義byte數組來作為數據包的存儲數據包*/x0dx0a byte[] buffer = new byte[4096 * 5];x0dx0a x0dx0a /**用來接收文件發送請求的字元串*/x0dx0a String comm = null;x0dx0ax0dx0a/**建立socekt通信,等待伺服器進行連接*/x0dx0a try {x0dx0a ss = new ServerSocket(4004);x0dx0a s = ss.accept();x0dx0a } catch (IOException e) {x0dx0a e.printStackTrace();x0dx0a }x0dx0ax0dx0a/**讀取一行客戶端發送過來的約定信息*/x0dx0a try {x0dx0a InputStreamReader isr = new InputStreamReader(s.getInputStream());x0dx0a BufferedReader br = new BufferedReader(isr);x0dx0a comm = br.readLine();x0dx0a } catch (IOException e) {x0dx0a System.out.println("伺服器與客戶端斷開連接");x0dx0a }x0dx0a x0dx0a /**開始解析客戶端發送過來的請求命令*/x0dx0a int index = comm.indexOf("/#");x0dx0a x0dx0a /**判斷協議是否為發送文件的協議*/x0dx0a String xieyi = comm.substring(0, index);x0dx0a if(!xieyi.equals("111")){x0dx0a System.out.println("伺服器收到的協議碼不正確");x0dx0a return;x0dx0a }x0dx0a x0dx0a /**解析出文件的名字和大小*/x0dx0a comm = comm.substring(index + 2);x0dx0a index = comm.indexOf("/#");x0dx0a String filename = comm.substring(0, index).trim();x0dx0a String filesize = comm.substring(index + 2).trim();x0dx0ax0dx0a/**創建空文件,用來進行接收文件*/x0dx0a file = new File(filename);x0dx0a if(!file.exists()){x0dx0a try {x0dx0a file.createNewFile();x0dx0a } catch (IOException e) {x0dx0a System.out.println("伺服器端創建文件失敗");x0dx0a }x0dx0a }else{x0dx0a /**在此也可以詢問是否覆蓋*/x0dx0a System.out.println("本路徑已存在相同文件,進行覆蓋");x0dx0a }x0dx0a x0dx0a /**【以上就是客戶端代碼中寫到的伺服器的准備部分】*/x0dx0ax0dx0a/**x0dx0a * 伺服器接收文件的關鍵代碼*/x0dx0a try {x0dx0a /**將文件包裝到文件輸出流對象中*/x0dx0a fos = new FileOutputStream(file);x0dx0a long file_size = Long.parseLong(filesize);x0dx0a is = s.getInputStream();x0dx0a /**size為每次接收數據包的長度*/x0dx0a int size = 0;x0dx0a /**count用來記錄已接收到文件的長度*/x0dx0a long count = 0;x0dx0a x0dx0a /**使用while循環接收數據包*/x0dx0a while(count < file_size){x0dx0a /**從輸入流中讀取一個數據包*/x0dx0a size = is.read(buffer);x0dx0a x0dx0a /**將剛剛讀取的數據包寫到本地文件中去*/x0dx0a fos.write(buffer, 0, size);x0dx0a fos.flush();x0dx0a x0dx0a /**將已接收到文件的長度+size*/x0dx0a count += size;x0dx0a System.out.println("伺服器端接收到數據包,大小為" + size);x0dx0a }x0dx0a x0dx0a } catch (FileNotFoundException e) {x0dx0a System.out.println("伺服器寫文件失敗");x0dx0a } catch (IOException e) {x0dx0a System.out.println("伺服器:客戶端斷開連接");x0dx0a }finally{x0dx0a /**x0dx0a * 將打開的文件關閉x0dx0a * 如有需要,也可以在此關閉socket連接x0dx0a * */x0dx0a try {x0dx0a if(fos != null)x0dx0a fos.close();x0dx0a } catch (IOException e) {x0dx0a e.printStackTrace();x0dx0a }//catch (IOException e)x0dx0a }//finallyx0dx0a x0dx0a }//public static void main(String[] args)x0dx0a}//public class ServerReceivex0dx0ax0dx0a客戶端源碼:x0dx0ax0dx0aimport java.io.File;x0dx0aimport java.io.FileInputStream;x0dx0aimport java.io.FileNotFoundException;x0dx0aimport java.io.IOException;x0dx0aimport java.io.OutputStream;x0dx0aimport java.io.PrintStream;x0dx0aimport java.net.Socket;x0dx0ax0dx0a/**x0dx0a *x0dx0a * 文件名:ClientSend.javax0dx0a * 實現功能:作為客戶端向伺服器發送一個文件x0dx0a *x0dx0a * 具體實現過程:x0dx0a * 1、建立與伺服器端的連接,IP:127.0.0.1, port:4004x0dx0a * 2、將文件的名字和大小通過自定義的文件傳輸協議,發送到伺服器x0dx0a * 3、循環讀取本地文件,將文件打包發送到數據輸出流中x0dx0a * 4、關閉文件,結束傳輸x0dx0a *x0dx0a * */x0dx0a x0dx0apublic class ClientSend {x0dx0a x0dx0a public static void main(String[] args) {x0dx0a x0dx0a /**與伺服器建立連接的通信句柄*/x0dx0a Socket s = null;x0dx0a x0dx0a /**定義文件對象,即為要發送的文件x0dx0a * 如果使用絕對路徑,不要忘記使用'/'和'\'的區別x0dx0a * 具體區別,請讀者自行查詢x0dx0a * */x0dx0a File sendfile = new File("API.CHM");x0dx0a /**定義文件輸入流,用來打開、讀取即將要發送的文件*/x0dx0a FileInputStream fis = null;x0dx0a /**定義byte數組來作為數據包的存儲數據包*/x0dx0a byte[] buffer = new byte[4096 * 5];x0dx0a x0dx0a /**定義輸出流,使用socket的outputStream對數據包進行輸出*/x0dx0a OutputStream os = null;x0dx0ax0dx0a/**檢查要發送的文件是否存在*/x0dx0a if(!sendfile.exists()){x0dx0a System.out.println("客戶端:要發送的文件不存在");x0dx0a return;x0dx0a }x0dx0ax0dx0a/**與伺服器建立連接*/x0dx0a try {x0dx0a s = new Socket("127.0.0.1", 4004);x0dx0a }catch (IOException e) {x0dx0a System.out.println("未連接到伺服器");x0dx0a }x0dx0a x0dx0a /**用文件對象初始化fis對象x0dx0a * 以便於可以提取出文件的大小x0dx0a * */x0dx0a try {x0dx0a fis = new FileInputStream(sendfile);x0dx0a } catch (FileNotFoundException e1) {x0dx0a e1.printStackTrace();x0dx0a }x0dx0ax0dx0a/**首先先向伺服器發送關於文件的信息,以便於伺服器進行接收的相關准備工作x0dx0a * 具體的准備工作,請查看伺服器代碼。x0dx0a *x0dx0a * 發送的內容包括:發送文件協議碼(此處為111)/#文件名(帶後綴名)/#文件大小x0dx0a * */x0dx0a try {x0dx0a PrintStream ps = new PrintStream(s.getOutputStream());x0dx0a ps.println("111/#" + sendfile.getName() + "/#" + fis.available());x0dx0a ps.flush();x0dx0a } catch (IOException e) {x0dx0a System.out.println("伺服器連接中斷");x0dx0a }x0dx0ax0dx0a/**x0dx0a * 此處睡眠2s,等待伺服器把相關的工作準備好x0dx0a * 也是為了保證網路的延遲x0dx0a * 讀者可自行選擇添加此代碼x0dx0a * */x0dx0a try {x0dx0a Thread.sleep(2000);x0dx0a } catch (InterruptedException e1) {x0dx0a e1.printStackTrace();x0dx0a }x0dx0ax0dx0a/**之前的准備工作結束之後x0dx0a * 下面就是文件傳輸的關鍵代碼x0dx0a * */x0dx0a try {x0dx0a x0dx0a /**獲取socket的OutputStream,以便向其中寫入數據包*/x0dx0a os = s.getOutputStream();x0dx0a x0dx0a /** size 用來記錄每次讀取文件的大小*/x0dx0a int size = 0;x0dx0a x0dx0a /**使用while循環讀取文件,直到文件讀取結束*/x0dx0a while((size = fis.read(buffer)) != -1){x0dx0a System.out.println("客戶端發送數據包,大小為" + size);x0dx0a /**向輸出流中寫入剛剛讀到的數據包*/x0dx0a os.write(buffer, 0, size);x0dx0a /**刷新一下*/x0dx0a os.flush();x0dx0a }x0dx0a } catch (FileNotFoundException e) {x0dx0a System.out.println("客戶端讀取文件出錯");x0dx0a } catch (IOException e) {x0dx0a System.out.println("客戶端輸出文件出錯");x0dx0a }finally{x0dx0a x0dx0a /**x0dx0a * 將打開的文件關閉x0dx0a * 如有需要,也可以在此關閉socket連接x0dx0a * */x0dx0a try {x0dx0a if(fis != null)x0dx0a fis.close();x0dx0a } catch (IOException e) {x0dx0a System.out.println("客戶端文件關閉出錯");x0dx0a }//catch (IOException e)x0dx0a }//finallyx0dx0a x0dx0a }//public static void main(String[] args)x0dx0a}//public class ClientSend
⑤ android開發客戶端,已知伺服器的IP和埠,如何給該伺服器發送數據
用socket套接字,與伺服器段建立連接,通過獲得socket的輸入輸出流來進行數據傳輸與接受,發數據就用outputstream的write方法
⑥ 客戶端向伺服器提交表單數據,可以採用的方式是
HTTP/1.1協議中共定義了八種方法(有時也叫「動作」)來表明Request-URI指定的資源的不同操作方式:
OPTIONS
返回伺服器針對特定資源所支持的HTTP請求方法。也可以利用向Web伺服器發送'*'的請求來測試伺服器的功能性。
HEAD
向伺服器索要與GET請求相一致的響應,只不過響應體將不會被返回。這一方法可以在不必傳輸整個響應內容的情況下,就可以獲取包含在響應消息頭中的元信息。
GET
向特定的資源發出請求。注意:GET方法不應當被用於產生「副作用」的操作中。
POST
向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
PUT
向指定資源位置上傳其最新內容。
DELETE
請求伺服器刪除Request-URI所標識的資源。
TRACE
回顯伺服器收到的請求,主要用於測試或診斷。
CONNECT
HTTP/1.1協議中預留給能夠將連接改為管道方式的代理伺服器。
⑦ java socket 客戶端是如何向伺服器端發送消息的
伺服器端和客戶端都是通過SOCKET來進行通信的,首先產生一個 socket實例,通過這個實例,伺服器端調用accept這個方法接收來自客戶端發送的信息.但是在產生socket實例的時候必須初始化一個埠.用來負責接受客戶端的請求!
客戶端要給伺服器發送消息也必須產生一個socket實例,初始化的時候必須指定伺服器的IP地址,並且指定服務接收的埠號,這樣客戶端才能找到伺服器要接收的地方,找到地方就可以發送過去了。和你寫信一樣。找到地址
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
這個只是用來獲取一個從鍵盤的一個流.傳送給伺服器端的數據都是通過流來表示的。意思是是鍵盤輸入的一個位元組轉化成字元流.並輸出或者寫入!
⑧ java中如何實現從客戶端發送文件到伺服器端
伺服器端源碼:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* 文件名:ServerReceive.java
* 實現功能:作為伺服器接收客戶端發送的文件
*
* 具體實現過程:
* 1、建立SocketServer,等待客戶端的連接
* 2、當有客戶端連接的時候,按照雙方的約定,這時要讀取一行數據
* 其中保存客戶端要發送的文件名和文件大小信息
* 3、根據文件名在本地創建文件,並建立好流通信
* 4、循環接收數據包,將數據包寫入文件
* 5、當接收數據的長度等於提前文件發過來的文件長度,即表示文件接收完畢,關閉文件
* 6、文件接收工作結束
public class ServerReceive {
public static void main(String[] args) {
/**與伺服器建立連接的通信句柄*/
ServerSocket ss = null;
Socket s = null;
/**定義用於在接收後在本地創建的文件對象和文件輸出流對象*/
File file = null;
FileOutputStream fos = null;
/**定義輸入流,使用socket的inputStream對數據包進行輸入*/
InputStream is = null;
/**定義byte數組來作為數據包的存儲數據包*/
byte[] buffer = new byte[4096 * 5];
/**用來接收文件發送請求的字元串*/
String comm = null;
/**建立socekt通信,等待伺服器進行連接*/
try {
ss = new ServerSocket(4004);
s = ss.accept();
} catch (IOException e) {
e.printStackTrace();
}
/**讀取一行客戶端發送過來的約定信息*/
try {
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
comm = br.readLine();
} catch (IOException e) {
System.out.println("伺服器與客戶端斷開連接");
}
/**開始解析客戶端發送過來的請求命令*/
int index = comm.indexOf("/#");
/**判斷協議是否為發送文件的協議*/
String xieyi = comm.substring(0, index);
if(!xieyi.equals("111")){
System.out.println("伺服器收到的協議碼不正確");
return;
}
/**解析出文件的名字和大小*/
comm = comm.substring(index + 2);
index = comm.indexOf("/#");
String filename = comm.substring(0, index).trim();
String filesize = comm.substring(index + 2).trim();
/**創建空文件,用來進行接收文件*/
file = new File(filename);
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
System.out.println("伺服器端創建文件失敗");
}
}else{
/**在此也可以詢問是否覆蓋*/
System.out.println("本路徑已存在相同文件,進行覆蓋");
}
/**【以上就是客戶端代碼中寫到的伺服器的准備部分】*/
/**
* 伺服器接收文件的關鍵代碼*/
try {
/**將文件包裝到文件輸出流對象中*/
fos = new FileOutputStream(file);
long file_size = Long.parseLong(filesize);
is = s.getInputStream();
/**size為每次接收數據包的長度*/
int size = 0;
/**count用來記錄已接收到文件的長度*/
long count = 0;
/**使用while循環接收數據包*/
while(count < file_size){
/**從輸入流中讀取一個數據包*/
size = is.read(buffer);
/**將剛剛讀取的數據包寫到本地文件中去*/
fos.write(buffer, 0, size);
fos.flush();
/**將已接收到文件的長度+size*/
count += size;
System.out.println("伺服器端接收到數據包,大小為" + size);
}
} catch (FileNotFoundException e) {
System.out.println("伺服器寫文件失敗");
} catch (IOException e) {
System.out.println("伺服器:客戶端斷開連接");
}finally{
/**
* 將打開的文件關閉
* 如有需要,也可以在此關閉socket連接
* */
try {
if(fos != null)
fos.close();
} catch (IOException e) {
e.printStackTrace();
}//catch (IOException e)
}//finally
}//public static void main(String[] args)
}//public class ServerReceive
客戶端源碼:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
/**
*
* 文件名:ClientSend.java
* 實現功能:作為客戶端向伺服器發送一個文件
*
* 具體實現過程:
* 1、建立與伺服器端的連接,IP:127.0.0.1, port:4004
* 2、將文件的名字和大小通過自定義的文件傳輸協議,發送到伺服器
* 3、循環讀取本地文件,將文件打包發送到數據輸出流中
* 4、關閉文件,結束傳輸
*
* */
public class ClientSend {
public static void main(String[] args) {
/**與伺服器建立連接的通信句柄*/
Socket s = null;
/**定義文件對象,即為要發送的文件
* 如果使用絕對路徑,不要忘記使用'/'和'\'的區別
* 具體區別,請讀者自行查詢
* */
File sendfile = new File("API.CHM");
/**定義文件輸入流,用來打開、讀取即將要發送的文件*/
FileInputStream fis = null;
/**定義byte數組來作為數據包的存儲數據包*/
byte[] buffer = new byte[4096 * 5];
/**定義輸出流,使用socket的outputStream對數據包進行輸出*/
OutputStream os = null;
/**檢查要發送的文件是否存在*/
if(!sendfile.exists()){
System.out.println("客戶端:要發送的文件不存在");
return;
}
/**與伺服器建立連接*/
try {
s = new Socket("127.0.0.1", 4004);
}catch (IOException e) {
System.out.println("未連接到伺服器");
}
/**用文件對象初始化fis對象
* 以便於可以提取出文件的大小
* */
try {
fis = new FileInputStream(sendfile);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
/**首先先向伺服器發送關於文件的信息,以便於伺服器進行接收的相關准備工作
* 具體的准備工作,請查看伺服器代碼。
*
* 發送的內容包括:發送文件協議碼(此處為111)/#文件名(帶後綴名)/#文件大小
* */
try {
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println("111/#" + sendfile.getName() + "/#" + fis.available());
ps.flush();
} catch (IOException e) {
System.out.println("伺服器連接中斷");
}
/**
* 此處睡眠2s,等待伺服器把相關的工作準備好
* 也是為了保證網路的延遲
* 讀者可自行選擇添加此代碼
* */
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
/**之前的准備工作結束之後
* 下面就是文件傳輸的關鍵代碼
* */
try {
/**獲取socket的OutputStream,以便向其中寫入數據包*/
os = s.getOutputStream();
/** size 用來記錄每次讀取文件的大小*/
int size = 0;
/**使用while循環讀取文件,直到文件讀取結束*/
while((size = fis.read(buffer)) != -1){
System.out.println("客戶端發送數據包,大小為" + size);
/**向輸出流中寫入剛剛讀到的數據包*/
os.write(buffer, 0, size);
/**刷新一下*/
os.flush();
}
} catch (FileNotFoundException e) {
System.out.println("客戶端讀取文件出錯");
} catch (IOException e) {
System.out.println("客戶端輸出文件出錯");
}finally{
/**
* 將打開的文件關閉
* 如有需要,也可以在此關閉socket連接
* */
try {
if(fis != null)
fis.close();
} catch (IOException e) {
System.out.println("客戶端文件關閉出錯");
}//catch (IOException e)
}//finally
}//public static void main(String[] args)
}//public class ClientSend