文章目錄
- 前言
- 一、TCP通信概述
- 二、TCP的特點
- 三、TCP通信的實作原理
- 四、TCP通信原理實作(代碼演示)
- 總結
前言
今天繼續這幾天對于Java網路編程的一個小尾巴——TCP通信原理
一、TCP通信概述
TCP協議用來控制兩個網路設備之間的點對點通信,兩端設備按作用分為客服端和服務端,服務端為客戶端提供服務,通常等待客服端的請求訊息,有客服端請求到達之后,及時提供服務和回傳回應訊息;客戶端向服務端主動發出請求,并接受回應訊息,
1、首先啟動服務端程式,并開始等待網路中的客戶請求,然后客服端主動向服務端發出連接請求,服務端接收到客戶端的連接請求后,將和客戶端之間建立一個穩定的TCP/IP通信的連接,
2、現在客戶端將向服務端主動發出請求,服務端接受客戶端訊息,并及時回傳回應訊息,這是通過IO流(位元組流)實作的,
3、通信完成后,由客戶端主動關閉和服務端之間的連接;如果客戶端未主動關閉和服務段之間的連接,服務端在等待指定的時間后將關閉這個連接,

二、TCP的特點
1、TCP是一種面向連接的保證可靠傳輸的協議,通過TCP協議傳輸,得到的是一個有順序且無差錯的資料流,
2、因為TCP通信兩端的行為是不同的,所以在客戶端使用socket類實作通信,而服務器使用ServerSocket實作通信,
3、網路通信不是必須有兩個物理主機,而是需要有兩個不同的socket就可以通信,列如,在同一主機上IP地址是相同的,但是使用不同的埠創建不同的socket,這樣的兩個socket之間也是可以實作TCP/IP的通信,
三、TCP通信的實作原理
無論一個TCP通信程式的功能多么齊全,程式多么復雜,其基本結構都是一樣的,都包括以下四個基本步驟:
1、在服務端指定一個埠號來創建serverSocket,并使用accept方法進行偵聽,這將阻塞服務器執行緒,等待用戶請求,
2、在客戶端指定服務的主機IP和埠號來創建socket,并連接服務端serverSocket,此時服務端accept方法被喚醒,同時回傳一個和客戶端通信的socket,
3、在客戶端和服務端分別使用socket來獲取網路通信輸入/輸出流,并按照一定的通信協議對socket進行讀/寫操作,
4、通信完成后,在客戶端和服務端中反別關閉socket,
四、TCP通信原理實作(代碼演示)
代碼如下(客戶端):
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
// 獲取本機IP地址
InetAddress inetAddress = InetAddress.getLocalHost();
String ip = inetAddress.getHostAddress();
// 設定發送的埠號
int port = 8765;
// 創建socket物件
Socket socket = new Socket(ip,port);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello".getBytes());
outputStream.flush();
// 獲取服務端回傳的資訊
InputStream inputStream = socket.getInputStream();
byte[] byteArray = new byte[1024*50];
int length = inputStream.read(byteArray);
String replyMessage = new String(byteArray,0,length);
System.out.println("客戶端收到的訊息:"+replyMessage);
// 關閉資源
socket.close();
}
}
代碼如下(服務端):
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
// 設定埠號(根據客戶端的埠號設定)
int port = 8765;
// 創建ServerSocket物件
ServerSocket serverSocket = new ServerSocket(port);
// 物件調accept()方法
Socket socket = serverSocket.accept();
// socket物件呼叫getInputStream()
InputStream inputStream = socket.getInputStream();
// 設定緩沖區
byte[] byteArray = new byte[1024*50];
// 獲取實際資料及資料的大小
int len = inputStream.read(byteArray);
String message = new String(byteArray,0,len);
// 獲取發送者的IP地址
String ip = socket.getInetAddress().getHostAddress();
System.out.println("收到來自"+ip+"的訊息,內容為:"+message);
// 使用輸出流給發送者發送一條成功接收的資訊
OutputStream outputStream = socket.getOutputStream();
outputStream.write("successful".getBytes());
// 只要涉及管道的都建議重繪一下
outputStream.flush();
// 資源關閉
socket.close();
serverSocket.close();
}
}
代碼如下(客戶端測驗輸出):
收到來自192.168.127.1的訊息,內容為:hello
代碼如下(服務端測驗輸出):
客戶端收到的訊息:successful
總結
TCP和UDP的接收方和發送方啟動測驗先后是一樣的都是先啟動接收方,只不過在TCP中的接收方叫服務端,所以在測驗中得先啟動服務端,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265661.html
標籤:java
