转:【专题五】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协议的简单通信程序
这里简单实现了一个客户端与服务器间的通信程序,核心代码为:
客户端连接服务器端代码:
#region TcpClient客户端的操作
static TcpClient tcpClient;
static BinaryReader reader;
static BinaryWriter writer; /// <summary>
/// 使用TcpClient连接服务器端
/// </summary>
private static void UseTcpClientConnectToServer()
{
Thread connectThread = new Thread(new ThreadStart(() =>
{
try
{
// IPAddress.Loopback获得本机的Ip环回地址,即127.0.0.1
IPAddress localAddress = IPAddress.Loopback;
//IPAddress localAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; // IPAddress.Loopback获得本机的Ip地址
//IPAddress localAddress = IPAddress.Any; // IPAddress.Any获得Ip地址0.0.0.0 // 创建可以访问的断点,49155表示端口号,如果这里设置为0,表示使用一个由系统分配的空闲的端口号
IPEndPoint localEndPoint = new IPEndPoint(localAddress, ); // 建立连接
tcpClient = new TcpClient();
tcpClient.Connect(localEndPoint);
//tcpClient.Connect(localAddress, 49155); if (tcpClient != null)
{
NetworkStream networkStream = tcpClient.GetStream();
reader = new BinaryReader(networkStream);
writer = new BinaryWriter(networkStream);
}
}
catch
{
throw;
}
}));
connectThread.Start();
} /// <summary>
/// 使用TcpClient发送消息
/// </summary>
private static void UseTcpClientSendMessage(string message)
{
Thread sendThread = new Thread(new ParameterizedThreadStart((msg) =>
{
try
{
writer.Write(msg.ToString());
writer.Flush();
}
catch
{
DisconnectTcpClient();
}
}));
sendThread.Start(message);
} /// <summary>
/// 使用TcpClient接收消息
/// </summary>
private static void UseTcpClientReceiveMessage(string message)
{
Thread receiveThread = new Thread(new ThreadStart(() =>
{
try
{
string receivemessage = reader.ReadString();
}
catch
{
DisconnectTcpClient();
}
}));
receiveThread.Start();
} /// <summary>
/// 断开连接TcpClient
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void DisconnectTcpClient()
{
if (reader != null)
{
reader.Close();
}
if (writer != null)
{
writer.Close();
}
if (tcpClient != null)
{
// 断开连接
tcpClient.Close();
}
}
#endregion
三、总结
到这里本专题的内容将的差不多了, 本专题主要介绍了基于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
转自:http://www.cnblogs.com/zhili/archive/2012/08/25/TCP.html
转:【专题五】TCP编程的更多相关文章
- [C# 网络编程系列]专题五:TCP编程
转自:http://www.cnblogs.com/zhili/archive/2012/08/25/2656840.html 前言 前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来 ...
- 专题五:TCP编程
前言 前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来介绍下传输层协议——TCP协议,主要介绍下TCP协议的工作过程和基于TCP协议的一个简单的通信程序,下面就开始本专题的正文了. ...
- 五十四、linux 编程——TCP 编程模型
54.1 编程模型介绍 54.1.1 TCP 客户端服务器编程模型 客户端调用序列 调用 socket 函数创建套接字 调用 connect 连接服务器端 调用 I/O 函数(read/write) ...
- python中的TCP编程学习
今天看了一下关于python的TCP编程. 发现思路和其他语言(比如java)思路基本上差点儿相同. 先看client.基本过程例如以下: 第一步:创建一个socket 第二步:建立连接 第三步:发送 ...
- 20155324 《Java程序设计》实验五 网络编程与安全
20155324 <Java程序设计>实验五 网络编程与安全 实验内容 任务一 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面功能中获取的表达式中 ...
- 20165317Java实验五 网络编程与安全
实验五 网络编程与安全 一.中缀转后缀 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.ja ...
- 20155326 《Java程序设计》实验五网络编程与安全实验报告
20155326 <Java程序设计>实验五网络编程与安全实验报告 实验内容 任务一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...
- #《JAVA程序设计》 20155214 实验五 网络编程与安全
<JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...
- 20155301 《Java程序设计》实验五网络编程与安全
20155301 <Java程序设计>实验五网络编程与安全 实验内容 实验1: 两人一组结对编程:参考http://www.cnblogs.com/rocedu/p/6766748.htm ...
随机推荐
- c语言递归函数的调用
int fun(); int main() { int n,sum=0,i; scanf("%d",&n); for (i=1; i<=n; i++) { sum+= ...
- SVN安装部署
svn安装版本用的是1.8 SVN属于功能性软件,yum安装即是最佳实践. 安装svn yum install subversion 检查svn是否安装完毕 [root@mysql ~]# rpm - ...
- dxCameraControl控件(拍照)
拍照演示 主要属性设置 Active:True DeviceIndex:设备号,默认为0 其他方法 procedure Capture; //捕获 procedure Pause; //暂停 proc ...
- 20165236 2017-2018-2《Java程序设计》课程总结
20165236 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总: 1.我期望的师生关系 2.学习基础和C语言基础调查 3.20165236郭金涛 预备作业3 L ...
- Object 转 json 工具类
/** * 把数据对象转换成json字符串 DTO对象形如:{"id" : idValue, "name" : nameValue, ...} * 数组对象形如 ...
- JavaScript 全栈工程师培训教程 - 阮一峰
http://www.ruanyifeng.com/blog/2016/11/javascript.html https://github.com/ruanyf/jstraining 我现在的技术方向 ...
- [vue]data数据属性及ref获取dom
data项的定义 this.$refs获取dom 获取不到数据 这样中转下才ok 小结: data里不能用this.$ref. 另外使用visjs时候 view-source:http://visjs ...
- @Value("#{}") 和 @Value("{}")
1 @Value("#{}") SpEL表达式 @Value("#{}") 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法.当然还 ...
- Python的Pandas库简述
pandas 是 python 的数据分析处理库import pandas as pd 1.读取CSV.TXT文件 foodinfo = pd.read_csv("pandas_study. ...
- securecrt配置经验总结(home.key和颜色)
还是用securecrt portable方便,配好了,换个机器,打包拷贝过去就行了.不用从两个地方去打包. 参考了网上的资料,颜色参考http://www.jackxiang.com/post/58 ...