一、原理及意义
(1) TCP是什么
TCP是一种传输控制协议;是一种面向连接的,可靠的、基于字节流的传输层通讯协议,由IETF的RFC793 定义.它与UDP一样,完成第四层传输层所指定的功能与职责.
(2) TCP能做什么
1) 聊天消息传输,推送
2) 单人语音,视频聊天
3) TCP除了不能进行广播和多播以外,几乎所有UDP所有能做的,TCP都能做.
(3) TCP建立可靠连接
1) 用来建立连接的三次握手
三次握手的工作流程:
- 客户发发送SYN(发起连接命令)位和一个随机值x发送至服务端.
- 服务端将客户端发送过来的随机值x+1,并在原有的基础上添加一个ACK(回送命令),和一个随机值y,发送至客户端
- 客户端收到服务端发送过来的消息后,去除SYN位,并将ACK和随机值y+1,x+1回送到服务端.
2) 用来断开连接的四次挥手
四次挥手工作流程:
- 客户端发送一个FIN(断开命令),并携带一个随机值u发送到服务端
- 服务端发一个ACK回送命令,并将客服端发送过来的随机值u+1和服务端到随机值v发送到客户端,此时客户端停止输出连接,但是输入连接尚未断开
- 服务端会将服务器未传送完成的数据进行传送完毕,数据传送完毕后,服务端会发送一个FIN命令和ACK命令,并将随机值u+1再次返回,携带一个新的随机值w
- 客户端收到后,会将ACK命令和随机值w+1,u+1回送到服务端,表示断开连接完成
二、流程图
三、代码
(1) 服务端代码:
package socket.SocketDemo_TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
/**
* Created by lifuqing on 2019/4/10 10:26
* Email : daqing.lee@hotmail.com
*/
public class Server {
private static final int PORT = 20000;
public static void main(String[] args) throws IOException {
ServerSocket server = createServerSocket();
initServerSocket(server);
// 绑定到本地端口上
server.bind(new InetSocketAddress(Inet4Address.getLocalHost(), PORT), 50);
System.out.println("服务器准备就绪~");
System.out.println("服务器信息:" + server.getInetAddress() + " P:" + server.getLocalPort());
// 等待客户端连接
for (; ; ) {
System.out.println("第一");
// 得到客户端
Socket cl