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