1. 程式人生 > 其它 >Java新人之路 -- Java中的Socket

Java新人之路 -- Java中的Socket

技術標籤:java

Socket程式設計

Socket的英文原義是“孔”或“插座”。

Socket類(套接字)可以看成是兩個網路應用程式進行通訊時,各自通訊連線中的端點。當然,Socket也可以提供多個埠的連線服務

資料傳輸其實就是客戶端到服務端,服務端到客戶端的一個過程,資料是以流的形式進行傳輸的

特點:基於TCP連線,更安全所以適合應用於即時通訊

流程: 以客戶端(client)及服務端(server)為例

  • server執行開始監聽
  • client執行發出請求
  • 建立連線開始通訊

以聊天功能為例

  • 客戶端程式碼
public class Client {

	public static void
main(String[] args) { Socket socket = null; OutputStream os = null; OutputStreamWriter osw = null; InputStream is = null; InputStreamReader isr = null; BufferedReader br = null; try { while (true) { // 建立客戶端物件,設定傳送的地址及埠號 socket = new Socket("172.16.4.127", 5555); // 從控制檯獲取要傳送的內容
Scanner scan = new Scanner(System.in); String sendContent = scan.nextLine(); // 將要傳送的內容通過輸出流的形式進行寫的操作 os = socket.getOutputStream(); // 將位元組流轉為字元流進行寫的操作(當中會寫字串) osw = new OutputStreamWriter(os); // 進行寫的操作 osw.write(sendContent); // 重新整理流 osw.flush(); // 告訴伺服器寫完了,請求接收
socket.shutdownOutput(); // 以下為獲取服務端的反饋 // 從socket中獲取輸入流物件 is = socket.getInputStream(); // 從位元組流轉為字元流進行讀取 isr = new InputStreamReader(is); // 使用字元緩衝流進行讀取操作 br = new BufferedReader(isr); String getContent = null; while ((getContent = br.readLine()) != null) { System.out.println(getContent); } // 結束判斷 if (sendContent.equals("Over!")) { break; } } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } if (isr != null) { isr.close(); } if (is != null) { is.close(); } if (osw != null) { osw.close(); } if (os != null) { os.close(); } if (socket != null) { socket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
  • 服務端
public class Server {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		InputStream is = null;
		InputStreamReader isr = null;
		BufferedReader br = null;
		OutputStream os = null;
		OutputStreamWriter osw = null;

		try {
			// 1.建立服務端的Socket物件
			serverSocket = new ServerSocket(5555);
			while (true) {
				// 2.監聽對應埠號下的所有應用
				socket = serverSocket.accept();
				// 3.獲取客戶端傳送過來的訊息
				is = socket.getInputStream();
				// 3.1將位元組流轉換為字元流進行讀操作
				isr = new InputStreamReader(is);
				// 3.2使用字元緩衝流處理讀取重複的問題
				br = new BufferedReader(isr);
				String readContent = null;
				while ((readContent = br.readLine()) != null) {
					System.out.println(readContent);
				}

				// 給客戶端返回資訊
				// 4.1 從Socket中獲取輸出流
				os = socket.getOutputStream();
				// 4.2 將位元組輸出流轉換為字元輸出流
				osw = new OutputStreamWriter(os);
				Scanner scan = new Scanner(System.in);
				String rebackContent = scan.nextLine();
				osw.write(rebackContent);
				osw.flush();
				socket.shutdownOutput();
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (osw != null) {
					osw.close();
				}
				if (os != null) {
					os.close();
				}
				if (br != null) {
					br.close();
				}
				if (isr != null) {
					isr.close();
				}
				if (is != null) {
					is.close();
				}
				if (socket != null) {
					socket.close();
				}
				if (serverSocket != null) {
					serverSocket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

結果

在這裡插入圖片描述