论文部分内容阅读
一、实现目标
本聊天系统的设计采用了Client/Server模型,服务器端的一个服务地址用来监听对服务的请求,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。在本设计中,主要是实现服务器端跟客户端的简单字符交换,当实现连接后,客户端就能向服务器端发送和接收字符。
二、系统设计
1.模型及分析。本系统设计是基于TCP的。TCP是面向连接的可靠的传输协议,利用TCP协议进行通信,首先要经过三步握手,以建立通信双方的连接。一旦连接建立好,就可以进行通信。TCP提供了数据的确认和数据的重传机制,保证了发送的数据一定能够到达通信的对方。
2.C/S模型流程。在C/S模型的网络中,服务器是网络的核心,客户机是网络的基础,客户机依靠服务器获得所需要的网络资源,服务器为客户机提供网络所必须的资源。
3.系统设计及分析。在TCP/IP的网络应用中,通信的两个进程相互作用的主要模式是C/S模式,在Internet上的聊天系统是服务器提供服务端的连接响应,使用者通过客户端程序登录到服务器后,即可与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。程序要在TCP/IP环境下实现服务器端和客户端的两部分程序。在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面的三个文件,否则会出现编译错误:(1)WINSOCK.H:这是WINSOCK API的头文件,需要包含在项目中。(2)WSOCK32.LIB:WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。(3)WINSOCK.DLL:WINSOCK的动态连接库,位于WINDOWS的安装目录下。
(1)服务器端socket的操作。第一,初始化阶段调用WSAStartup()。首先定义一个WORD类型的变量,wVersionRequested,用来保存Winsock库的版本号,接着调用MAKEWORD宏创建一个包含了请求版本号的WORD值,之后调用WSAStartup函数加载套接字库。接下来判断wsaData.wVersion的低字节和高字节是否都等于1,如果不是我们所请求的版本,调用WSACleanup函数,终止对Winsock库的使用并返回。第二,创建套接字(Socket)。初始化WinSock的动态连接库后,需要在服务器端定义一个SOCKET类型的变量,用来接收socket函数返回的套接字。对socket函数来说,第一个参数只能是AF_INET;基于TCP协议的网络程序,需要创建的是流式套接字,将socket函数的第二个参数设置为SOCK_STREAM;将其第三个参数指定为0,该函数可根据地址格式和套接字类别自动选择一个合适的协议。第三,将套接字绑定到一个本地的地址和端口(bind)。为服务器端定义的该监听的Socket指定一个本地的地址及端口,这样客户端才知道要连接哪一个地址的哪个端口,为此要调用bind()函数。在绑定之前,定义一个SOCKET_IN类型的变量,然后对该地址结构变量的成员进行赋值。第四,将套接字设为监听模式(listen),准备接收客户请求。当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。Listen()函数使服务器端的Socket 进入监听状态,第一个参数是将要设置的套接字,第二个参数是可以建立的最大连接数(目前最大值限制为 5,最小值为1)。第五,等待客户请求到来,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。调用accept函数等待并接受客户的连接请求。此时,也需要定义一个地址结构体SOCKETADDR_IN的变量,用来接收客户端的地址信息。作为服务器端,它需要不断的等到客户端的连接请求,所以程序进入一个死循环,让服务器端程序能够不断运行。第六,与客户端进行通信(send/recv)。可以利用recv函数接收客户端发送的数据,调用send函数向客户端发送数据。第七,关闭套接字。服务器或客户机的任一端启动,调用closesocket()就可关闭通信连接,而要关闭Server端监听状态的socket,同样也是利用此函数。另外,与程序启动时调用WSAStartup()相对应,程式结束前,需要调用WSACleanup()来通知Winsock Dll释放Socket所占用的资源。
(2)客户端Socket的操作。第一,创建客户端的Socket。客户端应用程序首先调用WSAStartup()函数来与Winsock的动态连接库建立关系,然后调用socket()来建立一个TCP socket。socket函数第一个参数只能是AF_INET,socket函数的第二个参数设置位SOCK_STREAM,其第三个参数指定为0。第二,向服务器提出连接申请。对客户端来说,它不需要绑定,可以直接连接服务器端。调用connect()函数来提出与服务器端建立连接的申请,首先定义一个地址结构体变量,并对其成员进行赋值,设定服务器端的IP地址和端口。本程序中服务器端和客户端都是本地的,所以可以使用一个特殊的IP地址:127.0.0.1,这是本地的回路地址。第三,和服务器端进行通信。当建立连接后,就可以调用send函数向服务器端发送数据了,之后调用recv 函数接收服务器发送的数据。第四,关闭套接字。当完成通信后,调用closesocket函数关闭套接字,释放为此套接字分配的资源。最后调用WSACleanup函数,终止对套接字库的使用。
参考文献
[1]孙鑫,余安萍.VC++深入祥解[M].北京:电子工业出版社,2006:223
[2]谢希仁.计算机网络[M].大连:大连理工大学出版社,2004:79~80
本聊天系统的设计采用了Client/Server模型,服务器端的一个服务地址用来监听对服务的请求,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。在本设计中,主要是实现服务器端跟客户端的简单字符交换,当实现连接后,客户端就能向服务器端发送和接收字符。
二、系统设计
1.模型及分析。本系统设计是基于TCP的。TCP是面向连接的可靠的传输协议,利用TCP协议进行通信,首先要经过三步握手,以建立通信双方的连接。一旦连接建立好,就可以进行通信。TCP提供了数据的确认和数据的重传机制,保证了发送的数据一定能够到达通信的对方。
2.C/S模型流程。在C/S模型的网络中,服务器是网络的核心,客户机是网络的基础,客户机依靠服务器获得所需要的网络资源,服务器为客户机提供网络所必须的资源。
3.系统设计及分析。在TCP/IP的网络应用中,通信的两个进程相互作用的主要模式是C/S模式,在Internet上的聊天系统是服务器提供服务端的连接响应,使用者通过客户端程序登录到服务器后,即可与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。程序要在TCP/IP环境下实现服务器端和客户端的两部分程序。在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面的三个文件,否则会出现编译错误:(1)WINSOCK.H:这是WINSOCK API的头文件,需要包含在项目中。(2)WSOCK32.LIB:WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。(3)WINSOCK.DLL:WINSOCK的动态连接库,位于WINDOWS的安装目录下。
(1)服务器端socket的操作。第一,初始化阶段调用WSAStartup()。首先定义一个WORD类型的变量,wVersionRequested,用来保存Winsock库的版本号,接着调用MAKEWORD宏创建一个包含了请求版本号的WORD值,之后调用WSAStartup函数加载套接字库。接下来判断wsaData.wVersion的低字节和高字节是否都等于1,如果不是我们所请求的版本,调用WSACleanup函数,终止对Winsock库的使用并返回。第二,创建套接字(Socket)。初始化WinSock的动态连接库后,需要在服务器端定义一个SOCKET类型的变量,用来接收socket函数返回的套接字。对socket函数来说,第一个参数只能是AF_INET;基于TCP协议的网络程序,需要创建的是流式套接字,将socket函数的第二个参数设置为SOCK_STREAM;将其第三个参数指定为0,该函数可根据地址格式和套接字类别自动选择一个合适的协议。第三,将套接字绑定到一个本地的地址和端口(bind)。为服务器端定义的该监听的Socket指定一个本地的地址及端口,这样客户端才知道要连接哪一个地址的哪个端口,为此要调用bind()函数。在绑定之前,定义一个SOCKET_IN类型的变量,然后对该地址结构变量的成员进行赋值。第四,将套接字设为监听模式(listen),准备接收客户请求。当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。Listen()函数使服务器端的Socket 进入监听状态,第一个参数是将要设置的套接字,第二个参数是可以建立的最大连接数(目前最大值限制为 5,最小值为1)。第五,等待客户请求到来,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。调用accept函数等待并接受客户的连接请求。此时,也需要定义一个地址结构体SOCKETADDR_IN的变量,用来接收客户端的地址信息。作为服务器端,它需要不断的等到客户端的连接请求,所以程序进入一个死循环,让服务器端程序能够不断运行。第六,与客户端进行通信(send/recv)。可以利用recv函数接收客户端发送的数据,调用send函数向客户端发送数据。第七,关闭套接字。服务器或客户机的任一端启动,调用closesocket()就可关闭通信连接,而要关闭Server端监听状态的socket,同样也是利用此函数。另外,与程序启动时调用WSAStartup()相对应,程式结束前,需要调用WSACleanup()来通知Winsock Dll释放Socket所占用的资源。
(2)客户端Socket的操作。第一,创建客户端的Socket。客户端应用程序首先调用WSAStartup()函数来与Winsock的动态连接库建立关系,然后调用socket()来建立一个TCP socket。socket函数第一个参数只能是AF_INET,socket函数的第二个参数设置位SOCK_STREAM,其第三个参数指定为0。第二,向服务器提出连接申请。对客户端来说,它不需要绑定,可以直接连接服务器端。调用connect()函数来提出与服务器端建立连接的申请,首先定义一个地址结构体变量,并对其成员进行赋值,设定服务器端的IP地址和端口。本程序中服务器端和客户端都是本地的,所以可以使用一个特殊的IP地址:127.0.0.1,这是本地的回路地址。第三,和服务器端进行通信。当建立连接后,就可以调用send函数向服务器端发送数据了,之后调用recv 函数接收服务器发送的数据。第四,关闭套接字。当完成通信后,调用closesocket函数关闭套接字,释放为此套接字分配的资源。最后调用WSACleanup函数,终止对套接字库的使用。
参考文献
[1]孙鑫,余安萍.VC++深入祥解[M].北京:电子工业出版社,2006:223
[2]谢希仁.计算机网络[M].大连:大连理工大学出版社,2004:79~80