论文部分内容阅读
摘 要:聊天程序模块主要是负责程序的通信,是数据传输的基础,其本质就是在数据的通信双方发送和接收数据,主要介绍了普通聊天程序中最主要的聊天模块的实现原理。
关键词:聊天程序;通信;数据传输
中图分类号:TB文献标识码:A 文章编号:1672-3198(2012)12-0166-01
聊天程序是Socket网络编程的基本应用形式之一,其本质就是在数据的通信双方发送和接收数据,然后利用VC++6.0中的CSocket来编写基于UDP协议的局域网聊天程序。
1 聊天软件模块的通信模型
首先,介绍两台计算机通信模型,即聊天程序基本的模型。其中一台是客户机,另一台是服务器,所有必需的软件都装在客户机上。这样,客户机就可以进行电子邮件的发送和接收,浏览网页或者从FTP服务器上下载相关文件,这些软件共存于同一台计算机中并且彼此之间相互不影响。而另一种软件则安装在服务器上,这种软件主要是向远程客户端计算机提供相应的服务。服务器可以同时响应多个客户计算机的请求,或者是能够在同一个时间处理过多个来自客户机的请求。
再者,由于Socket技术使得可以同时稳定运行几个Internet应用程序成为了可能。Socket是个程序设备,它允许用户通过TCP/IP端口为某个网络应用程序接收或者发送数据。程序根据需要产生足够数量的Socket,但是每一个Socket必须对应一个TCP/IP端口。客户机产生一个Socket并随机分配它一个TCP/IP端口,该Socket就利用该端口进行工作。但是在服务器端,不是这样的工作,服务器的应用程序需要预先定义好的TCP/IP端口来工作的,比如:FTP服务器的端口号是21,WWW服务器的端口号是80等等。
最后,本程序主要的数据传播形式是局域网广播,对于TCP/IP实现来说,要想实现局域网内的广播通信,首先必须设置好子网掩码和广播地址,这样底层网络才能够接收到广播信息。现行的TCP/IP是通过IP地址来对计算机进行识别的,IP地址分为标示网络的网络标识编码和标识网络内惟一主机的主机标识编码两部分。子网掩码是IP地址中对应网络标识的编码各位为1,对应的主机标识编码的各位是为0的一个4字节数;广播是主机标识编码为全1的IP地址。此程序并不是严格意义上的广播,只是运用了IP单播的概念,对信息进行复制重复发送。
2 CSocket网络编程的基本原理
CSocket继承了CAsyncSocket,是Windows Socket API的高层抽象,CSocket通常和CSocketFile以及CArchive类混合使用,这两个类主要负责数据的发送和接收。
CSocket提供了阻塞式的访问方式,这一点对于CArchive的同步操作来说是必需的。类成员的阻塞函数,例如Receive()、Send()、RecerveFrom()、SendTo()和Accept()不会像Windows中的函数一样返回WASEWOULDBLOCK的错误。取而代之的是,这些函数会自己等待直到操作完成。如果在这些阻塞函数正在等待的时候,应用程序调用了CancelBlockingCall函数,那么这些阻塞函数将会完成等待并返回WSAEINTR的错误。
要使用CSocket对象,首先调用构造函数,然后调用Create函数创建一个Socket句柄。Create函数取胜创建一流Socket,如果没有使用CArchive类,那么还可以创建一个数据报Socket。服务器端调用Accept,客户端调用Connect,然后创建一个CSocketFile去关联CSocket。下一步就可以创建一个CArchive对象关联CSocketFile,用来发送和接收数据。
3 聊天模块实现
首先定义集成于CSocket类的两个子类CServerSocket和CClientSocket,其中CServerSocket类用于服务器端,最主要的功能是重载CSocket类的OnAccept函数来接受客户端的连接请求,在此函数中可直接编写对接收到的连接请求的处理代码,也可以调用别的类中对连接请求的处理函数:CClientSocket类是一个会话Socket,在此类中结合CArchive和CSocketFile进行串行化,定义两个CArchive类的对象m_aSessionIn和m_aSessionOut及CSocketFile对象m_sfSocketFile,将CArchive对象关联到CSocketFile对象,m_aSessionIn用于信息接收,m_aSessionOut用于信息的发送。CClientSocket类重载OnReceive函数勇于接受对方发送的数据,即对方的聊天内容,数据存储于m_aSesionOut,使用m_aSessionOut->Flash()函数将数据写入发送缓存,准备向对方发送。这两个CSocket子类已经包含进行聊天所需要的全部功能
最后是在主程序中进行组织。在主程序中定义CServerSocket类和CClientSocket类的对象,然后根据以上对这两个类的分别调用响应函数完成相应功能。
其中,关于聊天程序的中断开连接和错误处理进行特别的说明,因为这两部分对于整个系统调试和运行都非常重要。
关于错误的处理,主要是针对调试时可能出现的错误的预先分析,能够在程序出现相关编译错误时,知道哪里出现编程错误。同时,也能够对于一些常见错误进行处理,使得程序更加的完善。一共有两种需要注意的错误。一种是应用的协议的错误,当使用了不正确的命令就会产生这个错误,可以从服务器返回的消息代码中得之此类的错误。另一种错误是Csocket错误,对于这类错误,Csocket类就会产生一个Error事件,可以调用一个函数进行对此种的错误的处理。
4 结语
聊天程序模块作为聊天程序中最重要的模块,负责整个系统的通信功能,其模块程序的完整性、严谨性是比较重要的,如何对其通信原理进行完善是今后软件开发的方向。
关键词:聊天程序;通信;数据传输
中图分类号:TB文献标识码:A 文章编号:1672-3198(2012)12-0166-01
聊天程序是Socket网络编程的基本应用形式之一,其本质就是在数据的通信双方发送和接收数据,然后利用VC++6.0中的CSocket来编写基于UDP协议的局域网聊天程序。
1 聊天软件模块的通信模型
首先,介绍两台计算机通信模型,即聊天程序基本的模型。其中一台是客户机,另一台是服务器,所有必需的软件都装在客户机上。这样,客户机就可以进行电子邮件的发送和接收,浏览网页或者从FTP服务器上下载相关文件,这些软件共存于同一台计算机中并且彼此之间相互不影响。而另一种软件则安装在服务器上,这种软件主要是向远程客户端计算机提供相应的服务。服务器可以同时响应多个客户计算机的请求,或者是能够在同一个时间处理过多个来自客户机的请求。
再者,由于Socket技术使得可以同时稳定运行几个Internet应用程序成为了可能。Socket是个程序设备,它允许用户通过TCP/IP端口为某个网络应用程序接收或者发送数据。程序根据需要产生足够数量的Socket,但是每一个Socket必须对应一个TCP/IP端口。客户机产生一个Socket并随机分配它一个TCP/IP端口,该Socket就利用该端口进行工作。但是在服务器端,不是这样的工作,服务器的应用程序需要预先定义好的TCP/IP端口来工作的,比如:FTP服务器的端口号是21,WWW服务器的端口号是80等等。
最后,本程序主要的数据传播形式是局域网广播,对于TCP/IP实现来说,要想实现局域网内的广播通信,首先必须设置好子网掩码和广播地址,这样底层网络才能够接收到广播信息。现行的TCP/IP是通过IP地址来对计算机进行识别的,IP地址分为标示网络的网络标识编码和标识网络内惟一主机的主机标识编码两部分。子网掩码是IP地址中对应网络标识的编码各位为1,对应的主机标识编码的各位是为0的一个4字节数;广播是主机标识编码为全1的IP地址。此程序并不是严格意义上的广播,只是运用了IP单播的概念,对信息进行复制重复发送。
2 CSocket网络编程的基本原理
CSocket继承了CAsyncSocket,是Windows Socket API的高层抽象,CSocket通常和CSocketFile以及CArchive类混合使用,这两个类主要负责数据的发送和接收。
CSocket提供了阻塞式的访问方式,这一点对于CArchive的同步操作来说是必需的。类成员的阻塞函数,例如Receive()、Send()、RecerveFrom()、SendTo()和Accept()不会像Windows中的函数一样返回WASEWOULDBLOCK的错误。取而代之的是,这些函数会自己等待直到操作完成。如果在这些阻塞函数正在等待的时候,应用程序调用了CancelBlockingCall函数,那么这些阻塞函数将会完成等待并返回WSAEINTR的错误。
要使用CSocket对象,首先调用构造函数,然后调用Create函数创建一个Socket句柄。Create函数取胜创建一流Socket,如果没有使用CArchive类,那么还可以创建一个数据报Socket。服务器端调用Accept,客户端调用Connect,然后创建一个CSocketFile去关联CSocket。下一步就可以创建一个CArchive对象关联CSocketFile,用来发送和接收数据。
3 聊天模块实现
首先定义集成于CSocket类的两个子类CServerSocket和CClientSocket,其中CServerSocket类用于服务器端,最主要的功能是重载CSocket类的OnAccept函数来接受客户端的连接请求,在此函数中可直接编写对接收到的连接请求的处理代码,也可以调用别的类中对连接请求的处理函数:CClientSocket类是一个会话Socket,在此类中结合CArchive和CSocketFile进行串行化,定义两个CArchive类的对象m_aSessionIn和m_aSessionOut及CSocketFile对象m_sfSocketFile,将CArchive对象关联到CSocketFile对象,m_aSessionIn用于信息接收,m_aSessionOut用于信息的发送。CClientSocket类重载OnReceive函数勇于接受对方发送的数据,即对方的聊天内容,数据存储于m_aSesionOut,使用m_aSessionOut->Flash()函数将数据写入发送缓存,准备向对方发送。这两个CSocket子类已经包含进行聊天所需要的全部功能
最后是在主程序中进行组织。在主程序中定义CServerSocket类和CClientSocket类的对象,然后根据以上对这两个类的分别调用响应函数完成相应功能。
其中,关于聊天程序的中断开连接和错误处理进行特别的说明,因为这两部分对于整个系统调试和运行都非常重要。
关于错误的处理,主要是针对调试时可能出现的错误的预先分析,能够在程序出现相关编译错误时,知道哪里出现编程错误。同时,也能够对于一些常见错误进行处理,使得程序更加的完善。一共有两种需要注意的错误。一种是应用的协议的错误,当使用了不正确的命令就会产生这个错误,可以从服务器返回的消息代码中得之此类的错误。另一种错误是Csocket错误,对于这类错误,Csocket类就会产生一个Error事件,可以调用一个函数进行对此种的错误的处理。
4 结语
聊天程序模块作为聊天程序中最重要的模块,负责整个系统的通信功能,其模块程序的完整性、严谨性是比较重要的,如何对其通信原理进行完善是今后软件开发的方向。