TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
握手過程步驟如下(配wireshark分析圖):
1、客戶端發(fā)送SYN(SEQ=1022)報文給服務(wù)器端,客戶端進(jìn)入SYN_SEND狀態(tài)。
2、服務(wù)器端收到SYN報文,回應(yīng)一個SYN (SEQ=2032)ACK(ACK=1022+1)報文,服務(wù)器段進(jìn)入SYN_RECV狀態(tài)。
注意:服務(wù)器根據(jù)syn=1判斷客戶端請求建立連接,返回ack=1
3、客戶端收到服務(wù)器端的SYN報文,回應(yīng)一個ACK(ACK=2032+1)報文,進(jìn)入Established狀態(tài)。
注意:確認(rèn)ack number是否與第一次發(fā)送(seq number+1)相等,并ack=1。正確,發(fā)送ack number = seq number(服務(wù)器順序編號)+1
服務(wù)器端:確認(rèn)ack number是否與第一次發(fā)送(seq number+1)相等,并ack=1。正確,連接建立。
連接建立完成,可以傳送數(shù)據(jù)了。
服務(wù)器代碼:
package com.wangshihai.util;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;/** * * @ClassName: TCPServerSocket* @Description: TODO(tcp server socket類型)* @author 技術(shù)雜貨鋪 wangshihai.com* @date 2015年7月25日 上午8:49:54* */public class TCPServerSocket { private static ServerSocket serverSocket; private static Socket socket; /** * * @Title: startServerSocket * @Description: TODO(根據(jù)端口,綁定本機(jī)地址,建立serversocket) * @param @param bindPort 綁定端口 * @param @param bindIp 綁定地址 * @param @param blocknumber 允許客戶端連接的個數(shù) * @return void 返回類型 * @throws */ public static void startServerSocket(int bindPort,String bindIp,int blocknumer){ try { serverSocket = new ServerSocket(bindPort,blocknumer,InetAddress.getByName(bindIp)); socket = serverSocket.accept(); System.out.println('連接的客戶端地址和端口為:'+socket.getRemoteSocketAddress()); } catch (IOException e) { e.printStackTrace(); } } /** * * @Title: main * @Description: TODO(測試防范) * @param @param args 設(shè)定文件 * @return void 返回類型 * @throws */ public static void main(String[] args) { startServerSocket(6000,'192.168.2.100',3); }}
客戶端代碼:
package com.wangshihai.util;import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;/** * * @ClassName: TCPClientSocket* @Description: TODO(連接server socket 工具類)* @author 技術(shù)雜貨鋪 wangshihai.com* @date 2015年7月25日 上午9:17:33* */public class TCPClientSocket { private static Socket socket; /** * * @Title: connectServerSocket * @Description: TODO(根據(jù)服務(wù)器的IP和端口,建立socket連接) * @param @param bindPort 訪問的服務(wù)器端口 * @return void 返回類型 * @throws */ public static void connectServerSocket(int bindPort){ InetAddress inetAddress; try { //根據(jù)字符串IP獲取inetaddress對象 inetAddress = InetAddress.getByName('192.168.2.100'); socket = new Socket(inetAddress, bindPort); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * * @Title: main * @Description: TODO(測試方法) * @param @param args 設(shè)定文件 * @return void 返回類型 * @throws */ public static void main(String[] args) { int bindPort = 6000; connectServerSocket( bindPort); }}