华南农业大学计算机网络课程设计报告.docx
- 文档编号:30275612
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:35
- 大小:1.34MB
华南农业大学计算机网络课程设计报告.docx
《华南农业大学计算机网络课程设计报告.docx》由会员分享,可在线阅读,更多相关《华南农业大学计算机网络课程设计报告.docx(35页珍藏版)》请在冰豆网上搜索。
华南农业大学计算机网络课程设计报告
华南农业大学理学院
课程实验(设计)报告
专业年级:
11信息与计算科学
学生学号:
201130760
学生学号:
201130760
学生姓名:
学生姓名:
实验题目:
Socket应用程序设计
指导老师:
实验时间:
2013年11月1日-2013年11月29日
目录
1实验内容和要求1
1.1实验内容1
1.2实验要求1
1.3实验实现的功能1
2实验过程2
2.1系统需求分析2
2.1.1客户端 2
2.1.2服务器2
2.2系统的概要设计3
2.3具体实现4
2.3.1客户端4
2.3.1.1登陆功能4
2.3.1.2聊天功能6
2.3.1.3离线聊天功能8
2.3.1.4接受离线信息功能9
2.3.1.5聊天记录功能10
2.3.1.6显示用户状态功能12
2.3.1.7文件传输功能13
2.3.2服务器19
2.3.2.1登录、注册验证功能19
2.3.2.2群聊功能21
2.3.2.3用户信息管理功能21
3实验结果23
4讨论与总结24
5参考文献24
6小组分工25
1实验内容和要求
1.1实验内容
在学习完TCP/IP协议组后,要求掌握基于此协议实现网络通信,理解TCP与UDP的不同特征以及实现方式。
基于Windows平台建立一个基于TCP/IP协议的网络通讯小应用,实验可采用UDP或TCP实现。
1.2实验要求
(1)能够进行用户管理,所有用户必须登录到服务器,有服务器维护在线信息;
(2)IM功能:
用户登录后能够进行实时多方点到点短信息通信,如聊天;
(3)能够选择要求服务器进行转发服务;
(4)能够保存通信记录到数据库(SQLServer或者其他桌面型数据库或数据文件);
(5)能进行双方文件传输,能够显示进度;
*(6)支持断点重传,检查时需有功能随时中断传送,并在下次启动时能显示重传状态;
*(7)数据包加密;
*(8)实时语音双向传送功能;
*(9)多方通话功能;
(10)界面设计要求布局合理,信息清晰。
(11)自加功能。
(*为选做内容)
1.3实验实现的功能
(1)服务器能够进行用户管理,所有用户必须登录到服务器,有服务器维护在线信息;
(2)IM功能:
用户登录后能够进行实时多方点到点短信息通信,如聊天;
(3)服务器离线转发功能;
(4)客户端保存群聊天记录;
(5)能进行双方文件传输,能够显示进度;
(10)界面设计要求布局合理,信息清晰。
2实验过程
2.1系统需求分析
2.1.1客户端
(1)登陆功能:
在用户填写相关的账户和密码时,客户端能够发送连接客户端要求,当,连上客户端的时候,客户端能够将账号和密码信息发送到服务器进行核对,并返回信心
(2)聊天功能:
在客户端中,用户有权选择群聊还是与某在线用户私聊
(3)离线聊天功能:
在线的用户可能通过服务器将信息发给离线的用户
(4)接受离线信息共能:
当用户上线时,接收其他用户的离线信息
(5)聊天记录功能:
客户端能自动将群聊的信息保存在相应的数据库当中
(6)显示用户状态功能:
对于在线的用户和离线的用户能够及时显示在表格当中
2.1.2服务器
(1)维护用户功能:
添加新用户,修改用户密码,删除用户
(2)更新用户状态功能:
通知客户端更新成员状态和相应的列表
(3)离线功能:
为离线用户保存离线信息,并且在用户上线的时发送相应的离线信息
(4)检验用户信息功能:
验证用户的账号和密码的正确性,并禁止用户异地同时登陆
(5)显示群聊记录:
在服务器中几时显示群聊的信息
2.2系统的概要设计
图2.1软件功能模块图
图2.2服务器与客户端功能的设计
图2.3服务器与客户端数据流程图
2.3具体实现
2.3.1客户端
2.3.1.1登陆功能
图2.4登陆界面
(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
Form2.tcpClient.Close
Form2.tcpClient.RemoteHost=Form1.txtHost.Text
Form2.tcpClient.RemotePort=Form1.txtPort.Text
Form2.tcpClient.Connect
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
2.3.1.2聊天功能
(1)群聊天。
在图2.2的文本框中输入字符,便可以发送信息。
发送的协议:
$$$群聊天信息$$$,通过进行过协议封装的聊天信息,能够让服务器进行识别,别且转发给在线用户。
图2.5聊天窗口
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=1ToForm2.ListView1.ListItems.Count
Private_Chat(i).ClientSer.Close
Private_Chat(i).ClientSer.LocalPort=8080+i
Private_Chat(i).ClientSer.Listen
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
2.3.1.3离线聊天功能
在输入框中输入私聊信息时,先判断是否在线,假如是在线的话直接利用已经和对方连接的TCP控件进行发送信息。
假如是离线用户的话,利用协议将封装好的离线信息发送给服务器,在通过服务器发送给离线的用户。
离线信息协议:
%**1发送者账号**1**2接收者账号**2**$$离线的信息**$$%
代码如下:
PrivateSubCommand1_Click()
DimstrAsString
IfLen(Text2.Text)=0Then
MsgBox("发送内容不能为空!
")
ExitSub
EndIf
str=Form1.Username.Text&""&Time&Chr(13)&Chr(10)&Text2.Text
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
图2.6私聊对话框
2.3.1.4接受离线信息功能
接收离线私聊信息。
当收到服务器的离线信息时,对发送过来的字符串进行信息提取,提取出发送者、接收者和信息。
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)
Forn=1ToForm2.ListView1.ListItems.Count
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
2.3.1.5聊天记录功能
(1)读取数据库中的聊天信息。
添加VB的控件ADO,ADO控件建立起读取聊天记录的桌面型数据库access,读取数据库中信息,如图2.4。
代码如下:
PubliccnAsADODB.Connection
PublicrsAsADODB.Recordset
Subadddata()
Setcn=NewADODB.Connection
cn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&App.Path&"\data.mdb;PersistSecurityInfo=False"
cn.Open
Setrs=cn.Execute("select*fromdata")
EndSub
图2.7数据库的信息
当按下群聊天记录的时候弹出对应的RichTextBox控件如下图
图2.8群聊天记录对话框
(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
2.3.1.6显示用户状态功能
(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.9用户状态列表
(2)当用户退出的时候,会发送Q的字符串给服务器,告诉服务器退出,并且让服务器发送用户状态信息给各个在线用户,再次刷新用户。
代码如下:
PrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)
tcpClient.SendData"Q"&CStr(Now())
DoEvents
UnloadForm3
UnloadForm2
Form1.Show
EndSub
2.3.1.7文件传输功能
基于TCP/IP协议的通信,需要分别建立客户端应用程序和服务器段应用程序,大致流程如图4-1
图2.10客户端与服务器数据流图
实现原理:
发送方先获取待传输文件的基本信息,主要是文件名及文
件长度(用于创建数据缓冲区);然后,将其发送给接收方;接着,建立和
文件一样大小的数据缓冲区,并将文件读入;最后,将数据缓冲区中的数据
发送给接收方。
与此同时,当接收方接收到文件名和文件长度之后,就为其
创建新的文件和数据缓冲区;然后,接收传输的文件数据,并将其放在数据
缓冲区中;最后,依次将数据缓冲区的数据写入新创建的文件中。
这样便完
成了不同计算机之间的文件传输。
在本次实验中,于私人聊天模式里,当勾上“打开文件传输通道后”,右边button将变为可用,
如下图:
,
图2.11文件传输
此时点击“发送文件”按钮,便会弹出窗体
图2.12文件传输界面
这时窗体里的winsock控件(数组)将处于监听状态,执
行代码如下
Forj=1ToForm2.ListView1.ListItems.Count
Private_send(j).wskServer.Close
Private_send(j).wskServer.LocalPort=8000+j
Private_send(j).wskServer.Listen
Nextj
并且若此时点击“浏览”时,将会调用系统里的控件“Comdlg”,
执行下段代码
PrivateSubCommand1_Click()
WithComdlg
.CancelError=True
OnErrorGoToOpenErr
.DialogTitle=“打开一个测试文件…”
.Filter=“所有文件(*.*)|*.*”
.Flags=&H4
.ShowOpen
Text3.T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华南 农业大学 计算机网络 课程设计 报告