A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lixiaojing 中级黑马   /  2015-5-21 11:19  /  322 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

6、socket中TCP的四次握手释放连接详解
[size=13.63636302948px]    上面介绍了socket中TCP的三次握手建立过程,及其涉及的socket函数。现在我们介绍socket中的四次握手释放连接的过程,请看下图:
                                                                                                                                                                                                           图2、socket中发送的TCP四次握手
[size=13.63636302948px]     图示过程如下:
  • 某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
  • 另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
  • 一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
  • 接收到这个FIN的源发送端TCP对它进行确认。

[size=13.63636302948px]这样每个方向上都有一个FIN和ACK。
[size=13.63636302948px]
[size=13.63636302948px]7、TCP服务器端
[size=13.63636302948px]    在Socket编程中,服务器端远比客户端要复杂得多。服务器端的工作就是建立一个通信终端,被动的等待客户端的连接。下面这个服务器端程序的示例的作用是:监听从控制台输入获取的端口号,并且将客户端发送过来的消息,再发送回去。
[size=13.63636302948px]   代码如下:
[size=13.63636302948px]import java.io.IOException;
[size=13.63636302948px]import java.io.InputStream;
[size=13.63636302948px]import java.io.OutputStream;
[size=13.63636302948px]import java.net.ServerSocket;
[size=13.63636302948px]import java.net.Socket;
[size=13.63636302948px]import java.net.SocketAddress;
[size=13.63636302948px]import java.text.MessageFormat;

[size=13.63636302948px]public class TCPEchoServer {
[size=13.63636302948px]        private static final int BUFSIZE = 32;

[size=13.63636302948px]        public static void main(String[] args) throws IOException {
[size=13.63636302948px]                // 从控制台获取需要监听的端口号
[size=13.63636302948px]                if (args.length != 1)
[size=13.63636302948px]                        throw new IllegalArgumentException("Parameter(s):<Port>");
[size=13.63636302948px]                // 获取端口号
[size=13.63636302948px]                int servPort = Integer.parseInt(args[0]);
[size=13.63636302948px]                // 实例化一个ServerSocket对象实例
[size=13.63636302948px]                ServerSocket servSocket = new ServerSocket(servPort);
[size=13.63636302948px]                System.out.println(MessageFormat.format("开始启动监听,端口号:{0}", args[0]));
[size=13.63636302948px]                // 初始接收数据的总字节数
[size=13.63636302948px]                int recvMsgSize;
[size=13.63636302948px]                // 接收数据的缓冲区
[size=13.63636302948px]                byte[] receiveBuf = new byte[BUFSIZE];
[size=13.63636302948px]                // 循环迭代,监听端口号,处理新的连接请求
[size=13.63636302948px]                while (true) {
[size=13.63636302948px]                        // 阻塞等待,每接收到一个请求就创建一个新的连接实例
[size=13.63636302948px]                        Socket clntSocket = servSocket.accept();
[size=13.63636302948px]                        // 获取连接的客户端的SocketAddress
[size=13.63636302948px]                        SocketAddress AddressclientAddress = clntSocket.getRemoteSocketAddress();
[size=13.63636302948px]                        // 打印输出连接客户端地址信息
[size=13.63636302948px]                        System.out.println("Handlingclientat" + AddressclientAddress);
[size=13.63636302948px]                        // 从客户端接收数据的对象
[size=13.63636302948px]                        InputStream in = clntSocket.getInputStream();
[size=13.63636302948px]                        // 向客户端发送数据的对象
[size=13.63636302948px]                        OutputStream out = clntSocket.getOutputStream();
[size=13.63636302948px]                        // 读取客户端发送的数据后,再发送到客户端
[size=13.63636302948px]                        while ((recvMsgSize = in.read(receiveBuf)) != -1) {
[size=13.63636302948px]                                out.write(receiveBuf, 0, recvMsgSize);
[size=13.63636302948px]                        }
[size=13.63636302948px]                        // 客户端关闭连接时,关闭连接
[size=13.63636302948px]                        System.out.println("客户端关闭连接");
[size=13.63636302948px]                        clntSocket.close();
[size=13.63636302948px]                }
[size=13.63636302948px]        }
[size=13.63636302948px]}
[size=13.63636302948px]

评分

参与人数 1黑马币 +25 收起 理由
s877705500 + 25 淡定

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马