TCP协议开发试验报告.docx
《TCP协议开发试验报告.docx》由会员分享,可在线阅读,更多相关《TCP协议开发试验报告.docx(10页珍藏版)》请在冰豆网上搜索。
TCP协议开发试验报告
甘肃政法学院
本科学生实验报告
(三)
姓名学院计算机科学学院
专业计算机科学与技术班级09计本班
实验课程名称TCP/IP协议分析
试验时间2011年10月27日
指导教师及职称武光利
实验成绩
开课时间2011—2012学年第一学期
甘肃政法学院实验管理中心印制
实验题目
TCP协议开发
小组合作
否
姓名
班级
计本
(1)
学号
一、实验目的
学会使用Winsock控件的TCP方式实现一个网络聊天程序,以达到学会面向连接方式的程序设计方法。
二.实验环境
Windowsxp操作系统,装有Visualbasic6.0软件
三、实验内容与步骤
1.在客户端创建一个新的工程将其命名为“Client”
2.将窗体的标题改为“客户端”。
3.在窗体中添加一个WinSock控件,并将其命名为winsockserver。
4.在窗体中添加一个listbox控件。
将其命名为list1。
5.在frmClient中添加一个TextBox控件。
将其命名为txtsend。
6.在窗体上放两个CommandButton控件,并将其命名为“Command1”和“Command2”。
7.将Command1控件的标题改为“连接”,将Command2控件的标题改为“发送”。
8.在窗体中添加如下的代码。
(1)当用户单击“连接”按钮后,触发时间处理程序如下:
PrivateSubCommand2_Click()
Winsockclient.Connect'向服务器发出连接请求
EndSub
(2)当用户单击“发送”按钮,所触发的时间处理过程如下:
PrivateSubCommand3_Click()
Winsockclient.SendDataTextsend.Text'将textsed文本框中的内容发送给远程计算机
Textsend.Text=""
EndSub
(3)其他事件程序:
PrivateSubForm_Load()
Textsend.Visible=False
List1.Visible=False
Command3.Visible=False
Winsockclient.RemotePort=1001'连接远程计算机上的1001端口
Winsockclient.RemoteHost="qianfang-8ecf4e"'远程计算机的名字
EndSub
PrivateSubText1_Change()
Winsockclient.RemoteHost=Text1.Text'在text2文本框中输入远程计算机名或IP地址
EndSub
PrivateSubWinsockclient_Close()
Winsockclient.Close'关闭连接
End
EndSub
'与远程计算机取得连接后,进入下面的程序
PrivateSubwinsockclient_Connect()
Textsend.Visible=True
Text1.Visible=False
List1.Visible=True
Command2.Visible=False
Command3.Visible=True
EndSub
'取得连接后,对收到的数据进行DataArrival处理
PrivateSubwinsockclient_DataArrival(ByValbytesTotalAsLong)
DimsAsString
Winsockclient.GetDatas'从远程计算机接收到的数据放入s中
'在list1中显示接收到的内容
List1.AddItem""&Index&""&Trim(s)
EndSub
服务器端的程序
在窗体中添加三个WinSock控件,将其分别命名为
SckListen、sckBusy和sckServer并将“sckServer”的“Index”属性设置为0
(1)定义程序中的全局变量。
PrivateMaxChanAsInteger'定义MaxChan为整型,使用winsock控件的最大值
(2)在form_load中,进行变量初始化,并设置winsock控件数组。
PrivateSubForm_Load()'from窗口元素装载
'最大允许15个客户端同时登录
DimiAsInteger'定义变量i为整型
MaxChan=15'将15赋值给Maxchan
Fori=1ToMaxChan-1'进入for循环MacChan递减
LoadsckServer(i)'装载第i个命名为sckServer的winsock控件
Nexti'下一个i控件
sckListen.LocalPort=1001'在命名为sckListen的winsock控件上设置本地的监听端口为1001,并初始化
sckListen.Listen'开始监听
EndSub
命令中指定了本地主机的通信端口,并使用Listen方法来监听连接请求。
(3)当客户端有连接请求时,在服务器端触发ConnectionRequest事件,其时间处理程序代码如下:
PrivateSubsckListen_ConnectionRequest(ByValrequestIDAsLong)'winsock控件的ConnectionRequest事件
DimiAsInteger'定义变量i为整型
'决定由哪一Winsock接受请求
Fori=0ToMaxChan-1
IfsckServer(i).State=0Then'查看winsock控件状态是否为0
ExitFor
EndIf
Nexti
'如果有空的winsock则使用winsock控件的accept方法接受连接
IfsckServer(i).State=0Then
sckServer(i).AcceptrequestID
ExitSub
EndIf
'如果所有Winsock都用完则由专门的“忙”Winsock接受请求,以免用户要求得不到响应
sckBusy.Close
sckBusy.Acceptrequested
EndSub
(4)在DataArrival事件被触发后,对接受到的数据进行相应的处理。
PrivateSubsckServer_DataArrival(IndexAsInteger,ByValbytesTotalAsLong)
DimsAsString
DimiAsInteger
sckServer(Index).GetDatas'用winsock的getdata方法获取当前数据块并将其存储在s中
'判断是否为悄悄话,点对点方式
IfUCase(Left(Trim(s),2))="PT"Then'返回是以pt开头,“pt”不区分大小写
IfIsNumeric(Mid(Trim(s),3,2))Then'判断返回的的第三个字符开始的两个字符为数字
'如果以上两个条件都满足,则进入一下进程
i=Mid(Trim(s),3,2)'将返回的第三个字符开始的两个字符赋值给i
'用winsock的senddata方法将数据发送给远程计算机,格式为Channel“i”+内容
sckServer(i).SendData"Channel"&Index&""&Right(Trim(s),Len(Trim(s))-4)
DoEvents
EndIf
Else'广播方式
Fori=0ToMaxChan-1
'利用winsock的State属性给所有连接在服务器上的客户发消息
IfsckServer(i).State=7Then'如果已连接则用winsock的senddata向远程计算机发送数据
sckServer(i).SendData"Channel"&Index&""&Trim(s)
DoEvents
EndIf
Nexti
EndIf
'将接受到的数据放入命名为lstReceive的listbox控件中
lstReceive.AddItem"Channel"&Index&""&Trim(s)
EndSub
(5)其他事件程序。
PrivateSubsckBusy_Close()
sckBusy.Close'关闭命名为sckBusy的winsock控件连接
EndSub
PrivateSubsckBusy_DataArrival(ByValbytesTotalAsLong)
sckBusy.SendData"服务器忙,请稍后再连接!
"'如果服务器忙,则发送“”中的内容
DoEvents
EndSub
'如果连接失败则Error事件被触发
PrivateSubsckListen_Error(ByValNumberAsInteger,DescriptionAsString,ByValScodeAsLong,ByValSourceAsString,ByValHelpFileAsString,ByValHelpContextAsLong,CancelDisplayAsBoolean)
sckListen.Close'用close方法关闭TCP连接
sckListen.LocalPort=1000'初始化本地主机1000端口
sckListen.Listen'开始监听
EndSub
'sckserver控件发生错误,使用sckServer的error事件进行处理
PrivateSubsckServer_Error(IndexAsInteger,ByValNumberAsInteger,DescriptionAsString,ByValScodeAsLong,ByValSourceAsString,ByValHelpFileAsString,ByValHelpContextAsLong,CancelDisplayAsBoolean)
sckServer(Index).Close'关闭连接
EndSub
(6)现在,在服务器既能监听又能接收数据,而且还能把接收到的数据显示出来,特别说明的是,这时的程序代码还没完,因为当远程客户计算机关闭连接时,应用程序应正确关闭TCP连接。
关闭事件处理程序如下:
PrivateSubsckServer_Close(IndexAsInteger)
sckServer(Index).Close'关闭连接
EndSub
5.实验结果
点对点聊天
在1号和2号线程进行聊天的时候,0号线程不能看到他们的聊天内容。
群聊
四、实验过程与分析
实验中用到了vb编程,通过编程实现聊天功能。
服务器要既能监听又能接收数据,而且还要能把接收到的数据显示出来,当远程客户计算机关闭连接时,应用程序应正确关闭TCP连接。
五、实验总结
要保留聊天记录应该用listbox控件而不是textbox控件,在建立客户端与服务器端连接的时候要仔细,不能缺少任何一步,否则就无法建立连接了。
六、教师评语
实验过程合理,较好的完成了实验内容。
教师签名
武光利
成绩
批阅日期
2011.11.4