java複習第9天---9.2---網絡編程---TCP網絡編程

java複習第9天---9.2---網絡編程---TCP網絡編程


目錄




內容

1、概述

  TCP通信實現兩臺計算機之間的數據交互,通信的兩端,要嚴格區分爲客戶端(client)與服務端(Server)。

  • 兩端通信時不走:
    1. 服務端程序,需要實現啓動,等待客戶端的連接。
    2. 客戶端主動連接服務端,連接成功才能通信。服務端不可以主動連接客戶端。

  在Java中,提供了兩個類用於實現TCP通信程序:

  1. 客戶端:java.net.Socket類表示。創建Socket對象,向服務端發送連接請求,服務端響應請求,兩者建立連接,開始通信
  2. 服務端:java.net.ServerSocket類表示。創建ServerSocket對象,相當於開啓一個服務,並等待客戶端的連接。

2、Socket類

  Socket類:該類實現客戶端套接字,套接字指的是兩臺設備之間通訊的端點。

  • 常用構造方法
參數列表 描述
String host, int port 創建套接字並將其連接到指定主機的指定端口號。如果host爲null,則相當於指定地址爲回送地址。
  • 舉例:

      Socket client = new Socket("127.0.0.1", 666);
    
  • 常用成員方法

修飾符 返回值類型 方法名 參數列表 描述
public OutputStream getOutputStream 返回此套接字的輸出流
public InputStream getInputStream 返回此套接字的輸入流
public void close 關閉此套接字,釋放資源
  • 實現步驟:

    1. 創建客戶端Socket對象,構造方法綁定服務器的IP地址和端口號
    2. 調用Socket對象的getOutputStream方法,獲取網絡輸出流,把數據寫入網絡輸出流中,傳輸給服務器
    3. 調用Scoket對象的getInputStream方法,獲取網絡輸入流,從中讀取服務器返回的數據
    4. 關閉Socket對象,釋放資源
  • 注意事項:

    1. 客戶端和服務器進行交互,必須使用Socket中提供的網絡流,不能使用自己創建的流對象
    2. 當我們創建客戶端Socket對象時,就會區請求服務器,通過3次握手建立連接。當服務器沒有啓動時,會拋出連接異常;如果服務器啓動就看可以進行通信
  • 示例2-1:

      package net.tcp;
    
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.OutputStream;
      import java.net.Socket;
      import java.net.UnknownHostException;
    
    
      public class TestSocket1 {
      	public static void main(String[] args) throws UnknownHostException, IOException {
      		// 1、創建客戶端Socket對象,綁定服務器IP和端口號
      		Socket client = new Socket("127.0.0.1", 8888);
      		// 2、通過Socket對象的getOutputStream方法獲取網絡輸出流
      		OutputStream out = (OutputStream) client.getOutputStream();
      		// 3、通過網絡輸出流向服務器發送數據
      		out.write("你那裏有HelloWorld.java嗎".getBytes());
      		// 4、通過Socket對象的getInputStream獲取網絡輸入流
      		InputStream is = client.getInputStream();
      		// 5、使用網絡輸入流讀取服務器返回的數據
      		byte[] b = new byte[1024];
      		int len = is.read(b);
      		// 6、處理返回的數據
      		System.out.println(new String(b, 0, len));
      		// 7、關閉Socket對象,釋放資源
      		client.close();
      	}
      }
    
      測試結果:服務端沒有啓動
      Exception in thread "main" java.net.ConnectException: Connection refused: connect
      at java.net.DualStackPlainSocketImpl.connect0(Native Method)
      at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
      at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
      ...
    

3、服務端

  TCP通信服務器:等待客戶端連接,獲取客戶端發送的數據並處理,返回響應數據。
  java.net.ServerSocket次類實現服務端套接字。

  • 構造方法
參數列表 描述
int port 創建綁定到指定端口的套接字
  • 成員方法
修飾符 返回值類型 方法名 參數列表 描述
public Socket accept 偵聽連接到此的套接字並接收
  • 實現步驟:

    1. 創建ServerSocket服務端套接字,並通過構造方法綁定到指定的端口
    2. 調用ServerSocket 的accept方法等待客戶端套接字的連接並獲取套接字
    3. 調用上一步的得到的Socket對象的getInputStream獲取網絡輸入流
    4. 調用網絡輸入流的read方法獲取客戶端傳入的數據
    5. 處理客戶的傳入的數據,生成響應數據
    6. 調用Socket對象的getOutputStream獲取網絡輸出流
    7. 調用網絡輸出流的write方法,把相應數據返回給客戶端
    8. 關閉Socket和ServerSocket對象,釋放資源
  • 示例3-1:

      package io.stream.print;
    
      import java.io.IOException;
      import java.net.ServerSocket;
      import java.net.Socket;
    
      import java.io.InputStream;
      import java.io.OutputStream;
    
      public class TestServer1 {
      	public static void main(String[] args) throws IOException {
      		// 1. 創建ServerSocket服務端套接字,並通過構造方法綁定到指定的端口
      		ServerSocket server = new ServerSocket(8888);
      		// 2. 調用ServerSocket 的accept方法等待客戶端套接字的連接並獲取套接字
      		Socket socket = server.accept();
      		// 3. 調用上一步的得到的Socket對象的getInputStream獲取網絡輸入流
      		InputStream is =  socket.getInputStream();
      		// 4. 調用網絡輸入流的read方法獲取客戶端傳入的數據
      		byte[] b = new byte[1024];
      		int len = is.read(b);
      		// 5. 處理客戶的傳入的數據,生成響應數據
      		System.out.println(new String(b, 0, len));
      		String resp = "我這裏有,順着網線過來拿把";
      		// 6. 調用Socket對象的getOutputStream獲取網絡輸出流
      		OutputStream os = socket.getOutputStream();
      		// 7. 調用網絡輸出流的write方法,把相應數據返回給客戶端
      		os.write(resp.getBytes());
      		// 8. 關閉Socket和ServerSocket對象,釋放資源
      		socket.close();
      		server.close();
      	}
      }
      測試結果:
      客戶端輸出:我這裏有,順着網線過來拿把
      服務端輸出:你那裏有HelloWorld.java嗎
    

後記

本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785

前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
    後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章