實現客戶端向伺服器端傳送檔案,伺服器向客戶端返回 “接收成功資訊“ 在客戶端列印輸出。
阿新 • • 發佈:2021-01-19
1.實現客戶端向伺服器端傳送檔案,伺服器向客戶端返回 “接收成功資訊” 在客戶端列印輸出。
客戶端
public static void main(String[] args) throws IOException {
//傳送檔案
//客戶端建立一個要傳送的新檔案
File file = new File("E:\\demo.txt");
Socket s = new Socket("127.0.0.1", 9999);
//客戶端向伺服器傳送
OutputStream os = s.getOutputStream();
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[1024];
int length = 0;
while ((length = fis.read(b)) != -1) {
os.write(b, 0, length);
}
//當伺服器用while迴圈的方法讀客戶端發去訊息時如果不做處理會產生問題
// 因為伺服器不知道客戶端何時才會傳送完資訊,所以伺服器在一直等待接收訊息,不會跳出while迴圈,自然也就執行不了後面的程式碼,不能給客戶端傳送“接受成功這條訊息”
//而與此同時伺服器端想要收到客戶端發過來的“接受成功”,這樣才可以終止本次執行。
//就產生了客戶端與伺服器互等的情況即產生死鎖。
//解決方法:當客戶端發完訊息後在while迴圈後加shutdownOutput()方法。
s.shutdownOutput();//客戶端告訴伺服器已經發送完畢
//在客戶端列印輸出“接受成功”方法1
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println( dis. readUTF());
//在客戶端列印輸出“接受成功”方法2
/*InputStream is = s.getInputStream();
byte[] b1 = new byte[1024];
int length1 = is.read(b1);
String str = new String(b1, 0, length1, "utf-8");
System.out.println(str);*/
伺服器端
public static void main(String[] args) throws IOException {
//接受檔案
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept();
//伺服器接收訊息,方法1
InputStream is = s.getInputStream();
FileOutputStream fos = new FileOutputStream("E:\\demo1");
byte[] b = new byte[1024];
int length = 0;
while((length = is.read(b))!=-1){
fos.write(b,0,length);
}
/*
//伺服器接收訊息,方法2
FileWriter fw = new FileWriter("E:\\demo1.txt");
BufferedWriter bw = new BufferedWriter(fw);
byte[] b = new byte[1024];
int length = is.read(b);
String s1 = new String(b, 0, length);
bw.write(s1);
bw.close();
*/
//給客戶端傳送“接受成功”,方法1
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF("伺服器收到訊息");
//給客戶端傳送“接受成功”,方法2
/* OutputStream os = s.getOutputStream();
String string = "接受成功";
os.write(string.getBytes("utf-8"));
*/
}
執行結果:
注意:
- 在執行時需要先啟動伺服器端。
- 客戶端想要傳送檔案給伺服器,那麼首先要求客戶端要發的檔案必須是存在的。
- 要讀清楚題目意思,伺服器端接受成功後需要向客戶器端返回接受成功。