[C# 网络编程系列]:TCP编程
前言
前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来介绍下传输层协议——TCP协议,主要介绍下TCP协议的工作过程和基于TCP协议的一个简单的通信程序,下面就开始本专题的正文了。
一、TCP的工作过程
首先TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议。TCP的工作过程可以分为三个阶段:一、连接的建立; 二、传输数据; 三、断开连接,下面就对这三个过程分别介绍下:
1.1 连接的建立
TCP的连接建立就像打电话一样, 我们打电话时,拨一个号码的号码并不是立即就可以接通的,期间会有一个“嘟 嘟”的呼叫过程, 这就好比是TCP协议的连接的建立阶段。当我们用TCP编写的程序,必须先建立TCP连接。TCP协议的连接建立通过三次握手来完成的,下面是在网上找的一张TCP三次握手的图片:
下面就对这三次握手简单的介绍:
第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_Send状态,等待服务器确认
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=x+1),同时自己也发送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_Recv状态
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完毕,客户端和服务器进入Established(建立)状态,完成三次握手。
简单理解三次握手就是发送一个检验包给对方然后互相确认,双方都接到确认的一个信号时,这时候双方就建立了连接(就像我们打电话时,如果没人说话时就会说下 “喂”,说这句“喂” 也就是希望得到对方的一个确认,虽然这里双方已经建立了连接的,这里只是更形象的说明下三次握手的过程)。
1.2 传输数据
双方建立了连接,即在双方建立了一个通信通道(就像一座桥一样,在两端建立了一个通路,用桥来比喻通信通道主要是因为最近有一则新闻:哈尔滨阳明滩大桥坍塌事件),建立连接之后,当然是传输我们需要传输的数据到对方的,这里就开始简单介绍下传输数据的过程。
利用TCP传输数据时,数据是以字节流的形式进行传输,客户端与服务器端建立连接后,发送方需要先将发送的数据转换为字节流,然后将其发送给对方,发送数据时,可以通过程序不断地将数据流陆续写入TCP的发送缓冲中,然后TCP自动从发送缓冲中提取一定量的数据,将其组成TCP报文段发送到IP层,再通过IP层(也就是网络层)之下的网络接口发送出去;接受端从IP层接收到TCP报文段后,将其暂时保存在接受缓冲中,然后我们通过程序依次读取接受缓冲中的数据,从而达到相互通信的目的(简单的说就发送方把数据转换为数据流,再把数据流存储在发送缓冲中,然后传输层低层的协议从发送缓冲中读取数据把数据发送出去,然后接收端从底层接受到数据把数据存储在接收端的缓冲中,然后我们写的程序只是从缓冲中依次读取数据,然后显示出来,在客户端我们写代码做的事情是把数据写入Write写入发送端的缓冲中,然后服务器端(接收端)用Read方法在自己的缓冲中读取数据,用一句话概括,TCP的传输就是对数据的写——读操作)括号中的内容只是我个人理解,因为这样我感觉理解起来比较容易,对于刚开始接触TCP的朋友可以这样理解,然后再一句句话去扩展。
1.3 断开连接
发送完数据之后,最后就是断开连接了,下面是网上断开的连接的一张图片(断开一个连接需要经过四次握手):
TCP的工作过程就分为上面三个过程,TCP编程是作为上层应用编程的基础,就像之前专题中基于HTTP协议的Web服务器,Web浏览器,其传输层都用的是TCP协议进行传输的,还有基于FTP(文件传输协议),IMAP(交互式邮件存取协议) POP3(邮局协议的第3个版本) 和SMTP(简单邮件传输协议)的网络应用其传输层都用的是TCP协议,而不是UDP等其他传输层协议。
二、基于TCP协议的简单通信程序
这里简单实现了一个客户端与服务器间的通信程序,核心代码为:
客户端连接服务器端代码:
private void btnConnect_Click(object sender, EventArgs e){// 通过一个线程发起请求,多线程Thread connectThread = new Thread(ConnectToServer);connectThread.Start();}// 连接服务器方法,建立连接的过程private void ConnectToServer(){try{// 调用委托statusStripInfo.Invoke(showStatusCallBack, "正在连接...");if (tbxserverIp.Text == string.Empty || tbxPort.Text == string.Empty){MessageBox.Show("请先输入服务器的IP地址和端口号");}IPAddress ipaddress = IPAddress.Parse(tbxserverIp.Text);tcpClient = new TcpClient(); tcpClient.Connect(ipaddress, int.Parse(tbxPort.Text)); // 延时操作Thread.Sleep(1000);if (tcpClient != null){statusStripInfo.Invoke(showStatusCallBack, "连接成功");networkStream = tcpClient.GetStream();reader = new BinaryReader(networkStream);writer =new BinaryWriter(networkStream);}}catch{statusStripInfo.Invoke(showStatusCallBack,"连接失败");Thread.Sleep(1000);statusStripInfo.Invoke(showStatusCallBack,"就绪");}}
客户端发送消息的代码:
// 发送消息private void btnSend_Click(object sender, EventArgs e){Thread sendThread = new Thread(SendMessage);sendThread.Start(tbxMessage.Text);}private void SendMessage(object state){statusStripInfo.Invoke(showStatusCallBack, "正在发送...");try{writer.Write(state.ToString());Thread.Sleep(5000);writer.Flush();statusStripInfo.Invoke(showStatusCallBack, "完毕");tbxMessage.Invoke(resetMessageCallBack, null);lstbxMessageView.Invoke(showMessageCallback, state.ToString());}catch{if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){tcpClient.Close();}statusStripInfo.Invoke(showStatusCallBack, "断开了连接");}}
服务器端接受开始监听客户端请求的代码:
// 开始监听private void btnStart_Click(object sender, EventArgs e){tcpLister = new TcpListener(ipaddress,Port);tcpLister.Start();// 启动一个线程来接受请求Thread acceptThread =new Thread(acceptClientConnect);acceptThread.Start();}// 接受请求private void acceptClientConnect(){statusStripInfo.Invoke(showStatusCallBack,"正在监听");Thread.Sleep(1000);try{statusStripInfo.Invoke(showStatusCallBack,"等待连接");tcpClient = tcpLister.AcceptTcpClient();if (tcpLister != null){statusStripInfo.Invoke(showStatusCallBack,"接受到连接");networkStream = tcpClient.GetStream();reader = new BinaryReader(networkStream);writer = new BinaryWriter(networkStream);}}catch{statusStripInfo.Invoke(showStatusCallBack, "停止监听");Thread.Sleep(1000);statusStripInfo.Invoke(showStatusCallBack, "就绪");}}
现在看看运行的结果:
首先先启动服务器然后点开始监听,此时线程会堵塞,直到接受到一个连接请求位置
然后运行客户端,在IP地址和端口处输入服务器端的IP地址和端口号,点击连接服务器按钮后的界面如下:
通过接受按钮和发送按钮来实现双方的通信,实现界面如下:
三、总结
到这里本专题的内容将的差不多了, 本专题主要介绍了基于TCP协议工作过程和在net平台下自定义了一个简单通信的程序,希望本专题可以给那些初次接触TCP协议的朋友一些帮助,(大牛们应该直接可以闪过的),在后面的专题我将和大家分享UDP编程,讲完UDP编程后将结合这两章的内容实现一个类似QQ的即时聊天的工具,希望这些对大家有帮助,如果大家有任何问题和有感兴趣的专题需要了解的,可以给我留言,在之后的文章都会和大家来分享。
下面是本程序源代码:
http://files.cnblogs.com/zhili/%E7%AE%80%E5%8D%95%E9%80%9A%E4%BF%A1%E7%A8%8B%E5%BA%8F.zip
[C# 网络编程系列]:TCP编程相关推荐
- 【Linux】网络篇二--TCP编程
网络篇二--TCP编程 一.TCP编程实现 1.编程步骤 2.socket函数 3.bind函数 4.地址转换函数 5.listen函数 6.accept函数 7.connect函数 8.send函数 ...
- C语言网络编程:TCP编程模型
编程模型 TCP编程模型如下 TCP服务器的工作过程如下: 服务器创建一个专门的"文件描述符"来监听来自客户端的"三次握手",然后建立链接 链接建立成功后,服务 ...
- Java网络编程(网络基础(IP端口号网络通信协议)、TCP编程、UDP编程和URL编程原理以及常用方法的实例)
网络编程 网络基础概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信息.共享硬件.软件.数据信息等 ...
- Linux网络编程 之 TCP编程(七)
目录 1. TCP客户端 - 核心函数 - 完整的TCP客户端程序 2. TCP服务端 - 核心函数 - 完整的TCP客户端程序 TCP编程的核心步骤和流程: 1. TCP客户端 核心函数: 创建一个 ...
- 【RDMA】RDMA编程和TCP编程的区别|bRPC
目录 RDMA RDMA和TCP编程差别 Socket API Verbs API 百度bRPC RDMA网卡和传统网卡对比说明 bandaoyu,本文随时更新:https://blog.csdn.n ...
- 【Linux网络编程】TCP编程
00. 目录 文章目录 00. 目录 01. TCP概述 02. TCP特点 03. TCP中CS架构 04. TCP相关函数 05. TCP服务端示例 06. TCP客户端示例 07. 附录 01. ...
- python网络-Socket之TCP编程(26)
一.TCP简介 1.TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TC ...
- Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...
TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...
- 网游中的网络编程系列1:UDP vs. TCP
原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...
- [C# 网络编程系列]专题五:TCP编程
前言 前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来介绍下传输层协议--TCP协议,主要介绍下TCP协议的工作过程和基于TCP协议的一个简单的通信程序,下面就开始本专题的正文了. ...
最新文章
- 整理前端css/js/jq常见问题及解决方法(3)
- Python--一些重要的小tips【持续更新】
- Kubernetes实用技巧
- Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理)
- springboot test_精益求精!Spring Boot 知识点全面回顾,带你重新细读源码!
- python优雅编程视频_日常 Python 编程优雅之道
- python对象转为字符串
- 浅谈管理软件的功能与作用-—以Nvisual综合布线可视化运维管理平台和进销存管理软件为例
- vue uniapp如何实现横向滚动周历,横向滚动一周日历
- 案例▍Python实战 爬取万条票房数据分析2019春节档电影状况
- ip地址查询 免费 接口 linux 外网地址查询
- Python打印表格
- I have a dream
- 3D Experience — 产品协同研发平台
- 微信小程序面试题(day08)
- 《内网安全攻防:渗透测试实战指南》读书笔记(八):权限维持分析及防御
- Excel的F4键妙用,赶紧来学一下吧
- C语言《数据结构》——图的概念和创建,遍历
- 门电路图对照表——国标、IEEE、标准符号对照表
- 北京智汇云舟科技:智慧城市实时实景数字孪生技术
热门文章
- 最小生成树 POJ - 3522(枚举边最小生成树)
- xp系统计算机无法用搜索功能,XP系统搜索功能无法使用的六种解决方法
- wacom怎么调压感_wacom手绘板_wacom手绘板的钢笔压力怎么设置?
- xml property标签注入一个类变量_java开发两年,连Spring的依赖注入的方式都搞不清楚,你工作可能有点悬!...
- 时序轮转的意思_《九州仙魔志》-烛龙:凡人的昼夜轮转,都在它眼睛开合之间...
- 约数定理和分解质因数
- 中国剩余定理----51nod1079
- hdu1257----贪心最长上升子序列(最少拦截系统)
- 不调用python函数实现直方图均衡化_数字图像处理之直方图均衡化
- 计算机网络中的mac全称,计算机网络中MAC地址与IP地址