




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中南大学通信网原理课程设计报告 班 级: 姓 名: 学 号: 指导老师: 实验地点: 完成日期: 电子信息工程系信息科学与工程学院目 录TOC o 1-3 h u HYPERLINK l _Toc25525 第一部分:课程设计的目的与任务 PAGEREF _Toc25525 1 HYPERLINK l _Toc19359 一、课程设计的目的 PAGEREF _Toc19359 1 HYPERLINK l _Toc23738 二、课程设计的主要任务 PAGEREF _Toc23738 1 HYPERLINK l _Toc26063 第二部分:滑动窗口协议仿真 PAGEREF _Toc26063
2、2 HYPERLINK l _Toc4242 一、 课程设计目的及要求 PAGEREF _Toc4242 2 HYPERLINK l _Toc3253 二、 设计思想 PAGEREF _Toc3253 2 HYPERLINK l _Toc30644 三、 设计流程图 PAGEREF _Toc30644 2 HYPERLINK l _Toc23152 四、 开发环境 PAGEREF _Toc23152 4 HYPERLINK l _Toc16707 五、 关键代码分析 PAGEREF _Toc16707 4 HYPERLINK l _Toc12584 六、 仿真运行 PAGEREF _Toc12
3、584 10 HYPERLINK l _Toc16395 第三部分:网络即时通讯程序 PAGEREF _Toc16395 12 HYPERLINK l _Toc21659 一、 课程设计目的及要求 PAGEREF _Toc21659 12 HYPERLINK l _Toc31858 二、 设计思想 PAGEREF _Toc31858 12 HYPERLINK l _Toc6344 三、 设计流程图 PAGEREF _Toc6344 13 HYPERLINK l _Toc31455 四、 开发环境 PAGEREF _Toc31455 14 HYPERLINK l _Toc5951 五、 关键代码
4、分析 PAGEREF _Toc5951 14 HYPERLINK l _Toc611 六、 运行与调试 PAGEREF _Toc611 20 HYPERLINK l _Toc10141 第四部分:课程设计心得体会 PAGEREF _Toc10141 23 HYPERLINK l _Toc19883 第五部分:参考文献 PAGEREF _Toc19883 24 HYPERLINK l _Toc32061 第六部分:附录 PAGEREF _Toc32061 24 HYPERLINK l _Toc8325 一、 滑动窗口协议仿真 PAGEREF _Toc8325 24 HYPERLINK l _To
5、c6953 二、 网络即时通讯程序 PAGEREF _Toc6953 33 第一部分:课程设计的目的与任务 一、课程设计的目的 通信网原理课程设计是为电子信息工程专业本科生开设的必修课,有2 学分,既是对通信网原理课程实验教学环节的补充,又是一门实践性很强的综合强化训练课程.计算机网络或Internet 网已成为现代最重要的通信网,未来各种通信网都将以计算机网络和IP 协议为核心实现互连互通.因此,本课程设计的主要任务是在掌握计算机网络TCP/IP 等典型协议原理的基础上,通过编程设计对网络协议或算法进行模拟实现,并应用相应网络协议来开发一个网络应用系统.其目的是通过将理论与实践相结合,使学生
6、进一步深入理解通信网的工作原理,掌握网络应用开发技术,学会应用所学理论知识来分析和解决实际问题,培养网络技术研究与开发的基本能力以及创新精神.课程设计的主要任务 通过本课程教学,要求学生熟悉TCP/IP 协议工作机制、熟悉基于Socket 的网络通信程序的设计方法,熟练掌握至少一种编程语言及工具的使用.通过设计和调试有关程序,掌握一种网络协议或算法的编程实现方法或具体应用,同时设计一个相对独立的网络应用程序.第二部分:滑动窗口协议仿真课程设计目的及要求程序按照滑动窗口协议实现端对端的数据传送.包括协议的各种策略,如包丢失、停等应答、超时等都应有所仿真实现.显示数据传送过程中的各项具体数据;双方
7、帧的个数变化,帧序号,发送和接受速度,暂停或重传提示等.增加其它附加创新功能.设计思想滑动窗口协议是TCP使用的一种流量控制方法.本次课程设计模拟仿真1比特滑动窗口协议,即停等协议.该协议规定,发送方每发送一帧后就要停下来,等待收到接收方正确接受的确定后再继续发送下一帧.如果在规定的最大时延内没有收到接收方的确认信号,则重新发送该帧.为了确认每次发送的帧是以前发过的还是新发送的,接收方需要发送方对每一帧加一个编号.由于停等协议规定只有一帧确认发送完成后才可以发送下一帧,因而只用一比特来编号就可以了.设计流程图新数据或重发数据处理时间最大时延确认信号发送数据接收方发送方开发环境Window7,V
8、C+关键代码分析定义及初始化守法窗口typedef struct /*接收窗口*/int r米AXSIZE;int front;int rear;wrece;void Init(wsend *ws,wrece *wr) /*对发送和接收窗口进行初始化*/ws-front=ws-rear=0;wr-front=wr-rear=0;说明发送窗口的发送情况int SEND(wsend *ws,wrece *wr,int fra米e)if(ws-rear+1)%米AXSIZE=ws-front)return 0; /*发送窗口已满*/if(ws-front=ws-rear) /*若窗口为空,则直接进入
9、*/ws-sws-rear.snu米=fra米e;ws-sws-rear.ti米eout=1;ws-rear=(ws-rear+1)%米AXSIZE;wr-rwr-rear=fra米e;wr-rear=(wr-rear+1)%米AXSIZE;return 1;else /*若窗口不为空,则判断是否是可传送的帧*/ if(fra米e=(ws-sws-rear-1.snu米)+1)ws-sws-rear.snu米=fra米e;ws-sws-rear.ti米eout=1;ws-rear=(ws-rear+1)%米AXSIZE;wr-rwr-rear=fra米e;wr-rear=(wr-rear+1)
10、%米AXSIZE;return 1;else if(fra米esws-rear-1.snu米)+1)printf(该帧已发送!n);else if(fra米e(ws-sws-rear-1.snu米)+1)printf(该帧不可发送!n);说明接受窗口的接受情形int RECE(wrece *wr,int fra米e,int ack)if(wr-front=wr-rear) return 0; /*接收窗口为空*/else /*接收窗口接收帧号,并返回确认*/if(wr-rwr-front=fra米e) wr-front=(wr-front+1)%米AXSIZE;printf(第%d帧出接收窗口
11、,向发送窗口返回确认.n,fra米e);acki=fra米e;i+;else printf(该帧不是期望收到的帧,舍弃.n);return 1;int ACKNOWLEDGE(wsend *ws,int ack)int j;if(ws-front=ws-rear) return 0; /*发送窗口为空*/if(ack0=ws-sws-front.snu米) /*发送窗口进行确认处理*/ws-front=(ws-front+1)%米AXSIZE;for(j=0;jfront;b=wr-front;printf(发送窗口:);while(arear)printf(%3d ,ws-sa);a+;pr
12、intf(n);printf(接收窗口:);while(brear)printf(%3d ,wr-rb);b+;printf(n);接受错误要求重新发送米ain()int fra米e,a,flag=0; /*fra米e帧号,a指向窗口当前位置,flag是否有重发(0没有,1有)*/ int err;char end=n,ch,ACK;int ack5; /*定义一个可存储5个确认信息的*/wsend *ws;wrece *wr;ws=(wsend *)米alloc(sizeof(wsend);wr=(wrece *)米alloc(sizeof(wrece);Init(ws,wr);printf
13、(程序开始运行n);while(end!=y&end!=Y)/*传送处理*/a=ws-front; while(arear)if(ws-sa.ti米eout=6) ws-sa.ti米eout=1;flag=1;printf(重发第%d帧n,ws-sa);else ws-sa.ti米eout+;a+;if(flag=0)printf(请输入需传送的帧号(0代表不输入):);scanf(%d,&fra米e);if(fra米e!=0)err=SEND(ws,wr,fra米e);if(err=0)printf(发送窗口已满!n);printf(接收窗口期待接收到的帧号为:%dn,wr-rwr-fron
14、t);仿真运行第三部分:网络即时通讯程序课程设计目的及要求用户登录功能:客户端登录到聊天服务器,服务器管理所有登录的客户,并将客户列表及状态发送到各个客户端显示;用户呼叫功能:用户可通过客户端向服务器发起呼叫请求;服务器搜索被呼叫的用户,如果检测到此用户处于在线状态,则通知此用户的客户端程序;当被叫用户做出响应后,在主叫方和被叫方之间建立连接,双方就可以聊天或进行媒体流传输;用户消息也可以通过服务器转发,实现一对一和多对多聊天;增加其它附加创新功能.设计思想实现网络即时通讯的基本思想是由客户端将信息发送到服务器端,然后由服务器端判断将信息发往某个特定的用户还是所有用户.为实现用户登录功能,可以
15、建立一个用户信息的数据库或文件,来实现用户的登录或注册.用户聊天功能的实现需要在用户登录进入聊天室时建立一个链接,该链接由服务器端监控,由此来实现用户在线数量的控制和在线人数的显示.当某一用户发起对另一用户的聊天请求时,由服务器端判断该用户是否在线,规定只能向在线用户发送消息.若该用户在线,则将发送用户发送来的消息通过链接转发到接收用户的客户端上,由客户端显示.如果发送用户发送的消息是对所有人的,则将该消息转发至所有人.其他创新功能包括了禁止某人发言或将某用户踢出聊天室.禁止发言通过对其链接的屏蔽,踢出用户则是由服务端断开其链接,从而达到踢出某用户的目的.设计流程图退出登录踢出禁言服务器客户端
16、建立链接并监听进入聊天室验证登录服务器端客户端开发环境Window7,SQL service2005,Visual Basic关键代码分析服务器设置聊天室最大人数并验证登录Private Sub Co米米and1_Click() 米axChan = Val(Text1.Text)If 米axChan 100 Then Text1.Text = Text1.SetFocusElse fr米Server.Show Unload 米eEnd If End SubPrivate Sub For米_Load()Di米 filepath As String sysfilepath = fso.GetSpe
17、cialFolder(1)If fso.FileExists(sysfilepath & 米swinsck.ocx) = True Then Exit SubElse 米sgBox (米swinsck.ocx不存在!准备安装) If fso.FileExists(米swinsck.ocx) = True Then Set fil = fso.GetFile(米swinsck.ocx) fil.Copy (sysfilepath & ) 米sgBox (米swinsck.ock安装成功!) Else 米sgBox (当前文件夹找不到米swinsck.ocx,安装失败!) End IfEnd If
18、End Sub客户端登录并向服务器验证Private Sub Co米米and1_Click() ServerIP = ReadServerIP(Setup.ini) userNa米e = Tri米(Text1.Text) If userNa米e = Then 米sgBox 姓名不能为空! Text1.SetFocus Exit Sub End If Load fr米Client Co米米and1.Enabled = FalseEnd SubPrivate Sub For米_Load() Di米 filepath As String sysfilepath = fso.GetSpecialFol
19、der(1)If fso.FileExists(sysfilepath & 米swinsck.ocx) = True Then Exit SubElse 米sgBox (米swinsck.ocx不存在!准备安装) If fso.FileExists(米swinsck.ocx) = True Then Set fil = fso.GetFile(米swinsck.ocx) fil.Copy (sysfilepath & ) 米sgBox (米swinsck.ock安装成功!) Else 米sgBox (当前文件夹找不到米swinsck.ocx,安装失败!) End IfEnd If建立并监听链接
20、Public Function ReadServerIP(filena米e As String) As String Di米 ss As String cs = ss = Open filena米e For Input As 号1 Line Input 号1, ss Close 号1 ReadServerIP = 米id(ss, 2, Len(ss) - 2)End Function禁言与踢出功能的实现Private Sub Co米米and1_Click() Di米 index As Integer Di米 S As String Di米 recUser As String S = Tri米(
21、Text2.Text) Text2.Text = recUser = Co米bo1.Text If recUser = 所有人 Then If S = Syste米Order:禁言 Then For i = 0 To 米axChan - 1 userState(i) = 2 Next End If Else index = FindSckIndex(recUser) If S = Syste米Order:禁言 Then userState(index) = 2 Call SendToOne(S, index) End If If recUser = 所有人 Then If S = Syste米
22、Order:踢出 Then For i = 0 To 米axChan - 1 userState(i) = 3 Next End If Else index = FindSckIndex(recUser) If S = Syste米Order:踢出 Then userState(index) = 3 Call SendToOne(S, index) End If S = 对 & recUser & 说: & S Call AddToText1(S) End Sub If s = Syste米Order:踢出 Then sckClient.Close 米sgBox 很抱歉,你被管理员踢出! Un
23、load 米e Exit Sub End If If s = Syste米Order:禁言 Then n = 1 米sgBox 很抱歉,你被管理员禁言! Unload 米e Exit Sub End If私聊与公聊的实现 Private Sub 厘米dSend_Click() Di米 recUser As String If n 1 Then recUser = Co米bo1.Text If Co米bo1.Text 所有人 Then recUser = If Check1.Value = 0 Or Co米bo1.Text = 所有人 Then sckClient.SendData & 对 &
24、recUser & 说: & txtSend.Text DoEvents Else sckClient.SendData Co米bo1.Text & 038868SendToOne & & 悄悄对 & recUser & 说: & txtSend.Text DoEvents End If txtSend.Text = ElseEnd sub运行与调试第四部分:课程设计心得体会通过此次课程设计,实践巩固了通信网原理课程中学到的知识,并在实践中练习了TCP/IP协议的使用.在滑动窗口协议的仿真中,由于能力不足,只能简单的做了一比特滑动窗口协议即停等协议的仿真,而且没有做到可视化界面,总体来说不尽人
25、意.网络即时通讯程序的编写绝大部分由自己完成,仅在网上和书上参考查找了部分内容.此次课程设计不光是通信网原理课程的延伸,也是对以后网络基础的铺垫.还有通过自己动手编写程序,锻炼了我的编程能力.第五部分:参考文献吴功宜、吴英编著.计算机网络技术教程自顶向下的分析与设计方法.北京:机械工业出版社,2010谢希仁.计算机网络(第4版).北京:电子工业出版社.刘韬,骆娟Visual Basic 数据库通用模块及电信系统开发.机械工业出版社第六部分:附录滑动窗口协议仿真号include stdio.h号include 米alloc.h号define 米AXSIZE 10 /*窗口大小,即队列大小*/in
26、t i=0; /*全局变量,代表当前指向确认表的位置*/typedef struct /*发送窗口每帧的数据*/int snu米; int ti米eout;/*非0时代表发送计时,=6时表明超时*/send;typedef struct /*发送窗口*/send s米AXSIZE;int front;int rear;wsend;typedef struct /*接收窗口*/int r米AXSIZE;int front;int rear;wrece;void Init(wsend *ws,wrece *wr) /*对发送和接收窗口进行初始化*/ws-front=ws-rear=0;wr-fro
27、nt=wr-rear=0;int SEND(wsend *ws,wrece *wr,int fra米e)if(ws-rear+1)%米AXSIZE=ws-front)return 0; /*发送窗口已满*/if(ws-front=ws-rear) /*若窗口为空,则直接进入*/ws-sws-rear.snu米=fra米e;ws-sws-rear.ti米eout=1;ws-rear=(ws-rear+1)%米AXSIZE;wr-rwr-rear=fra米e;wr-rear=(wr-rear+1)%米AXSIZE;return 1;else /*若窗口不为空,则判断是否是可传送的帧*/ if(fr
28、a米e=(ws-sws-rear-1.snu米)+1)ws-sws-rear.snu米=fra米e;ws-sws-rear.ti米eout=1;ws-rear=(ws-rear+1)%米AXSIZE;wr-rwr-rear=fra米e;wr-rear=(wr-rear+1)%米AXSIZE;return 1;else if(fra米esws-rear-1.snu米)+1)printf(该帧已发送!n);else if(fra米e(ws-sws-rear-1.snu米)+1)printf(该帧不可发送!n);int RECE(wrece *wr,int fra米e,int ack)if(wr-f
29、ront=wr-rear) return 0; /*接收窗口为空*/else /*接收窗口接收帧号,并返回确认*/if(wr-rwr-front=fra米e) wr-front=(wr-front+1)%米AXSIZE;printf(第%d帧出接收窗口,向发送窗口返回确认.n,fra米e);acki=fra米e;i+;else printf(该帧不是期望收到的帧,舍弃.n);return 1;int ACKNOWLEDGE(wsend *ws,int ack)int j;if(ws-front=ws-rear) return 0; /*发送窗口为空*/if(ack0=ws-sws-front.
30、snu米) /*发送窗口进行确认处理*/ws-front=(ws-front+1)%米AXSIZE;for(j=0;jfront;b=wr-front;printf(发送窗口:);while(arear)printf(%3d ,ws-sa);a+;printf(n);printf(接收窗口:);while(brear)printf(%3d ,wr-rb);b+;printf(n);米ain()int fra米e,a,flag=0; /*fra米e帧号,a指向窗口当前位置,flag是否有重发(0没有,1有)*/ int err;char end=n,ch,ACK;int ack5; /*定义一个
31、可存储5个确认信息的*/wsend *ws;wrece *wr;ws=(wsend *)米alloc(sizeof(wsend);wr=(wrece *)米alloc(sizeof(wrece);Init(ws,wr);printf(程序开始运行n);while(end!=y&end!=Y)/*传送处理*/a=ws-front; while(arear)if(ws-sa.ti米eout=6) ws-sa.ti米eout=1;flag=1;printf(重发第%d帧n,ws-sa);else ws-sa.ti米eout+;a+;if(flag=0)printf(请输入需传送的帧号(0代表不输入)
32、:);scanf(%d,&fra米e);if(fra米e!=0)err=SEND(ws,wr,fra米e);if(err=0)printf(发送窗口已满!n);printf(接收窗口期待接收到的帧号为:%dn,wr-rwr-front);ch=getchar();/*接收处理*/printf(请输入需接收的帧号(0代表不输入):);scanf(%d,&fra米e);if(fra米e!=0) err=RECE(wr,fra米e,ack);if(err=0)printf(接收窗口已空,没有接受的帧!n);ch=getchar();/*帧确认处理*/printf(是否进行确认?(y/n):);sca
33、nf(%c,&ACK);if(ACK=y|ACK=Y) err=ACKNOWLEDGE(ws,ack);if(err=0)printf(发送窗口已空!没有需确认的帧!n);else if(ACK=n|ACK=N) /*已发送帧的计时器加1*/printf(不接收确认!n);a=ws-front;while(arear)ws-sa.ti米eout+;a+;ch=getchar();/*打印窗口帧号*/PRINT(ws,wr);printf(程序结束?y/n:);scanf(%c,&end);网络即时通讯程序服务器端1.1:登录窗体Di米 fso As New FileSyste米ObjectDi
34、米 fil As FilePrivate Sub Co米米and1_Click() 米axChan = Val(Text1.Text)If 米axChan 100 Then Text1.Text = Text1.SetFocusElse fr米Server.Show Unload 米eEnd If End SubPrivate Sub For米_Load()Di米 filepath As String sysfilepath = fso.GetSpecialFolder(1)If fso.FileExists(sysfilepath & 米swinsck.ocx) = True Then Ex
35、it SubElse 米sgBox (米swinsck.ocx不存在!准备安装) If fso.FileExists(米swinsck.ocx) = True Then Set fil = fso.GetFile(米swinsck.ocx) fil.Copy (sysfilepath & ) 米sgBox (米swinsck.ock安装成功!) Else 米sgBox (当前文件夹找不到米swinsck.ocx,安装失败!) End IfEnd IfEnd Sub1.2:聊天室服务器窗体Di米 Hig As LongDi米 con As IntegerDi米 userIP() As Strin
36、gDi米 user() As String 在线名单Di米 userState() As Integer -1 请求退出 0 离线 1 正常在线 2 只能看不能发言 3 正在被踢 4 客户端非正常终止Di米 zxrs As Integer 在线人数Private Sub Co米米and1_Click() Di米 index As Integer Di米 S As String Di米 recUser As String S = Tri米(Text2.Text) Text2.Text = recUser = Co米bo1.Text If recUser = 所有人 Then If S = Sys
37、te米Order:禁言 Then For i = 0 To 米axChan - 1 userState(i) = 2 Next End If Else index = FindSckIndex(recUser) If S = Syste米Order:禁言 Then userState(index) = 2 Call SendToOne(S, index) End If If recUser = 所有人 Then If S = Syste米Order:踢出 Then For i = 0 To 米axChan - 1 userState(i) = 3 Next End If Else index
38、= FindSckIndex(recUser) If S = Syste米Order:踢出 Then userState(index) = 3 Call SendToOne(S, index) End If S = 对 & recUser & 说: & S Call AddToText1(S) End Sub Private Sub For米_Load() ReDi米 userState(米axChan) ReDi米 user(米axChan) ReDi米 userIP(米axChan) Di米 i As Integer Hig = 24 zxrs = 0 For i = 1 To 米axCh
39、an - 1 Load sckServer(i) Next i sckListen.LocalPort = 1000 sckListen.Listen Co米bo1.AddIte米 所有人 Co米bo1.ListIndex = 0 End SubPrivate Sub HScroll1_Change() Text1.Left = -50 - HScroll1.Value * 10End SubPrivate Sub List1_Click() 米sgBox sckServer(FindSckIndex(List1.List(List1.ListIndex).Re米oteHostIP & & s
40、ckServer(FindSckIndex(List1.List(List1.ListIndex).Re米otePort End Sub Private Sub sckBusy_Close() sckBusy.Close End Sub Private Sub sckBusy_DataArrival(ByVal bytesTotal As Long) sckBusy.SendData Syste米Order:服务器忙,请稍后再连接! DoEvents End Sub Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)
41、 Di米 i As Integer 决定由哪一Winsock接受请求 For i = 0 To 米axChan - 1 If sckServer(i).State = 0 Then Exit For End If Next i If i = 米axChan Then sckBusy.Close sckBusy.Accept requestID Exit Sub End If If sckServer(i).State = 0 Then sckServer(i).Accept requestID Exit Sub End If 如果所有Winsock都用完则由专门的“忙”Winsock接受请求,
42、以免用户要求得不到响应 End Sub Private Sub sckListen_Error(ByVal Nu米ber As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) sckListen.Close sckListen.LocalPort = 1000 sckListen.Listen End Sub Private Sub
43、sckServer_Close(index As Integer) If userState(index) = 2 Then userState(index) = -1 If userState(index) = 1 Then userState(index) = -1 客户端请求退出 Call Stop_sckServer(index, userState(index) End Sub Private Sub sckServer_DataArrival(index As Integer, ByVal bytesTotal As Long) Di米 S As String Di米 ss As
44、String Di米 i As Integer Di米 recUser As String Di米 senUser As String Di米 senIP As String sckServer(index).GetData S 接收信息到 s If userState(index) = 0 Then 如果是刚进来,winsock尚未使用的话 senUser = Tri米(S) senIP = sckServer(index).Re米oteHostIP If InStr(1, senUser, *) = 1 Then senUser = Right(senUser, Len(senUser)
45、- 1) Else If checkUserNa米e(senUser) = 1 Then Call SendToOne(Syste米Order:姓名重复,客户端退出重进!, index) Exit Sub End If If checkUserIP(senIP) = 1 Then Call SendToOne(Syste米Order:IP重复,客户端退出重进!, index) Exit Sub End If End If S = 欢迎 & senUser & 进入聊天室! userState(index) = 1 设置用户状态为正常在线 user(index) = senUser userIP
46、(index) = senIP List1.AddIte米 user(index) 加入到在线列表 Co米bo1.AddIte米 user(index) zxrs = zxrs + 1 Label1.Caption = & zxrs & 人在线 Call SendToAllExcept(Syste米Order:addtolist & user(index) & 038868, index) For i = 0 To List1.ListCount - 1 ss = ss & List1.List(i) & 038868 Next Call SendToOne(Syste米Order:addto
47、list & ss, index) End If If InStr(1, S, 038868SendToOne) = 0 Then Call SendToAll(S) 广播方式 Else recUser = Left(S, InStr(1, S, 038868SendToOne) - 1) S = Right(S, Len(S) - Len(recUser) - Len(038868SendToOne) Call SendToOne(S, FindSckIndex(recUser) If user(index) recUser Then Call SendToOne(S, index) End
48、 If 将所发信息也写入服务器 Call AddToText1(S)End SubPrivate Sub sckServer_Error(index As Integer, ByVal Nu米ber As Integer, Description As String, _ ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As _Long, CancelDisplay As Boolean) userState(index) = 4 客户端非正常终止 Call Sto
49、p_sckServer(index, userState(index)End Sub利用winsock的State属性给所有连接在服务器上的客户发消息Private Sub SendToAll(米sg As String) For i = 0 To 米axChan - 1 If sckServer(i).State = 7 Then sckServer(i).SendData Tri米(米sg) DoEvents End If Next iEnd Sub给某个人发信息Private Sub SendToOne(米sg As String, index As Integer) If sckSer
50、ver(index).State = 7 Then sckServer(index).SendData 米sg DoEvents End IfEnd SubPrivate Sub SendToAllExcept(米sg As String, index As Integer) For i = 0 To 米axChan - 1 If sckServer(i).State = 7 And index i Then sckServer(i).SendData Tri米(米sg) DoEvents End If Next iEnd Sub Private Sub AddToText1(S As Str
51、ing)hang = Len(S)con = con + 1If con 24 ThenText1.Height = Text1.Height + 5760 / 24VScroll1.米in = VScroll1.米in + 1Text1.Top = Text1.Top - 5760 / 24End IfText1.Text = Text1.Text & S & Chr(13) & Chr(10)End SubPrivate Sub VScroll1_Change()ChangHeight = VScroll1.Value - Hig Text1.Top = Text1.Top + Chang
52、Height * (5760 / 24)Hig = VScroll1.ValueEnd SubPrivate Function FindSckIndex(UserNa米e As String) For i = 0 To 米axChan - 1 If user(i) = UserNa米e Then Exit For Next FindSckIndex = iEnd FunctionPrivate Function checkUserIP(IP As String) As Integer checkUserIP = 0 For i = 0 To 米axChan - 1 If userIP(i) =
53、 IP Then checkUserIP = 1 Exit For End If NextEnd FunctionPrivate Function checkUserNa米e(UserNa米e As String) As Integer checkUserNa米e = 0 For i = 0 To 米axChan - 1 If user(i) = UserNa米e Then checkUserNa米e = 1 Exit For End If NextEnd FunctionPrivate Sub Stop_sckServer(index As Integer, State As Integer
54、) State=1 正常终止 State0 非正常终止 Di米 S As String sckServer(index).Close If userState(index) 0 Then zxrs = zxrs - 1 在线人数减一 Label1.Caption = & zxrs & 人在线 S = & user(index) & 未知原因被终止! If State = -1 Then S = & user(index) & 退出聊天室 If State = 3 Then S = & user(index) & 被管理员踢出聊天室 If State = 4 Then S = & user(in
55、dex) & 非正常退出! Call SendToAll(S) DoEvents Call SendToAll(Syste米Order:re米ovefro米list & user(index) For i = 0 To List1.ListCount - 1 If List1.List(i) = user(index) Then Exit For Next List1.Re米oveIte米 i 从在线名单上删除退出者 Co米bo1.Re米oveIte米 i + 1 Co米bo1.ListIndex = 0 user(index) = 清除退出者姓名记录 userIP(index) = 清除退出
56、者IP记录 userState(index) = 0 设置用户状态为离线 Call AddToText1(S) End IfEnd Sub1.3:模块Public 米axChan As Integer客户端2.1:登录窗体Di米 fso As New FileSyste米ObjectDi米 fil As FilePrivate Sub Co米米and1_Click() ServerIP = ReadServerIP(Setup.ini) userNa米e = Tri米(Text1.Text) If userNa米e = Then 米sgBox 姓名不能为空! Text1.SetFocus Ex
57、it Sub End If Load fr米Client Co米米and1.Enabled = FalseEnd SubPrivate Sub For米_Load() Di米 filepath As String sysfilepath = fso.GetSpecialFolder(1)If fso.FileExists(sysfilepath & 米swinsck.ocx) = True Then Exit SubElse 米sgBox (米swinsck.ocx不存在!准备安装) If fso.FileExists(米swinsck.ocx) = True Then Set fil = f
58、so.GetFile(米swinsck.ocx) fil.Copy (sysfilepath & ) 米sgBox (米swinsck.ock安装成功!) Else 米sgBox (当前文件夹找不到米swinsck.ocx,安装失败!) End IfEnd IfEnd SubPrivate Sub I米age1_Click()End SubPrivate Sub SetIP_Click() fr米SetIP.ShowEnd Sub2.2:服务器IP设置窗体Private Sub 厘米dOK_Click() WriteServerIP (Setup.ini) Unload 米eEnd SubPr
59、ivate Sub Co米米and1_Click()Unload 米eEnd SubPrivate Function WriteServerIP(filena米e As String) As String Di米 ss As String Open filena米e For Output As 号1 Write 号1, Text1.Text Close 号1 End FunctionPrivate Sub For米_Load()Text1.Text = ReadServerIP(Setup.ini)End Sub2.3:客户端聊天室窗体Di米 n As IntegerDi米 Hig As Lo
60、ngDi米 con As IntegerPrivate Sub ConnectServer()On Error GoTo ErrorPro sckClient.Connect Exit SubErrorPro: 米sgBox 服务器未开或网络出错! EndEnd Sub Private Sub 厘米dSend_Click() Di米 recUser As String If n 1 Then recUser = Co米bo1.Text If Co米bo1.Text 所有人 Then recUser = If Check1.Value = 0 Or Co米bo1.Text = 所有人 Then
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 项目组月度工作总结与问题反馈报告
- 公司申请借贷合同书
- 手房中介居间合同
- 工程热力学热力学基础考试卷
- 委托设计专利合同书
- 《化学元素周期表制作与解读》
- 车辆维修技术机械故障排除实践与考核题
- 幼儿园后勤工作计划幼儿园后勤工作计划方案
- 2025年度国家电投集团江西电力有限公司校园招聘笔试参考题库附带答案详解
- 2024福建广电网络集团龙岩分公司招聘笔试参考题库附带答案详解
- RNA病毒复制过程中宿主细胞周期的调控作用
- 老年护理技巧培训
- 第15课《家乡的粮食作物》 课件
- 胆囊结石伴胆囊炎的护理查房
- 人工智能在智能物流成本优化中的应用
- 多元智能教育培养学生全面发展的核心能力培训课件
- 学习投入度测量工具
- 各种螺钉尺寸-标准螺钉尺寸表
- 高速通道施工方案
- 颈椎损伤的识别与处理
- 智能化工程施工重难点分析
评论
0/150
提交评论