欢迎来到天天文库
浏览记录
ID:25454195
大小:85.57 KB
页数:12页
时间:2018-11-20
《linux下网络即时聊天程序-》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、基于TCP协议的简易网络聊天程序一、设计原理: 即时通信(IM)是指能够即时发送和接收互联网消息等的业务。自1998年面世以来,特别是近几年的迅速发展,即时通信的功能日益丰富,逐渐集成了电子邮件、博客、音乐、电视、游戏和搜索等多种功能。即时通信不再是一个单纯的聊天工具,它已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台。本课题实现简单的及时通讯中的聊天服务。 问题定义:本课题要解决的问题是提供用户自由向另外一个不同的用户发消息的同时接收来自其他用户的消息。 2.可行性研究
2、: 要实现即时通讯的聊天模块,可以在LINUX下搭建服务器,在提供给用户客户端程序。客户端和服务器之间通过TCP协议实现在线聊天。 需求分析: (1)为了实现即时通讯的聊天服务,聊天服务器必须能够同时接入多个用户,所以要支持并发,允许同时在线客户端数量至少大于3个。(2)要求服务器能接收多个用户的接入请求同时处理已经建立连接的用户的操作。(3)接收用户发过来的信息。(3)正确转发信息到达正确的用户。(4)提供简单的用户操作指令比如显示实时在线的用户。(5).来自不同用户的信息的转发的同步控制(6)。给每个用户一个唯
3、一的ID。 4.总体设计 首先我们应该在设计LINUX平台设计服务器并且C语言编程。在实现并行处理时可以使用多进程也可以使用多线程,多线程可以方便的实现不同连接间简易的通信,系统开销小所以这里选用它。在连接的协议选择上,因为传送数据量小,这里选择面向连接可靠传输的TCP协议,相比将套接字嵌入FILE留种,这里使用调用常用的tcp的套接字API(send,recv)读写缓冲区实现连接的方法. 5.详细设计客户端:首先用户提供服务器IP和端口,然后创建套接字并连接到服务器,连接成功给予操作界面。设计用户登陆接口函数,发
4、送名字用于登陆处理。主进程挂载随时接收用户键盘输入,并调用SEND()函数处理发送和指令操作。创立一个线程用于挂载阻塞的recv();将收到的信息打印。 服务器:服务器创建通用的服务器套接字绑定IP和端口,主进程监听和循环接受客户端接入请求。接入用户后创建线程传入套接字,并接收用户的登陆。登陆处理后讲该线程绑定一个用户ID,并创建一个线程用于挂载RECV();第一个线程处理要发给本连接绑定用户的转发服务。同时设计在线用户的更新和打印处理。使用互斥锁来解决写入的同步控制问题,在更改全局变量时候锁住,当转发完毕时,解锁。
5、6.编码和单元测试编码见代码和流程图。测试没有截图,提列测试出现的部分问题:(1)段错误(核心已转储),原因:字符串处理函数字符串数组与字符串指针的调用问题。改进:数组统一换字符串指针,分配空间。(2)初始值设定不是常量,原因初始化在main()开始前执行。改进:结构体分配在主函数里分配空间。(3)当recv()从缓冲器COPY的数据产生粘包。原因:没有消息边界,解决:每次收发大小固定住。(4)连接关闭处理。解决:设置套接字收发的标志位获取退出原因,友好退出时套接字函数返回0。二、运行方法说明、运行结果 运行方法:linu
6、x下编译服务器gccserver.cdie.c-lpthread-oserver.out Linux下编译客户端gccclient.cdie.c-lpthread-oclient.out 服务器运行server.out<端口号/服务名称> 客户端运行client.out<服务器地址><端口号/服务名称> 服务器运行成功后有提示,客户端运行成功并登陆成功后有欢迎界面。用户可以输入LIST命令来获得在线用户列表。用户可以输入CLOSE来退出程序。运行结果:能达到设计要求,运行速度正常。 三、流程图客户端流程图开
7、始创建、设置套接字Connect();创建、设置套接字Nameland();执行threadmain()Pthread_creat();接受键盘输入Recv()定长数据是否输入为”close”打印信息yesnoSend();定长数据Close(sock)结束服务器流程图开始创建、设置套接字Bamd();Listrren();执行threadmain();Accept()传入套接字和idWhile(1)执行threadmain();线程指定id传入套接字创建clientsockWhile(1)用户名登陆处理Pthread_cra
8、et();Recv()定长数据If(recv!=0线程指定idClose(serversock)更新用户名列表判断收到的信息根据不同内容进行封装结束Pthread_crreat();While(1)封装信息,ID=idIf(ID==id)Close(clientsock)更新
此文档下载收益归作者所有