华南农业大学计算机网络课程设计报告整理.docx
- 文档编号:29147357
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:30
- 大小:1.34MB
华南农业大学计算机网络课程设计报告整理.docx
《华南农业大学计算机网络课程设计报告整理.docx》由会员分享,可在线阅读,更多相关《华南农业大学计算机网络课程设计报告整理.docx(30页珍藏版)》请在冰豆网上搜索。
华南农业大学计算机网络课程设计报告整理
华南农业大学理学院
课程实验〔设计〕报告
专业年级:
11信息与计算科学
学生学号:
202130760
学生学号:
202130760
学生姓名:
学生姓名:
实验题目:
Socket应用程序设计
指导老师:
实验时间:
2021年11月1日-2021年11月29日
1实验内容和要求
在学习完TCP/IP协议组后,要求掌握基于此协议实现网络通信,理解TCP与UDP的不同特征以及实现方式。
基于Windows平台建立一个基于TCP/IP协议的网络通讯小应用,实验可采用UDP或TCP实现。
〔1〕能够进行用户管理,所有用户必须登录到效劳器,有效劳器维护在线信息;
〔2〕IM功能:
用户登录后能够进行实时多方点到点短信息通信,如聊天;
〔3〕能够选择要求效劳器进行转发效劳;
〔4〕能够保存通信记录到数据库〔SQLServer或者其他桌面型数据库或数据文件〕;
〔5〕能进行双方文件传输,能够显示进度;
*〔6〕支持断点重传,检查时需有功能随时中断传送,并在下次启动时能显示重传状态;
*〔7〕数据包加密;
*〔8〕实时语音双向传送功能;
*〔9〕多方通话功能;
〔10〕界面设计要求布局合理,信息清晰。
〔11〕自加功能。
〔*为选做内容〕
〔1〕效劳器能够进行用户管理,所有用户必须登录到效劳器,有效劳器维护在线信息;
〔2〕IM功能:
用户登录后能够进行实时多方点到点短信息通信,如聊天;
〔3〕效劳器离线转发功能;
〔4〕客户端保存群聊天记录;
〔5〕能进行双方文件传输,能够显示进度;
〔10〕界面设计要求布局合理,信息清晰。
2实验过程
〔1〕登陆功能:
在用户填写相关的账户和密码时,客户端能够发送连接客户端要求,当,连上客户端的时候,客户端能够将账号和密码信息发送到效劳器进行核对,并返回信心
〔2〕聊天功能:
在客户端中,用户有权选择群聊还是与某在线用户私聊
〔3〕离线聊天功能:
在线的用户可能通过效劳器将信息发给离线的用户
〔4〕接受离线信息共能:
当用户上线时,接收其他用户的离线信息
〔5〕聊天记录功能:
客户端能自动将群聊的信息保存在相应的数据库当中
〔6〕显示用户状态功能:
对于在线的用户和离线的用户能够及时显示在表格当中
〔1〕维护用户功能:
添加新用户,修改用户密码,删除用户
〔2〕更新用户状态功能:
通知客户端更新成员状态和相应的列表
〔3〕离线功能:
为离线用户保存离线信息,并且在用户上线的时发送相应的离线信息
〔4〕检验用户信息功能:
验证用户的账号和密码的正确性,并禁止用户异地同时登陆
〔5〕显示群聊记录:
在效劳器中几时显示群聊的信息
〔1〕在按下登陆按钮的时候,程序获取界面中的效劳器中IP地址和端口号,同时检验账号和密码是否有误。
假设账号和密码填写上没有错误,进行连接效劳器。
代码如下:
PrivateSubCommand1_Click()'点击登陆按钮
Form2.login=False'设置能否登陆标志为“不能〞
IfForm1.Username.Text=""OrForm1.Usercode.Text=""Then'检查账号和密码填写是否有空
MsgBox"请输入账号和密码"
Else
CalltcpClient_Connect'连接效劳器
DoEvents
IfForm2.tcpClient.State=7Then'假设连接上效劳器那么发送账号和密码
Form2.tcpClient.SendData"|"&"***"&Form1.Username.Text&"***"&"###"&Form1.Usercode.Text&"###"&"|"'***账号***###密码###
DoEvents
Else
MsgBox"没有效劳器"
EndIf
Timer1.Enabled=True
EndIf
EndSub
PublicSubtcpClient_Connect()
IfForm2.tcpClient.State<>7Then
DoEvents
EndIf
EndSub
〔2〕当连接成功后,发送账号和密码,用相关的已经定义好协议进行封装发送给效劳器。
协议是***账号***###密码###
代码如下:
IfForm2.tcpClient.State=7Then'假设连接上效劳器那么发送账号和密码
Form2.tcpClient.SendData"|"&"***"&Form1.Username.Text&"***"&"###"&Form1.Usercode.Text&"###"&"|"'***账号***###密码###
〔3〕当客户端收到的效劳器的协议信息是密码和账号是正确的时候才能进行真正的登录。
协议是:
当收到*#时,代表登录成功。
当收到*ERROR时,代表没有这账号。
当收到#ERROR时,代表密码错误。
当收到*ONLINE时,代表账号已经登录。
代码如下:
IfInStr(sData,"*#")<>0Then
login=True
ElseIfInStr(sData,"*ERROR")<>0Then
MsgBox"没有这账号"
ElseIfInStr(sData,"#ERROR")<>0Then
MsgBox"密码错误"
ElseIfInStr(sData,"*ONLINE")<>0Then
MsgBox"账号已经登录"
EndIf
〔1〕群聊天。
在图2.2的文本框中输入字符,便可以发送信息。
发送的协议:
$$$群聊天信息$$$,通过进行过协议封装的聊天信息,能够让效劳器进行识别,别且转发给在线用户。
PrivateSubcmdSend_Click()
IftxtOut.Text=""Then
MsgBox"发送内容不能为空"
ExitSub
EndIf
tcpClient.SendData"$$$"+Form1.Username.Text+":
"&txtOut.Text+"$$$"
'============================================插入聊天记录
a=CStr(Now())+Chr(10)+Form1.Username.Text+":
"+txtOut.Text+Chr(10)
Setrs=cn.Execute("insertintodata(tcp_data)values('"&a&"')")'tcp_data是表的列名
'============================================插入聊天记录
rtbIn.Text=rtbIn.Text&Chr(10)+CStr(Now())+Chr(10)+Form1.Username.Text+":
"+txtOut.Text+Chr(10)
txtOut.Text=""
rtbIn.SelStart=Len(rtbIn.Text)
EndSub
〔2〕发送私聊信息。
在listviews中点击相应的用户名字就可以进行私聊,在登陆的时候已经设置好TCP控件的端口号。
代码如下:
PublicSubset_privatechat()
Fori=
Private_Chat(i).ClientSer.LocalPort=8080+i
Next
EndSub
〔3〕接收在线私聊信息。
PrivateSubClientCli_DataArrival(ByValbytesTotalAsLong)
ClientCli.GetDatastr,vbString
Text1.Text=Text1.Text&str
Text1.SelStart=Len(Text1.Text)
'IfMe.WindowState=1Then
'Timer2.Enabled=True
'EndIf
EndSub
PrivateSubClientSer_DataArrival(ByValbytesTotalAsLong)
ClientSer.GetDatastr,vbString
Text1.Text=Text1.Text&str
Text1.SelStart=Len(Text1.Text)
'IfMe.WindowState=1Then
'Timer2.Enabled=True
'EndIf
EndSub
在输入框中输入私聊信息时,先判断是否在线,假设是在线的话直接利用已经和对方连接的TCP控件进行发送信息。
假设是离线用户的话,利用协议将封装好的离线信息发送给效劳器,在通过效劳器发送给离线的用户。
离线信息协议:
%**1发送者账号**1**2接收者账号**2**$$离线的信息**$$%
代码如下:
PrivateSubCommand1_Click()
DimstrAsString
IfLen(Text2.Text)=0Then
MsgBox("发送内容不能为空!
")
ExitSub
EndIf
str=str&Chr(13)&Chr(10)&Chr(13)&Chr(10)
IfClientSer.State=7Then
ClientSer.SendDatastr
'MsgBox"已连接上对方"
ElseIfClientCli.State=7Then
ClientCli.SendDatastr
EndIf
IfClientCli.State<>7AndClientSer.State<>7Then'离线信息设置
Form2.tcpClient.SendData"%"+"**1"+Label2.Caption+"**1"+"**2"+Label3.Caption+"**2"+"**$$"+str+"**$$"+"%"
DoEvents
EndIf
Text1.Text=Text1.Text&str
Text1.SelStart=Len(Text1.Text)
Text2.Text=""
EndSub
接收离线私聊信息。
当收到效劳器的离线信息时,对发送过来的字符串进行信息提取,提取出发送者、接收者和信息。
Functioncheck_outlinemessage(messageAsString)
sender_where1=0
reciever_where1=0
outmessage_where1=0
sender_where2=0
reciever_where2=0
outmessage_where2=0
IfInStr(message,"**2")<>0Then
Do
sender_where1=InStr(sender_where2+1,message,"**1")
sender_where2=InStr(sender_where1+1,message,"**1")
sender=Mid(message,sender_where1+3,sender_where2-sender_where1-3)
outmessage_where1=InStr(outmessage_where2+1,message,"**$$")
outmessage_where2=InStr(outmessage_where1+1,message,"**$$")
outmessage=Mid(message,outmessage_where1+4,outmessage_where2-outmessage_where1-4)
IfForm2.ListView1.ListItems(n).Text=senderThen
Private_Chat(n).Text1.Text=Private_Chat(n).Text1.Text&outmessage
Private_Chat(n).Text1.SelStart=Len(Private_Chat(n).Text1.Text)
Form2.ListView1.ListItems(n).ForeColor=vbRedForm2.ListView1.ListItems(n).ListSubItems.Item
(1).ForeColor=vbRed
Form2.ListView1.ListItems(n).ListSubItems.Item
(2).ForeColor=vbRedEndIf
Next
LoopUntilInStr(sender_where2+1,message,"**1")=0
EndIf
EndFunction
〔1〕读取数据库中的聊天信息。
添加VB的控件ADO,ADO控件建立起读取聊天记录的桌面型数据库access,读取数据库中信息,如图2.4。
代码如下:
Subadddata()
on
cn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&App.Path&"\data.mdb;PersistSecurityInfo=False"
Setrs=cn.Execute("select*fromdata")
EndSub
当按下群聊天记录的时候弹出对应的RichTextBox控件如下列图
〔2〕将群聊天信息参加到数据库。
提取$$$与$$$之间的群聊天信息
IfInStr(sData,"$$$")<>0Then
group_chat1=InStr(sData,"$$$")
group_chat2=InStr(group_chat1+1,sData,"$$$")
ssData=Mid(sData,group_chat1+3,group_chat2-group_chat1-3)
'============================================插入聊天记录
a=CStr(Now())+Chr(10)+ssData+Chr(10)
Setrs=cn.Execute("insertintodata(tcp_data)values('"&a&"')")'tcp_data是表的列名
'============================================插入聊天记录
rtbIn.Text=rtbIn.Text+Chr(10)+CStr(Now())+Chr(10)+ssData+Chr(10)
rtbIn.SelStart=Len(rtbIn.Text)
EndIf
Callcheck_useronline(sData)
Callset_privatechat
〔1〕当用户登录的时候,效劳器会发送当前用户列表的信息给客户端,协议为***用户名***@@@IP地址@@@,当IP地址为NULL时,客户端识别为没有上线,只有不是NULL的时候才是真正有上线,对于上线的用户,在listview中的状态会由0变为1,表示已经上线。
同时会清空listview,将所以的用户进行重新的加载。
如图2.6.
代码如下:
PublicSubcheck_useronline(gDataAsString)
account_where1=0
IP_where1=0
account_where2=0
IP_where2=0
IfInStr(gData,"***")>=1Then
Form2.ListView1.ListItems.Clear'清空列表
Do
account_where1=InStr(account_where2+1,gData,"***")
account_where2=InStr(account_where1+1,gData,"***")
Username=Mid(gData,account_where1+3,account_where2-account_where1-3)
IP_where1=InStr(IP_where2+1,gData,"@@@")
IP_where2=InStr(IP_where1+1,gData,"@@@")
UserIP=Mid(gData,IP_where1+3,IP_where2-IP_where1-3)
Setitmx=Form2.ListView1.ListItems.Add(1,,Username)
itmx.SubItems
(2)=UserIP
IfUserIP<>"NULL"Then
itmx.SubItems
(1)=1
Else
itmx.SubItems
(1)=0
EndIf
LoopUntilInStr(account_where2+1,gData,"***")=0
EndIf
EndSub
〔2〕当用户退出的时候,会发送Q的字符串给效劳器,告诉效劳器退出,并且让效劳器发送用户状态信息给各个在线用户,再次刷新用户。
代码如下:
PrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)
tcpClient.SendData"Q"&CStr(Now())
DoEvents
UnloadForm3
UnloadForm2
EndSub
基于TCP/IP协议的通信,需要分别建立客户端应用程序和效劳器段应用程序,大致流程如图4-1
实现原理:
发送方先获取待传输文件的根本信息,主要是文件名及文
件长度〔用于创立数据缓冲区〕;然后,将其发送给接收方;接着,建立和
文件一样大小的数据缓冲区,并将文件读入;最后,将数据缓冲区中的数据
发送给接收方。
与此同时,当接收方接收到文件名和文件长度之后,就为其
创立新的文件和数据缓冲区;然后,接收传输的文件数据,并将其放在数据
缓冲区中;最后,依次将数据缓冲区的数据写入新创立的文件中。
这样便完
成了不同计算机之间的文件传输。
在本次实验中,于私人聊天模式里,当勾上“翻开文件传输通道后〞,右边button将变为可用,
如下列图:
,
此时点击“发送文件〞按钮,便会弹出窗体
这时窗体里的winsock控件〔数组〕将处于监听状态,执
行代码如下
Forj=1ToForm2.ListView1.ListItems.Count
Private_send(j).wskServer.LocalPort=8000+j
Nextj
并且假设此时点击“浏览〞时,将会调用系统里的控件“Comdlg〞,
执行下段代码
PrivateSubCommand1_Click()
WithComdlg
.CancelError=True
OnErrorGoToOpenErr
.DialogTitle=“翻开一个测试文件…〞
.Filter=“所有文件(*.*)|*.*〞
.Flags=&H4
.ShowOpen
Text3.Text=.FileName
EndWith
OpenErr:
EndSub
假设此时选择的文件正确〔路径,文件存在〕,将可以点击“发送按钮〞,已
连接的对方的winsock将会发生〞请求〞事件,接受“请求〞的话,将发生“数据到达〞,相关代码如下所示:
PrivateSubwskServer_ConnectionRequest(ByValequestedAsLong)
Private_send(SelectNo).wskServer.Acceptequested
List1.AddItem“已连接…〞
Command2.Enabled=True
EndSub
PrivateSubwskServer_DataArrival(ByValbytesTotalAsLong)
DimWskChatAsString
Private_send(SelectNo).wskServer.GetDataWskChat
IfWskChat=“NoThanks〞Then
MsgBox“对方拒收你发送的文件.〞,vbExclamation,“Server〞
ElseIfWskChat=“OkSend〞Then
MsgBox“对方接受了你的文件.〞&vbCrLf&vbCrLf&“单击“确定〞开始传送…〞,vbInformation,“Server〞
GetFileNum=FreeFile
LenFile=FileLen(Text3.Text)
‘------------------
ProBarLen=LenFile
VarPlus=0
‘------------------
OpenText3.TextForBinaryAs#GetFileNum
OnSend=True
Command2.Enabled=False
CallTCPSendFile(Private_send(SelectNo).wskServer,GetFileNum,SplitFile)
EndIf
EndSub
假设没有连接上,我们添加了Timer控件,来监控状态,假设处于“连接关闭〞状态,将重置winsock,并显示相应信息给用户〔例如“传送〞按钮不可用等〕,
如下列图:
相关代码如下:
PrivateSubTimer1_Timer()
IfPrivate_send(SelectNo).wskServer.State=sckClosingThen
List1.AddItem"对方的连接已关闭..."
Private_send(SelectNo).wskServer.LocalPort=8000+Select
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华南 农业大学 计算机网络 课程设计 报告 整理