农业大学计算机网络课程设计报告.doc

上传人:可****阿 文档编号:91598031 上传时间:2023-05-27 格式:DOC 页数:30 大小:1.53MB
返回 下载 相关 举报
农业大学计算机网络课程设计报告.doc_第1页
第1页 / 共30页
农业大学计算机网络课程设计报告.doc_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《农业大学计算机网络课程设计报告.doc》由会员分享,可在线阅读,更多相关《农业大学计算机网络课程设计报告.doc(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 . 华南农业大学理学院课程实验(设计)报告专业年级: 11信息与计算科学 学生学号: 201130760学生学号: 201130760学生:学生:实验题目: Socket应用程序设计 指导老师:实验时间:2013年11月1日-2013年11月29日26 / 30目 录1实验容和要求11.1实验容11.2实验要求11.3实验实现的功能12实验过程22.1系统需求分析22.1.1客户端22.1.2服务器22.2系统的概要设计32.3具体实现42.3.1客户端42.3.1.1登陆功能42.3.1.2聊天功能62.3.1.3离线聊天功能82.3.1.4接受离线信息功能92.3.1.5聊天记录功能10

2、2.3.1.6显示用户状态功能122.3.1.7文件传输功能132.3.2服务器192.3.2.1登录、注册验证功能192.3.2.2群聊功能212.3.2.3用户信息管理功能213实验结果234讨论与总结245参考文献246小组分工251实验容和要求1.1实验容在学习完TCP/IP协议组后,要求掌握基于此协议实现网络通信,理解TCP与UDP的不同特征以与实现方式。基于Windows平台建立一个基于TCP/IP协议的网络通讯小应用,实验可采用UDP或TCP实现。1.2实验要求(1)能够进行用户管理,所有用户必须登录到服务器,有服务器维护在线信息;(2)IM功能:用户登录后能够进行实时多方点到点

3、短信息通信,如聊天;(3)能够选择要求服务器进行转发服务;(4)能够保存通信记录到数据库(SQL Server或者其他桌面型数据库或数据文件);(5)能进行双方文件传输,能够显示进度;*(6)支持断点重传,检查时需有功能随时中断传送,并在下次启动时能显示重传状态;*(7)数据包加密;*(8)实时语音双向传送功能;*(9)多方通话功能;(10)界面设计要求布局合理,信息清晰。(11)自加功能。(*为选做容)1.3实验实现的功能(1)服务器能够进行用户管理,所有用户必须登录到服务器,有服务器维护在线信息;(2)IM功能:用户登录后能够进行实时多方点到点短信息通信,如聊天;(3)服务器离线转发功能;

4、(4)客户端保存群聊天记录;(5)能进行双方文件传输,能够显示进度;(10)界面设计要求布局合理,信息清晰。2实验过程2.1系统需求分析2.1.1客户端(1)登陆功能:在用户填写相关的账户和密码时,客户端能够发送连接客户端要求,当,连上客户端的时候,客户端能够将账号和密码信息发送到服务器进行核对,并返回信心(2)聊天功能:在客户端中,用户有权选择群聊还是与某在线用户私聊(3)离线聊天功能:在线的用户可能通过服务器将信息发给离线的用户(4)接受离线信息共能:当用户上线时,接收其他用户的离线信息(5)聊天记录功能:客户端能自动将群聊的信息保存在相应的数据库当中(6)显示用户状态功能:对于在线的用户

5、和离线的用户能够与时显示在表格当中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地址和端

6、口号,同时检验账号和密码是否有误。若账号和密码填写上没有错误,进行连接服务器。代码如下:Private Sub Command1_Click() 点击登陆按钮 Form2.login = False 设置能否登陆标志为“不能” If Form1.Username.Text = Or Form1.Usercode.Text = Then 检查账号和密码填写是否有空 MsgBox 请输入账号和密码 Else Call tcpClient_Connect 连接服务器 DoEvents If Form2.tcpClient.State = 7 Then 若连接上服务器则发送账号和密码 Form2.tc

7、pClient.SendData | & * & Form1.Username.Text & * & # & Form1.Usercode.Text & # & | *账号*#密码# DoEvents Else MsgBox 没有服务器 End If Timer1.Enabled = True End IfEnd SubPublic Sub tcpClient_Connect() If Form2.tcpClient.State 7 Then Form2.tcpClient.Close Form2.tcpClient.RemoteHost = Form1.txtHost.Text Form2.

8、tcpClient.RemotePort = Form1.txtPort.Text Form2.tcpClient.Connect DoEvents End IfEnd Sub(2)当连接成功后,发送账号和密码,用相关的已经定义好协议进行封装发送给服务器。协议是*账号*#密码#代码如下:If Form2.tcpClient.State = 7 Then 若连接上服务器则发送账号和密码 Form2.tcpClient.SendData | & * & Form1.Username.Text & * & # & Form1.Usercode.Text & # & | *账号*#密码#(3)当客户端

9、收到的服务器的协议信息是密码和账号是正确的时候才能进行真正的登录。协议是:当收到*#时,代表登录成功。当收到*ERROR时,代表没有这账号。当收到#ERROR时,代表密码错误。当收到*ONLINE时,代表账号已经登录。代码如下:If InStr(sData, *#) 0 Then login = True ElseIf InStr(sData, *ERROR) 0 Then MsgBox 没有这账号 ElseIf InStr(sData, #ERROR) 0 Then MsgBox 密码错误 ElseIf InStr(sData, *ONLINE) 0 Then MsgBox 账号已经登录En

10、d If2.3.1.2聊天功能(1)群聊天。在图2.2的文本框中输入字符,便可以发送信息。发送的协议:$群聊天信息$,通过进行过协议封装的聊天信息,能够让服务器进行识别,别且转发给在线用户。图2.5聊天窗口Private Sub cmdSend_Click() If txtOut.Text = Then MsgBox 发送容不能为空 Exit Sub End If tcpClient.SendData $ + Form1.Username.Text + : & txtOut.Text + $ =插入聊天记录 a = CStr(Now() + Chr(10) + Form1.Username.T

11、ext + : + txtOut.Text + Chr(10) Set rs =.Execute(insert into data (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)End Sub(2)发送私聊信息。在listviews中点击相

12、应的用户名字就可以进行私聊,在登陆的时候已经设置好TCP控件的端口号。代码如下:Public Sub set_privatechat() For i = 1 To Form2.ListView1.ListItems.Count Private_Chat(i).ClientSer.Close Private_Chat(i).ClientSer.LocalPort = 8080 + i Private_Chat(i).ClientSer.Listen NextEnd Sub(3)接收在线私聊信息。Private Sub ClientCli_DataArrival(ByVal bytesTotal

13、As Long) ClientCli.GetData str, vbString Text1.Text = Text1.Text & str Text1.SelStart = Len(Text1.Text) If Me.WindowState = 1 Then Timer2.Enabled = True End IfEnd SubPrivate Sub ClientSer_DataArrival(ByVal bytesTotal As Long) ClientSer.GetData str, vbString Text1.Text = Text1.Text & str Text1.SelSta

14、rt = Len(Text1.Text) If Me.WindowState = 1 Then Timer2.Enabled = True End IfEnd Sub2.3.1.3离线聊天功能在输入框中输入私聊信息时,先判断是否在线,假如是在线的话直接利用已经和对方连接的TCP控件进行发送信息。假如是离线用户的话,利用协议将封装好的离线信息发送给服务器,在通过服务器发送给离线的用户。离线信息协议:%*1发送者账号*1*2接收者账号*2*$离线的信息*$%代码如下:Private Sub Command1_Click() Dim str As String If Len(Text2.Text)

15、= 0 Then MsgBox (发送容不能为空!) Exit Sub End If str = Form1.Username.Text & & Time & Chr(13) & Chr(10) & Text2.Text str = str & Chr(13) & Chr(10) & Chr(13) & Chr(10) If ClientSer.State = 7 Then ClientSer.SendData str MsgBox 已连接上对方 ElseIf ClientCli.State = 7 Then ClientCli.SendData str End If If ClientCli

16、.State 7 And ClientSer.State 7 Then 离线信息设置 Form2.tcpClient.SendData % + *1 + Label2.Caption + *1 + *2 + Label3.Caption + *2 + *$ + str + *$ + % DoEvents End If Text1.Text = Text1.Text & str Text1.SelStart = Len(Text1.Text) Text2.Text = End Sub图2.6私聊对话框2.3.1.4接受离线信息功能接收离线私聊信息。当收到服务器的离线信息时,对发送过来的字符串进行

17、信息提取,提取出发送者、接收者和信息。Function check_outlinemessage(message As String) sender_where1 = 0 reciever_where1 = 0 outmessage_where1 = 0 sender_where2 = 0 reciever_where2 = 0 outmessage_where2 = 0 If InStr(message, *2) 0 Then Do sender_where1 = InStr(sender_where2 + 1, message, *1) sender_where2 = InStr(send

18、er_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 - out

19、message_where1 - 4) For n = 1 To Form2.ListView1.ListItems.Count If Form2.ListView1.ListItems(n).Text = sender Then 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 = vbRed For

20、m2.ListView1.ListItems(n).ListSubItems.Item(1).ForeColor = vbRed Form2.ListView1.ListItems(n).ListSubItems.Item(2).ForeColor = vbRed End If Next Loop Until InStr(sender_where2 + 1, message, *1) = 0 End IfEnd Function2.3.1.5聊天记录功能(1)读取数据库中的聊天信息。添加VB的控件ADO,ADO控件建立起读取聊天记录的桌面型数据库access,读取数据库息,如图2.4。代码如下

21、:Public As ADODB.ConnectionPublic rs As ADODB.RecordsetSub adddata()Set = New ADODB.Connectioncn.ConnectionString = Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & App.Path & data.mdb;Persist Security Info=Falsecn.OpenSet rs =.Execute(select * from data)End Sub图2.7数据库的信息当按下群聊天记录的时候弹出对应的RichTextBox控件

22、如下图图2.8群聊天记录对话框(2)将群聊天信息加入到数据库。提取$与$之间的群聊天信息If InStr(sData, $) 0 Then 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) Set rs =.Execute(insert into data

23、 (tcp_data) values ( & a & ) tcp_data是表的列名 =插入聊天记录 rtbIn.Text = rtbIn.Text + Chr(10) + CStr(Now() + Chr(10) + ssData + Chr(10) rtbIn.SelStart = Len(rtbIn.Text) End If Call check_useronline(sData)Call set_privatechat2.3.1.6显示用户状态功能(1)当用户登录的时候,服务器会发送当前用户列表的信息给客户端,协议为*用户名*IP地址,当IP地址为NULL时,客户端识别为没有上线,只有

24、不是NULL的时候才是真正有上线,对于上线的用户,在listview中的状态会由0变为1,表示已经上线。同时会清空listview,将所以的用户进行重新的加载。如图2.6.代码如下:Public Sub check_useronline(gData As String) account_where1 = 0 IP_where1 = 0 account_where2 = 0 IP_where2 = 0 If InStr(gData, *) = 1 Then Form2.ListView1.ListItems.Clear 清空列表 Do account_where1 = InStr(account

25、_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)

26、 Set itmx = Form2.ListView1.ListItems.Add(1, , Username) itmx.SubItems(2) = UserIP If UserIP NULL Then itmx.SubItems(1) = 1 Else itmx.SubItems(1) = 0 End If Loop Until InStr(account_where2 + 1, gData, *) = 0 End IfEnd Sub 图2.9用户状态列表(2)当用户退出的时候,会发送Q的字符串给服务器,告诉服务器退出,并且让服务器发送用户状态信息给各个在线用户,再次刷新用户。代码如下:P

27、rivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) tcpClient.SendData Q & CStr(Now() DoEvents Unload Form3 Unload Form2 Form1.ShowEnd Sub2.3.1.7文件传输功能基于TCP/IP协议的通信,需要分别建立客户端应用程序和服务器段应用程序,大致流程如图4-1图2.10客户端与服务器数据流图实现原理:发送方先获取待传输文件的基本信息,主要是文件名与文件长度(用于创建数据缓冲区);然后,将其发送给接收方;接着,建立和文件一样大小

28、的数据缓冲区,并将文件读入;最后,将数据缓冲区中的数据发送给接收方。与此同时,当接收方接收到文件名和文件长度之后,就为其创建新的文件和数据缓冲区;然后,接收传输的文件数据,并将其放在数据缓冲区中;最后,依次将数据缓冲区的数据写入新创建的文件中。这样便完成了不同计算机之间的文件传输。在本次实验中,于私人聊天模式里,当勾上“打开文件传输通道后”,右边button将变为可用,如下图:,图2.11文件传输此时点击“发送文件”按钮,便会弹出窗体图2.12文件传输界面这时窗体里的winsock控件(数组)将处于监听状态,执行代码如下For j = 1 To Form2.ListView1.ListItem

29、s.Count Private_send(j).wskServer.Close Private_send(j).wskServer.LocalPort = 8000 + j Private_send(j).wskServer.ListenNext j并且若此时点击“浏览”时,将会调用系统里的控件“Comdlg”,执行下段代码Private Sub Command1_Click()With Comdlg .CancelError = True On Error GoTo OpenErr .DialogTitle = “打开一个测试文件” .Filter = “所有文件 (*.*)|*.*” .F

30、lags = &H4 .ShowOpen Text3.Text = .FileNameEnd WithOpenErr:End Sub若此时选择的文件正确(路径,文件存在),将可以点击“发送按钮”,已连接的对方的winsock将会发生”请求”事件,接受“请求”的话,将发生“数据到达”,相关代码如下所示:Private Sub wskServer_ConnectionRequest(ByVal equested As Long)If Private_send(SelectNo).wskServer.State sckClosed Then Private_send(SelectNo).wskSer

31、ver.ClosePrivate_send(SelectNo).wskServer.Accept equestedList1.ClearList1.AddItem “已连接”Command2.Enabled = TrueEnd SubPrivate Sub wskServer_DataArrival(ByVal bytesTotal As Long)Dim WskChat As StringPrivate_send(SelectNo).wskServer.GetData WskChatIf WskChat = “NoThanks” Then MsgBox “对方拒收你发送的文件.”, vbEx

32、clamation, “Server”ElseIf WskChat = “OkSend” Then MsgBox “对方接受了你的文件.” & vbCrLf & vbCrLf & “单击“确定”开始传送”, vbInformation, “Server” GetFileNum = FreeFile LenFile = FileLen(Text3.Text) - ProBarLen = LenFile VarPlus = 0 - Open Text3.Text For Binary As #GetFileNum OnSend = True Command2.Enabled = False Cal

33、l TCPSendFile(Private_send(SelectNo).wskServer, GetFileNum, SplitFile)End IfEnd Sub 若没有连接上,我们添加了Timer控件,来监控状态,若处于“连接关闭”状态,将重置winsock,并显示相应信息给用户(例如“传送”按钮不可用等),如下图:图2.13文件传输中载入文件相关代码如下:Private Sub Timer1_Timer() If Private_send(SelectNo).wskServer.State = sckClosing Then List1.Clear List1.AddItem 对方的连

34、接已关闭. Private_send(SelectNo).wskServer.Close Private_send(SelectNo).wskServer.LocalPort = 8000 + SelectNo Private_send(SelectNo).wskServer.Listen Command2.Enabled = False End IfEnd Sub根据上面所述的原理,是使用存来存储数据,然而,当需要传送的数据比较大时,就不能像以上介绍的那样,直接将整个文件放入数据缓冲区中了,我们的存是无法忍受用一个几百MB甚至上GB的空间去存储那些临时数据的。显然,这种做法已远不能满足我们的

35、需求,这时可以将文件按照一定的大小,分成若干个数据包(远小于存的容量)。首先,设置数据包的大小(如64K),根据文件的基本信息(主要文件的长度),计算出总共需要的数据包数;然后,依次读取同数据包一样大小的数据到数据缓冲区中;接着,将数据缓冲区中的数据,发送到指定的计算机上;同时在另一端,建立一个数据缓冲区,缓冲区的大小要根据接收到的数据来确定,依次接收客户端传输过来的数据包,并将数据缓冲区的数据写入相应的文件中,这样就很容易实现大文件的传输了,这是一种较为常用的方法(较为容易实现断点续传),不过本次采用的是一种“迭代递归”的思想,使用自己编写的函数SplitFile()来稍微简单实现传输大文件

36、,但断点重传功能将受到限制,相关代码如下:Private Function SplitFile() As LongDim GetCount As Long If LenFile = 8192 Then GetCount = 8192 LenFile = LenFile - GetCount Else GetCount = LenFile LenFile = LenFile - GetCount End If VarPlus = VarPlus + GetCount ProBar.Value = (VarPlus / ProBarLen) * 100 SplitFile = GetCountEn

37、d FunctionPrivate Sub TCPSendFile(objWinSock As Winsock, FileNumber As Integer, SendLen As Long) Dim FileByte() As Byte, i As Long ReDim FileByte(SendLen - 1) Get #FileNumber, , FileByte objWinSock.SendData FileByteEnd Sub至于显示进度,在私聊和传送文件窗体里,我们添加了VB自带的控件progressbar,进度也根据以传送文件的大小和总大小作简单除法:ProBar.Value

38、 = (VarPlus / ProBarLen) * 100来显示,图示效果如下:图2.14文件传输接收完毕图2.15文件传输发送完毕2.3.2服务器2.3.2.1登录、注册验证功能双击服务器.exe,进入初始界面,这里winsock将初始化,得到IP地址并且设置端口等,并对客户端管理界面进行初始化(此时该界面不显示但却已执行相关操作,点击“客户端”界面时显现):图2.16服务器界面图2.17客户端管理界面当有客户端请求连接服务器时,同意的话,发生”事件到达”,服务器采取机制:判断数据种类,并采取相关操作。代码如下:Dim sData As String Dim sName As String

39、 tcpServer(Index).GetData sData rtbSave.SelStart = Len(rtbSave.Text) 客户端向服务器发送已经登录和退出信息 = sName = Left(sData, 1) If sName = C Then tcpServer(Index).SendData C_OK DoEvents ElseIf sName = Q Then tcpServer(Index).SendData Q_OK. DoEvents Call del_IP(tcpServer(Index).RemoteHostIP) 在客服端管理中删除已退出客户端的IP地址和上线

40、记录 tcpServer(Index).Close NumOnline = NumOnline - 1 End If = 客户端向服务器发送账号和密码,服务器提取账号和密码 = If InStr(sData, |) Then account_where1 = InStr(sData, *) account_where2 = InStr(account_where1 + 1, sData, *) user(0).uName = Mid(sData, account_where1 + 3, account_where2 - account_where1 - 3) *用户名* password_where1 = InStr(sData, #) password_where2 = InStr(password_where1 + 1, sData, #) user(0).uPWD = Mid(sData, password_where1 + 3, password_where2 - password_where1 - 3) #密码*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作计划

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁