TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 三次握手协议建立连接图 握手过程步骤如下(配wireshark分析图): 1、客户端发送SYN(SEQ=1022)报文给服务器端,客户端进入SYN_SEND状态。 2、服务器端收到SYN报文,回应一个SYN (SEQ=2032)ACK(ACK=1022+1)报文,服务器段进入SYN_RECV状态。 注意:服务器根据syn=1判断客户端请求建立连接,返回ack=1 3、客户端收到服务器端的SYN报文,回应一个ACK(ACK=2032+1)报文,进入Established状态。 注意:确认ack number是否与第一次发送(seq number+1)相等,并ack=1。正确,发送ack number = seq number(服务器顺序编号)+1 服务器端:确认ack number是否与第一次发送(seq number+1)相等,并ack=1。正确,连接建立。 连接建立完成,可以传送数据了。 java测试源码(只有握手部分)服务器代码:
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 技术杂货铺 wangshihai.com* @date 2015年7月25日 上午8:49:54* */public class TCPServerSocket { private static ServerSocket serverSocket; private static Socket socket; /** * * @Title: startServerSocket * @Description: TODO(根据端口,绑定本机地址,建立serversocket) * @param @param bindPort 绑定端口 * @param @param bindIp 绑定地址 * @param @param blocknumber 允许客户端连接的个数 * @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 设定文件 * @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 技术杂货铺 wangshihai.com* @date 2015年7月25日 上午9:17:33* */public class TCPClientSocket { private static Socket socket; /** * * @Title: connectServerSocket * @Description: TODO(根据服务器的IP和端口,建立socket连接) * @param @param bindPort 访问的服务器端口 * @return void 返回类型 * @throws */ public static void connectServerSocket(int bindPort){ InetAddress inetAddress; try { //根据字符串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 设定文件 * @return void 返回类型 * @throws */ public static void main(String[] args) { int bindPort = 6000; connectServerSocket( bindPort); }} |
|
来自: 昵称29273511 > 《待分类》