基于WinSock的局域网聊天室设计与实现

来源:教案设计 发布时间:2022-12-08 15:15:10 点击:

摘要:本文探讨一种基于Winsock的局域网通信工具——聊天室的设计与实现方法。Winsock 是Windows下的网络编程接口,是一个基于Socket 模型的API。文中分析了Windsock的结构以及利用Winsock实现数据通信的机制,从服务器端和客户端对局域网聊天系统进行设计,并用Visual C++予以实现。

关键词:socket Winsock 局域网 聊天室

中图分类号:G434 文献标识码:A 文章编号:1007-9416(2013)02-0134-02

1 前言

网络聊天已成为一种非常重要的交流方式,但大多都是基于Internet,通过公网进行交流存在信息安全隐患。开发自己的局域网通信工具成为一个理想的选择。基于Socket的局域网聊天室可以依托企业局域网提供一种良好、安全、快速的通信机制,其实现无需对企业原有的局域网部署进行改动,具有实现成本低廉、应用高效的优点。

2 实现的关键技术WinSock及其通信机制

2.1 关于WinSock

WinSock是由Sun Microsystems等几家公司联合制定的Windows下的Socket规范,已成为兼容当今流行操作系统的一种通用的网络编程接口。WinSock是一个基于Socket 模型的API,由Application、API和SPI组成。其中Winsock Application 指Windows 应用程序,Winsock API 指由Winsock 为用户提供的网络应用程序接口,Winsock SPI 指服务提供者接口层,即Winsock 的底层协议。[1]

2.2 基于Winsock的网络通信原理

利用Winsock 进行网络通信主要依赖于Windows 内部的消息传送机制,使用相关函数初始化、建立、配置和使用Socket。Winsock利用下层的网络通信协议及操作系统调用实际的通信功能,从而实现网络通信。以流式Socket为例介绍其工作过程。

服务器端:首先通过调用Socket()建立一个Socket对象;然后调用bind()函数将该Socket和本地网络地址联系在一起;再调用listen()函数使Socket做好侦听的准备;一旦Socket己建立,调用accept()函数等待一个连接,当一个请求到达时,accept()函数返回,服务器用交互或并发形式处理请求。

客户端:首先建立Socket对象,然后调用connect()函数和服务器建立连接;连接一旦建立,客户机和服务器之间就可以通过调用read()函数和write()数来发送和接收数据;最后,待数据传送结束时,调用close()函数关闭Socket。

3 聊天室系统工作流程设计及实现

3.1 系统工作流程

首先启动聊天室的服务端,然后启动客户端,设置登录信息连接服务器。进入聊天室后用户即可进行文字聊天。当用户发送信息后,服务器根据判断把收到的信息发送给在线用户。当用户进入、离开聊天室时,服务器会发送相应的消息通知。在线用户之间可以进行文件传输,在传输过程之中可以随时终止传输和添加新文件传输。

3.2 服务器端设计与实现

服务器端主要进行消息接受与转发,同时对关键数据进行显示,如:客户端连接与离开、消息转发、网络异常等。

服务器端首先建立Socket,然后绑定、监听Socket,如果有客户端进行连接请求,则返回当前所有在线用户信息,当客户端发送信息到服务端之后,由服务端对该消息进行转发,从而实现多人聊天。

3.2.1 创建监听SOCKET

if((Socket = WSASocket(AF_INET, SOCK_STREAM, 0,

NULL, 0,WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)

{

printf("WSASocket failed with error:%d\n",GetLastError());

return 0;

}

3.2.2 绑定地址

if (bind(SocketTemp, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR)

{

printf("bind() failed with error %d\n", WSAGetLastError());

return;

}

bind()函数的作用是将一个Socket和本地进程绑定。这样客户端才知道所要连接的是哪个地址和端口。

3.2.3 监听

if(listen(SocketTemp,5) == SOCKET_ERROR)

{

printf("listen() failed with error %d\n",WSAGetLastError());

return;

}

listen ()函数使服务器端的套接字进入监听状态,并设定可以建立的最大连接数。

3.2.4 服务器接受连接请求

if((Accepte=AAccept(Listen,(SOCKADDR*)&Socketclient,&len,NULL,0))== SOCKET_ERROR)

{

printf("WSAAccept() failed with error %d\n", WSAGetLastError());

return 0;

}

当没有连接请求时,就进入等待状态,直至有一个请求到达为止。Accept()在接收到连接请求之后,会为这个连接建立一个新的Socket来与对方通信,并把它作为返回值。

3.2.5 处理client发送的信息

创建好了服务器的处理线程之后,进行一个while(TRUE)的无限循环,用来读取与客户端通信的Socket上面的数据,首先判断Socket连接是否存在,如果Socket断开了,就把客户端离开消息发送给其他的客户端。若存在,根据端口上的数据类型进行处理:如果是接受消息(IO_RECV),则调用WSARecv读取Socket消息;如果是发送消息(IO_SEND),则判断消息类型,公聊消息就进行转发,私聊消息就把它发送给指定的接收者。[2]

3.3 客户端设计与实现

3.3.1 客户端程序设计

客户端主要是由CChatRoomApp、CChatRoomDlg、CCharRoomUi 3个类组成。CChatRoomApp完成窗口的注册和windows消息处理。CChatRoomDlg负责客户端的登陆界面,进行信息输入和发送。CChatRoomUi负责与其他用户进行文字聊天和文件传输,是客户端的核心类,所有主要功能都是在这个类中进行处理,包括Socket连接、数据处理、文件传输、服务器信息处理等。

3.3.2 向serve发送信息

客户端建立Socket的过程与服务端基本相同,但也有一些差异,如下:

服务器方:Socket()->bind()->listen->accept()->recv()/send()->close Socket()

客户端方:Socket()->connect()->send()/recv()->close Socket()

可以看到客户端不需要绑定端口和接收连接,与服务器端进行通信时也不需要使用多线程。

3.3.3 与其他客户端进行文件传输

在进行文件传输的时候,使用专门的Socket,而不是与服务器进行通信的Socket。[3]由于文件传输比文字传输更加复杂也占用更多的空间,这样既可以减轻服务端的压力,又使得文件传输效率更高。

4 结语

企业应用基于WinSock 的局域网聊天室进行通信,既可以保证信息安全,又大大减轻了文件服务器的负荷,增加了通信的灵活性。同时,基于Socket的局域网通信软件,不但可以满足传统的通信需求,而且也能扩展以适应新的网络应用,如网络教育,影音数据传输等,拥有广泛的应用前景。

参考文献

[1]周红进等.基于WinSock 的网络通信模块开发[J].电脑开发与应用,2003,16(10):4-5.

[2]曾松等.多线程局域网聊天程序的设计与实现[J].软件导刊,2008(2):71- 72.

[3]王晓鹏.TCP/ IP下的Socket及Winsock通信机制[J].航空计算技术,2004(6):126-128.

推荐访问:局域网 聊天室 设计 WinSock
上一篇:基于局域网的视频监控系统的设计与实现
下一篇:基于Java的校园局域网通信系统的设计与实现

Copyright @ 2009 - 2024 优泰范文网 All Rights Reserved

优泰范文网 版权所有 备案号:粤ICP备09201876号-1