TCP实验报告
- 格式:docx
- 大小:169.97 KB
- 文档页数:14
本科学生实验报告(一)姓名:学院:专业:信息安全班级:信息安全实验课程名称:TCP/IP协议原理与分析实验时间2013年4月10日指导教师及职称实验成绩开课时间:2012-2013学年第二学期甘肃政法学院实验管理中心印②Ping new_ip_address,确保成功③ARP -a→记录ARP缓冲区新增项目分析:总结ARP的作用,分析ARP缓冲区的功能。
硬件类型:Ethernet 协议类型:IP协议分析:根据Packet #1条目,回答以下问题1)发送这个数据包的源IP地址是什么?4、IP流量分析目标:分析IP数据包结构。
分析:根据Packet #18条目,回答以下问题生存时间路由环路中的路由器之间无限期转发。
如果允许路由环路继续,网络将会因永远也无法到达目的地的数据包而堵塞。
在每一跳处减少 TTL 值可以确保该值最终变为零并且丢弃 TTL 字段过期的数据包。
4、在IP首部后面跟随了多少数据(以字节为单位)?20 bytes数据5、必要时这个数据包能够分段吗?不能分段6、跟随在IP首部后面的是什么协议?TCP协议7、这个应用程序请求的ToS是什么?OXOO根据Packet #252条目,回答以下问题1)这个IP数据包使用什么帧类型?Ethernet Ⅱ帧类型2)这个IP数据包的长度是多少?3)这个IP数据包剩余的寿命是多少?路由器将如何处理?数据包每经一个路由器(即每一跳)处理,TTL 值便至少减一。
当该值变为零时,路由器会丢弃数据包并从网络数据流量中将其删除。
4)在IP首部后面跟随了多少数据(以字节为单位)?20 bytes数据。
网络协议分析实验一、实验目的通过使用协议分析软件,对通信系统的通信过程进行监控、分析,以了解通信协议的工作过程。
二、实验内容利用协议分析软件(如:Wireshark)跟踪局域网报文(如条件允许也可跟踪多种局域网协议报文),实验内容如下:将安装协议分析软件的PC接入以太网中,跟踪PC之间的报文,并存入文件以备重新查。
设置过滤器过滤网络报文以检测特定数据流。
利用协议分析软件的统计工具显示网络报文的各种统计信息。
三、实验步骤1、在PC中安装协议分析软件(如:Wireshark)。
具体安装过程详见附录:Wireshark用户指南。
2、启动Wireshark协议分析软件,选择抓包菜单项启动实时监视器,开始实时跟踪显示网络数据报文。
可根据系统提示修改显示方式,详见附录:Wireshark用户指南。
3、调出跟踪存储的历史报文,选择有代表性的ETHERNET,IEEE802.3,IP,ICMP,TCP,UDP报文,对照有关协议逐个分析报文各字段的含义及内容。
EHERNET报文格式IEEE802.3报文格式IP报文格式4、设置过滤器属性,如目的地址,源地址,协议类型等。
如过滤不需要的网络报文,过滤器允许设置第二层,第三层或第四层的协议字段。
过滤器有两种工作方式:1)捕获前过滤:协议分析软件用过滤器匹配网络上的数据报文,仅当匹配通过时才捕获报文。
2)捕获后过滤:协议分析软件捕获所有报文,但仅显示匹配符合过滤条件的报文。
选择统计菜单项可以显示网络中各种流量的统计信息,如:关于字节数,广播中报文数,出错数等。
UDP 客户/服务器实验一、实验目的本实验目的是使用因特网提供的UDP 传输协议,实现一个简单的UDP 客户/服务器程序,以了解传输层所提供的UDP 服务的特点,应用层和传输层之间的软件接口风格,熟悉socket 机制和UDP 客户端/服务器方式程序的结构。
二、实验内容本实验为UDP 客户/服务器实验。
实验内容:UDP echo 客户/服务器程序的设计与实现。
TCP协议分析实验报告实验4传输层协议分析一、实验目的1、学习3CDaemon FTP服务器的配置和使用,分析TCP报文格式,理解TCP的连接建立、和连接释放的过程。
2、学习3CDaemon TFTP服务器的配置和使用,分析UDP报文格式,理解TCP协议与UDP协议的区别。
二、实验工具软件3CDaemon软件简介3CDaemon是3Com公司推出的功能强大的集FTP Server、TFTP Server、Syslog Server 和TFTP Client于一体的集成工具,界面简单,使用方便。
这里主要介绍实验中需要用到的FTP Server功能和TFTP Server功能。
1、FTP Server功能(1)配置FTP Server功能:选中左窗格功能窗口,打开FTP Server按钮,单击窗格中的 Configure FTP Server按钮,打开3CDaemon Configuration配置窗口,配置FTP Server功能。
这里需要设置的就是“Upload/Download”路径,作为FTP Server的文件夹,其它选项可以使用系统缺省设置。
设置完成后,单击确认按钮,设置生效。
(2)在实验中,我们使用3CDaemon系统内置的匿名帐户“anonymous”登陆FTP 服务器,客户端使用微软FTP客户端命令,关于Ftp命令的说明介绍如下。
(3) Ftp命令的说明FTP的命令格式:ftp[-v][-d][-i][-n][-g][-w:windowsize][主机名/IP地址] 其中:-v不显示远程服务器的所有响应信息;-n限制ftp的自动登录;-i在多个文件传输期间关闭交互提示-d允许调试、显示客户机和服务器之间传递的全部ftp命令;-g不允许使用文件名通配符;-w:windowsize忽略默认的4096传输缓冲区。
使用FTP命令登录成功远程FTP服务器后进入FTP子环境,在这个子环境下,用户可以使用FTP的内部命令完成相应的文件传输操作。
任务一:用Wireshark观察TCP连接的建立、使用和释放过程思考作业:a)浏览器进程的IP地址和端口号是什么?IP地址:192.168.209.44 端口号:3003b)服务器端进程的IP地址和端口号是什么?IP地址:128.119.245.12 端口号:80c)如何识别连接建立时的SYN报文,它的sequence序号值是多少?该TCP报文是从哪台主机发送出去的?通过查看图标中的中间绿色行,点显示SYN的箭头,可以识别。
Sequence序列号:0该TCP报文是从IP地址为192.168.209.44的主机发送出去d)如何识别SYN的确认报文,即SYN ACK,它是有哪台主机发送的?它的seqence序号值是什么?对SYN报文的确认号值是什么?确认后有什么样的含义?通过查看图标中的中间绿色行,点显示SYN ACK的箭头,可以识别。
它是从IP地址为128.119.245.12的主机发送的它的seqence序列号为0对SYN报文的确认号码为:1含义:1.表示已经受到报文2.表示愿意接受的下一个报文的序号e)观察前3个数据帧,它们是与TCP连接建立相关的数据,分析这些数据在TCP首部中的特点?确认TCP连接过程中协商的参数有哪些?TCP连接过程中的协商的参数有:源端口、目标端口、序号(Seq) 确认号(ACK)前提:观察TCP报文的可靠通信机制。
从第4个TCP报文开始(连接建立后的第一个),连续观察5个TCP报文的内容。
回答以下问题:a)每个TCP报文的长度值是多大?它们的最大值是多少?是否有确定依据?每个TCP报文的长度为617、0、1408、1408、1408。
他们的最大值为1408。
有确定依据。
b)每个TCP报文的序号值是什么?是否是连续变化?TCP报文的序号值:1 、618、1、2026、3434是连续变化的呈现不断增长的趋势c)每个TCP报文的确认号是什么?它的作用是什么?TCP报文的确认号:1、1、618、1、1它的作用:确认号表示愿意接受的下一个报文的序号,并表示成功接受该报文d)每个TCP报文首部中的Windows size是什么含义? 它的作用是什么?Windows size 是窗口大小的意思作用:TCP报文的流量控制由连接的每一端通过声明的窗口大小来提供e)连续的5个TCP报文是否有重传的现象?在此次跟踪中有重传的报文段。
tcp协议实验总结TCP协议实验总结前言本文对TCP协议实验进行总结,旨在探讨TCP协议的基本原理和实际应用,并提供一些实验中的注意事项和经验分享。
正文1. TCP协议简介•TCP(Transmission Control Protocol)是一种面向连接的、可靠的网络传输协议。
•TCP协议通过三次握手建立连接,在数据传输过程中保证数据的可靠性和有序性。
•TCP协议支持流量控制和拥塞控制,以确保网络传输的稳定性和可靠性。
2. TCP协议实验设计•设计合适的实验拓扑结构,包括服务器和多个客户端,以模拟真实网络环境。
•实验过程中,要确保服务器和客户端之间的正常通信,包括建立连接、数据传输和连接终止。
•针对不同的实验目的,可以设计不同的测试场景和负载条件,以验证TCP协议的性能和稳定性。
3. 实验经验分享•在实验过程中,要确保服务器和客户端的配置正确,并且网络连通。
•注意调整合适的实验参数,如超时时间、拥塞窗口大小等,以探索不同情况下TCP协议的行为表现。
•在进行实验时,可以使用抓包工具(如Wireshark)进行数据包分析,并通过统计数据(如RTT、丢包率)评估实验结果。
结尾本文对TCP协议实验进行了总结和分析,通过实验可以更加深入地理解TCP协议的工作原理和性能特点。
在今后的网络应用开发过程中,可以更加准确地使用和优化TCP协议,以提供更高质量的网络传输服务。
注意:文章内不得出现HTML字符、网址、图片和电话号码等内容。
4. 实验注意事项•在进行实验前,要充分了解并熟悉TCP协议的基本原理和相关概念,以便更好地设计和执行实验。
•在实验过程中,要保证实验环境的稳定性和可靠性,避免其他因素对实验结果的影响。
•实验中应尽量避免大量数据的传输,以免产生网络拥塞,影响实验结果的准确性。
•实验完成后,要及时整理和分析实验数据,并进行合适的可视化展示,以便更好地理解和演示实验结果。
5. 实验应用推广•TCP协议是互联网中最常用的传输协议之一,广泛应用于各种网络应用中,如Web浏览器、邮件和文件传输等。
《TCP/IP协议》实验报告学院:机械与电子信息学院专业:计算机网络技术学号:姓名:指导教师:2018年 6 月实验一Packet Tracer 6.0的使用一、实验目的通过在Packet Tracer 6.0 添加网络设备,熟悉不同的物理设备及其连接方式,掌握使用Packet Tracer 6.0构建网络的方法,掌握捕获、查看通信信息的方法。
二、实验步骤步骤1、打开Packet Tracer 6.0,添加以下网络节点:1841路由器3台,2950-24 交换机1台,PC三台,服务器1台。
步骤2、选择合适的连接线把设备连接起来。
以太网连线时,交换机与计算机或路由器等设备之间连接用直通线,交叉线用于同种设备(路由器与路由器,交换机与交换机)之间相连或计算机与路由器之间相连。
用直通线吧PC0、PC1、Router0与Switch0的任意端口连接,Router0、Router1和Router2之间需要用交叉线连接,Server0与Router2也要用交叉线连接。
如果连线类型正确,则PC与交换机之间连线上的绿灯马上会点亮。
特别的,为配置路由器,可以用控制台连线把PC2和Router1的Console 端口连接起来,也可以连接到Router1的Auxiliary端口上,但使用方法与连接到控制口时不同。
步骤3、配置设备。
PC的配置可以直接在Packet Tracer 6.0的逻辑拓补图上单击PC图标,打开设备配置窗口,单击Desktop选项卡中的IP Configuration,完成默认网关和ID地址的设置。
依次设置3台PC和服务器0的IP地址,PC0和PC1的默认网关设为192.168.1.1,服务器0的默认网关设为192.168.4.1。
单击需要配置的路由器图标,打开设备配置窗口,单击CLI选项卡,按Enter键出现命令行提示符,然后使用如下命令配置静态路由。
Router>enable #进入特权模式Router#configure terminal #全局配置Router(config)#int f0/0 #配置接口f0/0 Router(config-if)#no shutdown #开启接口Router(config-if)#ip address 192.168.1.1 255.255.255.0随着借口no shutdown 命令的输入,接口连线上的绿灯随时变亮。
————————基于TCP聊天室(java)学号:姓名:基于TCP的应用程序实例【实验目的】●使用套接字socket建立一个简单的基于TCP的客户/服务器形式的网络程序。
●了解面向连接的通信原理分析客户机/服务器工作方式客户机/服务器模式在操作过程中采取的是主动请示方式(1)、首先服务器要先启动,并根据请示提供相应服务,过程如下:●打开通信通道并告知本地主机,它愿意在某个公认地址上接受客户请求。
●等待客户请求到达该端口。
●接收到重复服务请求,处理该请求并发送应答信号。
●返回第二步,等待另一客户请求。
●关闭服务器(2)、客户机启动后,向服务器发出请求,过程如下●打开通道信号,并连接到服务器所在主机的特定端口。
●向服务器发送服务请求,等待并接收应答;继续提出请求。
●请求结束后关闭通道并终止。
【实验说明、运行截图】聊天程序由两大部分组成:服务器端聊天程序和客户端聊天程序。
服务器端聊天程序负责接创建若干连接,接受客户端的请求,收来自客户端的聊天信息,并且把这些信息转发到聊天窗口中。
客户端聊天程序则负责建立和维护与服务器端的连接,向服务器发送本客户的聊天内容,同时从服务器接收对方的响应。
以下是等待连接到连接成功两个过程截图1、(等待连接)2、连接成功:客户端连接成功后,即可向服务器端发送信息,服务器端即可实时显示,另外,服务器端可以连接多个客户端。
【关键代码分析】服务器端:客户端:通过端口,IP创建客户端套接字。
一样的通过信息流的方式获取传输。
【实验心得】TCP通信是建立连接的通信,通过JA V A中的socket通信技术,结合多线程、信息流、以及图形化界面的知识,实习小小的聊天功能。
TCP协议实验分析一.实验目的理解tcp的三次握手与连接的建立。
二.数据截图1.第一个TCP报文1.第一个TCP报文这是要建立连接的客户向服务器发出连接请求段在这张截图中可以知道源端口号也就是主机端口号为18602,而目的端口号为HTTP的80端口,确认号为0(相对的),而首部长度为36字节,在标志位FLAGS(0x0002)中,只设置了SYN,也就是位同步标志,表示请求建立连接。
窗口大小WINDOW SIZE为8192,校验和CHECKSUM为0xb10,说明是正确的。
选项是16字节,里面的内容有最大段(MSS)大小为1460(0x020405b4)字节,占4个字节。
时间戳(Time stamp)为0x080a0048bc6100000000,占10字节,表示tsval 4766817,tsecr为0。
有SACK permitted为0x0402,占2个字节。
2.第二个TCP报文这是服务器在收到请求后,发回确认(SYN+ACK)。
在这张截图中我们可以知道源主机(服务器)端口号为80,目的主机(客户机)端口号为18602,SEQUENCE NUMBER=0,ACK=1,首部长度为36字节。
在标志位(0x0012)中设置了ACK和SYN,其中SYN表示认可连接,ACK表示对所接受的段的确认。
窗口大小(WINDOW SIZE)为5792,校验和(checksum)为0x2b65,表示正确。
选项(options)占16字节,其中包括最大段(MSS)大小为1420字节,占4字节。
还有时间戳为0x080a70024e220048bc61,占10字节。
还包括SACK PERMITTED为0x0402,占2字节。
3.第三个TCP报文这是客户向服务器发出的确认段源主机(客户机)端口号为18602,目的主机(服务器)端口号为80,SEQUENCE NUMBER=0,ACK=1,首部长度为32字节。
标志位(0x0010)中只设置了ACK,表示对所接受的段的确认。
《—计算机网络—》TCP通信实验报告姓名:班级:学号:指导老师:浙江理工大学信息电子学院二○一四年十二月一、实验目的、利用c#编写异步tcp通讯程序,掌握socket语句的用法二、实验内容TCP实现一对一单人聊天,编程实现一个聊天室系统。
该系统首先必须设立服务器,建立完成后必须建立与服务器的连接。
建立成功后可以接收客户端输入的信息。
该系统包括客户端和服务器端两部分。
用户通过客户端发送消息。
服务器端在收到消息后,显示在主界面上实验报告要求有实现过程的流程图,对主要的函数及其参数给予说明,要有实现过程的主要程序段,并对各段程序的功能及作用进行说明三、实验代码1.server端using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using ;using .Sockets;using System.IO;using System.Threading;namespace frmAsyncTcpServer{public partial class TCPServer : Form{// 申明变量private const int Port = 51388;private TcpListener tcpLister = null;private TcpClient tcpClient = null;IPAddress ipaddress;private NetworkStream networkStream = null;private BinaryReader reader;private BinaryWriter writer;// 申明委托// 显示消息private delegate void ShowMessage(string str);private ShowMessage showMessageCallback;// 显示状态private delegate void ShowStatus(string str);private ShowStatus showStatusCallBack;// 清空消息private delegate void ResetMessage();private ResetMessage resetMessageCallBack;public TCPServer(){InitializeComponent();// 显示消息showMessageCallback = new ShowMessage(showMessage);// 显示状态showStatusCallBack = new ShowStatus(showStatus);// 重置消息resetMessageCallBack = new ResetMessage(resetMessage); ipaddress = IPAddress.Loopback;tbxserverIp.Text = ipaddress.ToString();tbxPort.Text = Port.ToString();}// 显示消息private void showMessage(string str){lstbxMsgView.Items.Add(tcpClient.Client.RemoteEndPoint); lstbxMsgView.Items.Add(str);lstbxMsgView.TopIndex = lstbxMsgView.Items.Count - 1;}// 显示状态private void showStatus(string str){toolStripStatusInfo.Text = str;}// 清空消息private void resetMessage(){tbxMsg.Text = string.Empty;tbxMsg.Focus();}private void toolTip1_Popup(object sender, PopupEventArgs e){}private void TCPServer_Load(object sender, EventArgs e){}private void label1_Click(object sender, EventArgs e){}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, "就绪");}}private void btnStop_Click(object sender, EventArgs e){tcpLister.Stop();}private void btnClear_Click(object sender, EventArgs e){lstbxMsgView.Items.Clear();}private void btnReceive_Click(object sender, EventArgs e){statusStripInfo.Invoke(showStatusCallBack, "接受消息中");try{string receivemessage = reader.ReadString();lstbxMsgView.Invoke(showMessageCallback, receivemessage);StreamWriter wr = new StreamWriter(@"历史记录.txt", true,System.Text.Encoding.Default);for (int i = 0; i < lstbxMsgView.Items.Count; i++){wr.Write(lstbxMsgView.Items[i].ToString() + Environment.NewLine); }wr.Close();}catch{if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){tcpClient.Close();}statusStripInfo.Invoke(showStatusCallBack, "断开了连接");// 重新开启一个线程等待新的连接Thread acceptThread = new Thread(acceptClientConnect);acceptThread.Start();}}private void btnSend_Click(object sender, EventArgs e){Thread sendThread = new Thread(SendMessage);sendThread.Start(tbxMsg.Text);}private void SendMessage(object state){statusStripInfo.Invoke(showStatusCallBack, "正在发送");try{writer.Write(state.ToString());Thread.Sleep(5000);writer.Flush();statusStripInfo.Invoke(showStatusCallBack, "完毕");tbxMsg.Invoke(resetMessageCallBack, null);lstbxMsgView.Invoke(showMessageCallback, state.ToString()); }catch{if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){tcpClient.Close();}statusStripInfo.Invoke(showStatusCallBack, "断开了连接");// 重新开启一个线程等待新的连接Thread acceptThread = new Thread(acceptClientConnect);acceptThread.Start();}}private void button1_Click(object sender, EventArgs e){if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){// 断开连接tcpClient.Close();}toolStripStatusInfo.Text = "断开连接";// 启动一个线程等待接受新的请求Thread acceptThread = new Thread(acceptClientConnect);acceptThread.Start();}private void button1_Click_1(object sender, EventArgs e){StreamReader file = new StreamReader(@"历史记录.txt", System.Text.Encoding.Default);string s = "";while (s != null){s = file.ReadLine();if (s != null && !s.Equals(""))lstbxMsgView.Items.Add(s);}file.Close();}}}2.client端using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using ;using .Sockets;using System.Threading;using System.IO;namespace frmAsyncTcpClient{public partial class frmAsyncTcpClient : Form{// 申明变量private TcpClient tcpClient = null;private NetworkStream networkStream = null;private BinaryReader reader;private BinaryWriter writer;// 申明委托// 显示消息private delegate void ShowMessage(string str);private ShowMessage showMessageCallback;// 显示状态private delegate void ShowStatus(string str);private ShowStatus showStatusCallBack;// 清空消息private delegate void ResetMessage();private ResetMessage resetMessageCallBack;public frmAsyncTcpClient(){InitializeComponent();// 显示消息showMessageCallback = new ShowMessage(showMessage);// 显示状态showStatusCallBack = new ShowStatus(showStatus);// 重置消息resetMessageCallBack = new ResetMessage(resetMessage);}private void showMessage(string str){lstbxMsgView.Items.Add(tcpClient.Client.RemoteEndPoint); lstbxMsgView.Items.Add(str);lstbxMsgView.TopIndex = lstbxMsgView.Items.Count - 1;}private void showStatus(string str){toolStripStatusInfo.Text = str;}// 清空消息private void resetMessage(){tbxMsg.Text = "";tbxMsg.Focus();}private void toolStripLabel1_Click(object sender, EventArgs e) {}private void textBox5_TextChanged(object sender, EventArgs e) {}private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e){}private void frmAsyncTcpClient_Load(object sender, EventArgs e){}private void tbxSendCount_TextChanged(object sender, EventArgs e){}private void label1_Click(object sender, EventArgs e){}private void lstbxMsgView_SelectedIndexChanged(object sender, EventArgs e) {}private void btnConnect_Click(object sender, EventArgs e){// 通过一个线程发起请求,多线程Thread connectThread = new Thread(ConnectToServer);connectThread.Start();}private void ConnectToServer(){try{// 调用委托statusStripInfo.Invoke(showStatusCallBack, "正在连接...");if (tbxSrvIp.Text == string.Empty || tbxPort.Text == string.Empty) {MessageBox.Show("请先输入服务器的IP地址和端口号");}IPAddress ipaddress = IPAddress.Parse(tbxSrvIp.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 btnReceive_Click(object sender, EventArgs e){Thread receiveThread = new Thread(receiveMessage);receiveThread.Start();}private void receiveMessage(){statusStripInfo.Invoke(showStatusCallBack, "接受中");try{string receivemessage = reader.ReadString();lstbxMsgView.Invoke(showMessageCallback, receivemessage);StreamWriter wr = new StreamWriter(@"历史记录.txt", true,System.Text.Encoding.Default);for (int i = 0; i < lstbxMsgView.Items.Count; i++){wr.Write(lstbxMsgView.Items[i].ToString() + Environment.NewLine); }wr.Close();}catch{if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){tcpClient.Close();}statusStripInfo.Invoke(showStatusCallBack, "断开了连接"); }}private void btnDisconnect_Click(object sender, EventArgs e){if (reader != null){reader.Close();}if (writer != null){writer.Close();}if (tcpClient != null){// 断开连接tcpClient.Close();}toolStripStatusInfo.Text = "断开连接";}private void btnSend_Click(object sender, EventArgs e){Thread sendThread = new Thread(SendMessage);sendThread.Start(tbxMsg.Text);}private void SendMessage(object state){statusStripInfo.Invoke(showStatusCallBack, "正在发送...");try{writer.Write(state.ToString());Thread.Sleep(5000);writer.Flush();statusStripInfo.Invoke(showStatusCallBack, "完毕");tbxMsg.Invoke(resetMessageCallBack, null);lstbxMsgView.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 btnClear_Click(object sender, EventArgs e){lstbxMsgView.Items.Clear();}private void button1_Click(object sender, EventArgs e){StreamReader file = new StreamReader(@"历史记录.txt",System.Text.Encoding.Default);string s = "";while (s != null){s = file.ReadLine();if (s != null && !s.Equals(""))lstbxMsgView.Items.Add(s);}file.Close();}}}}四、实验结果五、实验心得通过本次实验,我掌握了异步TCP通信的性质,学会了建立C#窗体程序并用socket进行tcp通讯的编程。