網絡編程(二)

2.1 概述

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

兩端通信時步驟:

1.先啓動服務端,等待客戶端連接。

2.客戶端主動連接服務器端,連接成功才能通信,服務端不可以主動連接客戶端。

2.2 Socket類

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

構造方法:

public Socket(String host, int port):創建套接字對象並連接到指定主機的指定端口號。如果指定的host是null,則相當於指定地址爲回送地址。
構造舉例:
Socket client = new Socket("127.0.0.1", 6666);

成員方法:

public InputStream getInputStream():返回此套接字的輸入流。
如果此Socket具有相關聯的通道,則生成的InputStream的所有操作也關聯該通道。
關閉生成的InputStream也將關閉相關的Socket。
public OutputStream getOutputStream():返回此套接字的輸出流。
如果此Socket具有相關聯的通道,則生成的OutputStream的所有操作也關聯該通道。
關閉生成的OutputStream也將關閉相關的Socket。
public void close():關閉此套接字。
一旦一個Socket關閉,它不可再使用。
關閉此Socket也將關閉相關的InputStream和OutputStream。
public void shutdownOutput():禁用此套接字的輸出流。
任何先前寫出的數據將被髮送,隨後終止輸出流。

2.3 ServerSocket類

該類實現服務端套接字,等待客戶端的請求。

構造方法:

public ServerSocket(int port):使用該構造器方法創建ServerSocket對象,綁定到指定的端口號上,參數port是端口號。
構造舉例:
ServerSocket server = new ServerSocket(6666);

成員方法:

public Socket accept():偵聽並接受連接,返回一個新的Socket對象,用於和客戶端實現通信。該方法會一直阻塞直至建立連接。

2.4 簡單的TCP網絡程序

TCP通信分解:

1. 【服務端】啓動,創建ServerSocket對象,等待連接。

2. 【客戶端】啓動,創建Socket對象,請求連接。

3. 【服務端】接收連接,調用accept()方法,並返回一個Socket對象。

4. 【客戶端】通過Socket對象獲取OutputStream,向服務端寫入數據。

5. 【服務端】通過Socket對象獲取InputStream,讀取客戶端發送的數據。

6. 【服務端】通過Socket對象獲取OutputStream,向客戶端回寫數據。

7. 【客戶端】通過Socket對象獲取InputStream,解析回寫數據。

8. 【客戶端】釋放資源,斷開連接。

服務端實現:

package com.learning.ding;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTCP {
    public static void main(String[] args) throws IOException {
        System.out.println("服務端啓動,等待連接......");
        // 1.創建ServerSocket對象,綁定端口,開始等待連接
        ServerSocket server = new ServerSocket(6666);
        // 2.偵聽客戶端連接,返回Socket對象
        Socket socket = server.accept();
        // 3.通過socket獲取輸入流
        InputStream is = socket.getInputStream();
        // 4.一次性讀取數據
        // 創建字節數組
        byte[] b = new byte[1024];
        // 將讀取的數據裝入字節數組中
        int len = is.read(b);
        // 解析數組,打印字符串
        String msg = new String(b,0,len);
        System.out.println(msg);
        //===============回寫數據=================
        // 5.通過socket獲取輸出流
        OutputStream os = socket.getOutputStream();
        // 6.回寫數據
        os.write("你好客戶端,我是服務器".getBytes());
        // 7.關閉資源
        os.close();
        is.close();
        server.close();
    }
}

客戶端實現:

package com.learning.ding;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ClientTCP {
    public static void main(String[] args) throws IOException {
        System.out.println("客戶端發送數據");
        // 1.創建Socket,確定連接到哪個服務器
        Socket socket = new Socket("localhost", 6666);
        // 2.通過socket獲取輸出流
        OutputStream os = socket.getOutputStream();
        // 3.寫入數據
        os.write("你好服務器,我是客戶端".getBytes());
        //===============解析回寫==================
        // 4.通過Socket獲取輸入流對象
        InputStream is = socket.getInputStream();
        // 5.讀取數據
        byte[] b = new byte[1024];
        int len = is.read(b);
        System.out.println(new String(b, 0, len));
        // 6.關閉資源
        is.close();
        os.close();
        socket.close();
    }
}

 

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