黑馬程式設計師——網路程式設計之TCP協議
阿新 • • 發佈:2019-01-26
TCP協議案例
/*
* 需求:
* 服務端接收資料並寫入文字檔案,寫入完畢後提示客戶端檔案上傳完畢
* 用執行緒實現伺服器端能夠同時接收多個客戶端的訪問
*/
建立伺服器接收檔案的執行緒類
tcp協議傳輸資料
由於tcp傳輸需要建立連線,所以資料的傳輸都是在建立連線以後進行的,是在連線通道中傳輸的。所以伺服器端一定要先開啟。
接收資料: A:建立接收端的Socket物件,指明埠號 ServerSocket(int port) B:監聽客戶端連線。返回一個對應的Socket物件,以便得到對應的資訊 public Socket accept() C:通過返回的Socket物件獲取輸入流,讀取資料顯示在控制檯 public InputStream getInputStream() D:釋放資源
建立伺服器物件並開啟伺服器import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class ServerThread implements Runnable { // 利用構造引數傳遞服務端獲取的Socket物件 private Socket s; public ServerThread(Socket s) { this.s = s; } // 把獲取到客戶端Socket後的操作用執行緒實現 @Override public void run() { try { // 獲取通道輸入流並封裝 BufferedReader br = new BufferedReader(new InputStreamReader( s.getInputStream())); // 建立字元輸出流物件 BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); // 讀取資料並輸出到文字檔案 String line = null; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } // 獲取通道輸出流物件並封裝 BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter( s.getOutputStream())); // 輸出提示到客戶端 bw2.write("檔案上傳完畢"); bw2.flush(); // 釋放資源 bw.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } } }
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerTest { public static void main(String[] args) throws IOException { //建立服務端Socket物件 ServerSocket ss = new ServerSocket(22222); //用迴圈獲取客戶端物件並開啟執行緒 while(true){ Socket s = ss.accept(); new Thread(new ServerThread(s)).start(); } } }
客戶端上傳檔案並讀取伺服器的反饋
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
/*
* 客戶端讀取檔案傳送到伺服器,並讀取伺服器返回的提示
*/
public class UploadDemo {
public static void main(String[] args) throws IOException {
// 建立客戶端物件
Socket s = new Socket("127.0.0.1", 22222);
// 獲取並封裝通道輸出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
// 建立字元輸入流物件
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
// 讀取文字檔案內容並輸出到伺服器
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// 客戶端提示關閉管道輸出流
s.shutdownOutput();
// 獲取並封裝通道輸入流物件
BufferedReader br2 = new BufferedReader(new InputStreamReader(
s.getInputStream()));
//讀取伺服器返回的提示
String str = br2.readLine();
System.out.println(str);
// 釋放資源
br.close();
s.close();
}
}