计算机网络课程设计(TCP协议聊天程序).doc
基于TCP协议制作聊天软件摘要本次计算机网络课程设计是要制作一个基于TCP协议的聊天软件。整个软件包括服务器和客户端两个部分。要实现多台计算机连接情况下的接收、发送字符串,就是指多台客户端连接到同一个服务器,以服务器为中端来进行通讯。在服务端,可以设置端口,查看客户端的人数和IP,能和指定的用户进行通信。在客户端,通过设置服务端的IP和端口号来来连接服务端,在客户端可以显示出是否已连接。当运行服务器时,在其它电脑上运行客户端,输入服务器主机的IP,连接到服务器,那么客户端与客户端之间即可实现简易的通讯功能,可以相互聊天,就像QQ那样进行互动。在课程设计中,我们利用Visual Basic 6.0编程工具来编写网络聊天程序。其中,我们将用到两个较新的控件:WinSock控件和StatusBar控件。Winsock是Mcrosoft windows提供的网络编程接口,它提供了基于TCP/IP协议接口实现方法,通过网络进行的数据通信,需要用地址来表示网络中的主机。StatusBar控件通常显示在窗体上所查看对象的信息、对象的组成或与对象操作有关的内容信息。我们在对客户端与服务器的界面进行简单的设计后,通过设置控件的属性并调用其方法就可方便地连接到一台远程机器上去,并能进行对话时,那么基于TCP协议的聊天软件也就完成了。我们的简易聊天软件可以实现多人在线聊天、查看聊天记录、清空聊天记录等等功能。关键字:Visual Basic 6.0 TCP协议 WinSock控件 StatusBar控件目录引言1一、背景介绍1二、TCP协议1三、Visual Basic Winsock控件介绍2四、Visual Basic StatusBar控件介绍2五、客户端/服务器模式2六、设计目的3基于TCP协议聊天软件的制作过程4一、客户端工作原理4二、服务器工作原理4三、设计客户端5四、设计服务器8五、可执行文件的生成10六、聊天软件的测试10七、总结12参考文献13引言一、背景介绍21世纪是一个以网络为核心的信息时代,要实现信息化,就必须依靠完善的网络。而随着计算机技术和通讯技术的发展,计算机网络已渗透到各个应用领域,其中最突出的,便是以TCP/IP协议为核心的Internet网络发展最为迅速。因此,计算机应用程序的开发也由传统单机处理模式,转向以多机通信为主的网络应用开发。二、TCP协议TCP协议(数据传输协议)允许创建和维护与远程计算机的连接,连接两台计算机就可彼此进行数据传输。TCP是因特网中的传输层协议,使用三次握手协议建立连接。当客户端发出SYN(TCP/IP建立连接时使用的握手信号)连接请求后,等待对方回答 SYN+ACK,表示接收到了这个消息,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接。 TCP三次握手的过程(如图所示)如下:1、客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。2、服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。3、客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。三、Visual Basic Winsock控件介绍本实验中用到Visual Basic 6.0中一个比较新的控件,就是Winsock控件。它主要用于将Winsock接口简化成易于使用的Visual Basic6.0内部接口。WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器并进行数据交换,这两种协议都能用来创建客户端和服务端应用程序。WinSock控件运行时没有一个可视的界面,创建客户端应用程序,它能在信息到达中央服务器之前把用户的信息收集起来;创建服务端应用程序,它能作为来自多个用户的数据一个集中处理点。本设计中,我们用的是TCP协议。TCP协议是一个基于连接的协议,就像电话机一样,用户必须在通话之前建立连接。四、Visual Basic StatusBar控件介绍一个StatusBar控件由Panel对象组成,每个Panel对象都可以包含文本或图片。StatusBar控件提供窗体,该窗体通常位于父窗体的底部,通过这一窗体,应用程序能显示各种状态数据。StatusBar最多能被分成 16 个Panel对象,这些对象包含在Panels集合中。在设计时,可以创建和自定义Panel对象的外观,在StatusBar控件的Properties Page中,选择Panel卡片就可以设置各种参数了。在运行时,可以根据应用程序的状态对Panel对象重新配置以反映不同的功能。一个StatusBar控件通常显示在窗体上所查看对象的信息、对象的组成或与对象操作有关的内容信息。StatusBar控件与其他控件如ToolBar控件一起,可以使你创建经济而又富含信息的用户界面。五、客户端/服务器模式C/S结构(Client/Server结构)是大家熟知的客户端和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构。服务器:(1)打开一通信通道并告知本地主机,它在某一公认地址端口上接受客户请求。(2)等待客户请求到达该端口。(3)接收到重复服务请求,处理该请求并发送应答信号。接收并发服务请求,要激活一新进程来处理这个客户请求。服务完成后,关闭此新进程与客户的通信链路,并终止。(4)返回第二步,等待另外的客户请求。(5)关闭服务器。客户端:(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发出服务请求报文,等待并接收应答;继续提出请求。(3)请求结束后关闭通信通道并终止。六、设计目的本课程设计的目标是用Visual Basic6.0设计一个基于TCP协议的聊天软件。我们利用Visual Basic Winsock控件和StatusBar控件实现。程序完成后最终生成服务器和客户端两个可执行文件,打开服务器可执行文件,即运行服务器,然后客户端可以与局域网上不同的主机上运行,输入服务器主机的IP,连接到服务器,客户端与客户端之间即可实现简易的聊天功能,在服务器可以显示在线人数以及客户端的IP地址。基于TCP协议聊天软件的制作过程一、客户端工作原理在运行服务器之后,运行客户端。客户端首先向服务器提出建立连接请求,然后建立一个套接字描述符,通过该描述符调用数据传输函数即可与服务端进行数据的收发。用户登录成功后,向服务器发送登陆消息,并更新本地在线用户列表,然后通过服务器实现与其他客户聊天;当客户退出,向服务器发送下线消息。客户端流程如图a。图b图a二、服务器工作原理首先运行服务器,服务器侦听端口消息,等待客户端向其建立连接的申请,一旦接收到客户端的连接请求,服务器将返回一个新的套接字描述符,通过该描述符调用数据传输函数即可与客户端进行数据的收发。服务器若接收的是登陆信息,向该用户发送在线用户列表,并更新服务器的在线用户列表;若收到的是发送信息,服务器解析信息,然后通过广播消息,向其所有线用户列表发送消息。服务器端流程图如图b。三、设计客户端客户端的程序编写: 1.在客户端创建一个新的工程将其命名为“客户”。 2.将缺省窗体命名为“客户”。 3.将窗体的标题改为“客户端。 4.在窗体中添加一个WinSock控件,默认其命名为Winsock1。 5.在窗体中添加四个richtextbox控件。默认其命名为Text1、Text2、Text3、Text4,并将其内容清空。6.在窗体中添加四个CommandButton控件。其命名默认为 Command1、Command2、Command3、Command4,并将它们的Caption属性分别修改为“连接”、“发送”、“断开”、“清空”。 7.在窗体上放四个Label 控件,其命名默认为Label1、Label2、Label3、Label4,并将它们的Caption属性修改为“编辑窗口”、“聊天记录”、“系统消息”、“服务器IP”。 8.在窗体上放一个StatusBar控件,其命名默认为StatusBar1其属性设置如下图所示:9.打开菜单编辑器,为窗体添加菜单,设置如下图所示:10. 在窗体中添加如下的代码:Option ExplicitPrivate Sub Command1_Click() '连接服务器程序段 Winsock1.RemoteHost = Trim(Text4.Text) Winsock1.Connect Command1.Enabled = False Do DoEvents Loop Until Winsock1.State = sckConnected Or Winsock1.State = sckError If Winsock1.State = sckError Then Command1.Enabled = True Winsock1.Close Text3.Text = Text3.Text + "与服务器连接失败" + Chr$(13) + Chr$(10) Else Text3.Text = Text3.Text + "与服务器连接成功" + Chr$(13) + Chr$(10) Command2.Enabled = True Command3.Enabled = True Text4.Enabled = False Text1.SetFocus StatusBar1.Panels(1).Text = " 连接到 " & Winsock1.RemoteHost & " " End IfEnd SubPrivate Sub Command2_Click() '发送消息程序段If Text1.Text = "" ThenMsgBox "不能发送空消息"Else Winsock1.SendData Text1.Text Text2.Text = Text2.Text + "我说的话: " + Text1.Text + Chr$(13) + Chr$(10) Text1.Text = ""End IfText1.SetFocusEnd SubPrivate Sub Command3_Click() '断开与服务器连接程序段 Winsock1.Close Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text Text4.Enabled = True StatusBar1.Panels(1).Text = " 无法连接. "End SubPrivate Sub Command4_Click() '清空聊天记录程序段Text2.Text = " "Text1.SetFocusEnd SubPrivate Sub exitname_Click() '点击File-exit,退出聊天EndEnd SubPrivate Sub Form_Load() '运行时最初显示的属性以及提示 Winsock1.RemoteHost = "218.192.165.192" Show MsgBox "Visual Basic Winsock Chat" & vbCrLf & "by chendf" & vbCrLf & vbCrLf & "Press Button'确定' , then Press Menu 'Help' for help.", vbInformation Winsock1.RemotePort = 1600 Command1.Enabled = True Command2.Enabled = False Command3.Enabled = FalseEnd SubPrivate Sub helpbutton_Click() '点击Help,弹出帮助文本ChDir App.PathShell "notepad.exe 使用必读.txt", vbNormalFocus '调用外部程序notepad.exe来打开帮助文本文件End SubPrivate Sub Winsock1_Close() '关闭winsock Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False Winsock1.Close Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.TextEnd SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '数据到达 Dim c As String Winsock1.GetData c, vbString Text2.Text = Text2.Text + "对方说的话: " + c + Chr$(13) + Chr$(10)End Sub四、设计服务器1. 在服务器端创建一个新的工程将其命名为“服务器”。2. 将缺省窗体命名为“服务器”。 3. 在窗体中添加一个ListBox控件,将其命名为“ListBox”。 4. 在窗体中添加一个WinSock控件,其名默认为Winsock1,并将其属“Index”,属性设置为0。设置完以后,Winsock1会变成Winsock1(0)。 5在窗体上添加两个Richtextbox控件,其名默认为Text2、Text3,将Text3初值设置为0。 6. 在窗体上添加三个Label控件,其名默认为Label1、Label2,Label3,并将它们的Caption属性改为“在线人数”、“客户端IP列表”、“服务器IP” 7.打开菜单编辑器,为窗体添加菜单file:8. 在窗体中添加如下代码:Private Gac() As BooleanDim Socknumber As Integer '定义变量Private Sub exitname_Click() '点击File-exit,退出聊天EndEnd SubPrivate Sub Form_Load() '开始运行时显示窗口的属性以及执行的操作 Winsock1(0).LocalPort = 1600 Winsock1(0).Protocol = sckTCPProtocol Me.Caption = "服务器" & "-" & Winsock1(0).LocalIP & ":" & Winsock1(0).LocalPort Winsock1(0).Listen Socknumber = 0End SubPrivate Sub Form_Unload(Cancel As Integer) 'unload时关闭winsock Winsock1(0).CloseEnd SubPrivate Sub Text2_Click()Text2.Text = Winsock1(0).LocalIP '显示本机服务器IPEnd SubPrivate Sub Winsock1_Close(Index As Integer) '关闭winsock Winsock1(Index).Close Unload Winsock1(Index) Gac(Index) = False Text3.Text = Int(Text3.Text) - 1End SubPrivate Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long) Dim ip As String Socknumber = Socknumber + 1 '连接请求 Load Winsock1(Socknumber) Winsock1(Socknumber).Accept requestID ReDim Preserve Gac(Socknumber) Gac(Socknumber) = True Text3.Text = Int(Text3.Text) + 1 ip = Winsock1(Index).RemoteHostIP ListIp.AddItem ipEnd SubPrivate Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim c As String '数据到达 Winsock1(Index).GetData c, vbString Dim i As Integer For i = 1 To UBound(Gac) If Not i = Index Then If Gac(i) Then Winsock1(i).SendData c DoEvents End If End If Next iEnd Sub五、可执行文件的生成点击“文件”“生成服务器.exe”即可生成服务器端的可执行文件。(客户.exe的生成方法相同),如下图所示:六、聊天软件的测试在一台计算机中运行服务器端程序,另一台计算机中运行客户端程序,由客户端进行连接并输入发送文本框中的数据,点击发送按钮。观察运行结果:同时,我们的聊天软件还可以实现一些其它的功能,如清空聊天记录:服务器可以单击自动显示自己的IP:七、总结这次的课程设计是制作简单聊天程序,在平日的生活学习中,可以说QQ等即时通讯软件已占据重要的位置,也深受大家的喜爱,所以这个课程设计很有现实意义,我们做起来也比较感兴趣。在具体做的过程中,参考了资料书还有网上的一些程序,虽然这个聊天程序的界面及功能比较简单,但从代码的编写及结果的调试成功还是花了很多的心思。虽然我们编写的这个程序虽然比较简单,但是它包括了整个TCP/IP的通信流程,通过完成它,对我们帮助很大,加深了对TCP/IP协议的理解。尤其是刚开始用Visual Basic 6.0软件的时候,从完全陌生到慢慢的了解,这其中的过程对应用方面知识的提高有很大的帮助。我们制作的聊天软件实现了如下基本功能:1、登录时只需要输入服务器IP。2、允许多人在线聊天。3、聊天发送的消息包括:用户名称和正文。4、某用户刚登录服务器时,服务器需对其发送实时在线用户列表。5、某用户登录或退出程序时都可显示“与服务器连接成功”和“与服务器断开”6、能够查看聊天记录、清空聊天记录。7、服务器无需查找服务器IP,自动显示本地IP。参考文献1来全,田保军 VB程序设计案例教程,北京,机械工业出版社 2012.9.12罗军舟,黎波涛,杨明 TCP/IP协议及网络编程技术,北京,清华大学出版社,2004.10.14