1. 程式人生 > >黑馬程式設計師——網路程式設計之TCP協議

黑馬程式設計師——網路程式設計之TCP協議

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();

	}
}