ImageVerifierCode 换一换
格式:DOCX , 页数:44 ,大小:417.63KB ,
资源ID:21325776      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21325776.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Linux下类似QQ聊天工具Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Linux下类似QQ聊天工具Word格式文档下载.docx

1、图 32 2、登录:如果协议为 login,则将用户名和密码信息提取,再遍历存放用户信息文件里的用户名和密码直到验证成功为止,如果验证成功则对所有在线的川户发送一条消息:“提示 XX 用户登录成功”;如果失败则只给登阳失败的客户端提示登录失败,并给出原囚,如“用户名不存在”或者“用户名或者密码输入错误”,并跳转到相应的代码执行其他功能,成功则等特发送客户端消息,失败则关闭 Socket 并结束线程,如图 33所示:图 33 3、监听和踢出客户端:通过六行和修改绑定的 Socket 和在线用户队列实现查看和踢出在线用户,踢出用户后向被踢出用户发送相关信息,如图 34、图 35 所示。图 34 图

2、 35 3.1.2.客户端客户端 客户端的输入和消息的显示要使用 2个终端,一个是 Client,一个是 Display。Client 终端为输入的界面。在这个界面里,新建一个线程来接受服务器端发来的消息,再添加时间信息,并将这些信息写入文件,然后给 Display进程发送一个消息,Display进程接到消息,就去读取文件并将这些数拟显示在 Display终端。打开客户端 Display终端界而,用 lseek将内部指 t 阵行向文件末尾,等待 Client 终端里的线秤将消息写入文件。一旦有消息过来就去文件里读取数据井打印在 Display终端。打开客户端 Client 终端界而,有 3 个

3、菜单,包括注册、登录、退出。选择相应项即可进幻相关操作,注册和登录如图 32、图 33 所示。3.1.3.协议协议 服务器端和客户端之间互相通信需要使用的协议:l、all$msg为给所有人发送消息。2、直接输入 view$获得在线用户列表。3、user$msg给用户名为 user的用户发送私聊消息。4、trans$user$filenam 将文件传输给 who。5、reg为注册。6、login 为登录。3.2.聊天聊天模块模块 3.2.1.客户端客户端 客户端在登陆成功之后在发送消息之前可以先查看在线用户列表,查看用户列表使用 view$,如所示。图 36 接着,可以使用 user$msg的形

4、式发送信息,这个消息是发送给 user的。或者,先使用 user$来切换到发送消息,这个时候,你不需要加上协议,即可给 user这个用户发送消息,如图 37、图 38 所示。图 37 图 38 当然,上述方法也可以实现一对多聊天。如所示。图 39 这些消息都加上协议 user$msg来封装成结构体,再发送给服务器端。3.2.2.服务器端服务器端 如果是私聊,则根据客户端要发送到哪个用户,到链表里取得该用户名的客户端信息,服务器再发送给相应的接收信息的客户端,接收信息的客户终端就会光将信息保存到聊天记录的文件里,并显示收到的信息,并且信息前面会显示相应的提示符。3.3.文件传输模块文件传输模块

5、3.3.1.客户端客户端 如果某个客户端想发送文件给其他客户端,则直接使用命令 trans$user$filename。trans 为协议,user为用户名,filename包括本地的路径和文件名。如图 310、图 311所示。图 310 图 311 3.3.2.服务器端服务器端 当发送到服务器的时候,根据协议,先给接收的客户端发送一条消息为 trans 标记:某某用户给您发送了 XX文件,Y接收 N 拒绝接收。如果客户端按下 N,则返回一条消息给服务器端,服务器端同时告诉发送的客户端对方拒绝接收文件。发送端可以继续做其他的事。如果接收的客户端按下 Y,并立即按受保存的路径和文件名。输入完后就

6、可以接收文件了。客户端返回一条消息给无误器端,服务器端同时返回一条消息给发送的客户端,告诉客户端对方同意接收文件,这时候文件开始传输;发送完毕后,发送的客户端会显示传输完毕。传输的文件可以使任意的文们。不仅仅是文本,多媒体文件也可以。第第 4 章章 实现实现 本设计由 C 语言实现,用 VIM 编译。/*check.h*/#include#include#include#include#include#include#include#include#include#include#define MAXLEN 1024 struct message char flag15;char name10

7、;int size;char msgMAXLEN;int reg_check(struct message*recievemsg);int login_check(struct message*recievemsg);/*check.c*/#include check.h int reg_check(struct message*recievemsg)int fd;int read_size,write_size;struct message cmpmsg;if(strlen(recievemsg-name)10|strlen(recievemsg-msg)20)return 1;if(str

8、cmp(recievemsg-name,all)=0)return-1;if(strcmp(recievemsg-name,reg)=0)return-1;if(strcmp(recievemsg-name,login)=0)return-1;if(strcmp(recievemsg-name,trans)=0)return-1;if(fd=open(user.txt,O_RDWR|O_CREAT|O_A,PPEND,0666)0)perror(open);printf(openn);return-2;do if(read_size=read(fd,&cmpmsg,sizeof(cmpmsg)

9、name,cmpmsg.name)=0)close(fd);return-1;while(read_size=sizeof(struct message);if(write_size=write(fd,recievemsg,sizeof(struct message)0)perror(write);close(fd);while(write_size!=sizeof(struct message)/write_size=0-writesize;lseek(fd,-write_size,SEEK_CUR);write_size=write(fd,recievemsg,sizeof(struct

10、message);printf(write file successn);return 0;int login_check(struct message*recievemsg)int fd;int read_size;if(fd=open(user.txt,O_RDONLY)0)perror(open);cmpmsg,sizeof(struct message)name,cmpmsg.name)=0)&(strcmp(recievemsg-msg,cmpmsg.msg)=0)close(fd);while(read_size0);/*void main()struct message send

11、msg;printf(input name:n);gets(sendmsg.name);printf(input mima:gets(sendmsg.msg);printf(%dn,reg_check(&sendmsg);/printf(%dn,login_check(&*/*client.c*/#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define MAXLEN 1024 struct message char

12、 flag15;struct msq long msg_type;char msg_text5;int qid=-1,fd=-1,sockfd,savefilefd=-1;char filefromname10;void handleQuit(int signal_no)if(fd 0)close(fd);close(sockfd);if(qid 0)if(msgctl(qid,IPC_RMID,NULL)0)printf(消息队列无法关闭n);exit(1);close(savefilefd);printf(程序正常退出n);raise(SIGQUIT);void cutStr(char s

13、tr,char left,int n,char right,int m,char c)int i,k,j;for(i=0;i n;i+)if(stri=c)break;if(i=n)i=-1;else memset(left,0,strlen(left);for(k=0;k i;k+)leftk=strk;for(j=i+1;j m;j+)if(strj=0)break;rightj-i-1=strj;lefti=0;if(j 0)printf(filedata.msg=%sn,filedata.msg);send(sockfd,&filedata,sizeof(struct message)

14、,0);else printf(读取文件失败,文件传输中止n);break;while(filedata.size 0);savefilefd=-1;void handlerecvmsg(int*sockfd)int connfd=*sockfd;int nread;char buf1024;char str1024;struct message recvmsg;time_t timep;struct msq msg;if(fd=open(chatlog.txt,O_RDWR|O_CREAT|O_APPEND)0)printf(打开聊天记录文件失败!);/printf(%dn,fd);if(q

15、id=msgget(2222,IPC_CREAT|0666)=-1)printf(创建消息队列失败n);msg.msg_type=getpid();strcpy(msg.msg_text,OK);while(1)nread=recv(connfd,&recvmsg,sizeof(struct message),0);if(nread=0)printf(与服务器断开了连接n);close(connfd);exit(0);else if(strcmp(recvmsg.flag,all)=0)time(&timep);sprintf(str,%s%s发给所有 人:%snn,ctime(&timep)

16、,recvmsg.name,recvmsg.msg);else if(strcmp(recvmsg.flag,sermsg)=0)time(&printf(%s服务器发给所有 人:timep),recvmsg.msg);continue;else if(strcmp(recvmsg.flag,view)=0)time(&printf(%s当前在线客户端:n%snn,ctime(&else if(strcmp(recvmsg.flag,trans)=0)pthread_t pid;if(strcmp(recvmsg.msg,agree)=0)strcpy(filefromname,recvmsg

17、.name);/创建线程发送文件 pthread_create(&pid,NULL,(void*)handlesendfile,NULL);else if(strcmp(recvmsg.msg,disagree)=0)printf(对方拒绝接收文件n);else if(strcmp(recvmsg.msg,noexist)=0)printf(该客户端不存在n);else strcpy(filefromname,recvmsg.name);printf(%s向你请求传名为%s 文件,是否同意接受?agree(同意)|disagree(不同意)n,recvmsg.name,recvmsg.msg)

18、;savefilefd=0;else if(strcmp(recvmsg.flag,transf)=0)int n;if(strcmp(recvmsg.msg,end$)=0)printf(文件传输结束n);else n=write(savefilefd,recvmsg.msg,recvmsg.size);/printf(recvmsg.msg=%sn,recvmsg.msg);while(n 0)lseek(savefilefd,n,SEEK_CUR);n=write(savefilefd,recvmsg.msg,recvmsg.size);else time(&sprintf(str,%s

19、%s发来的私聊消息:write(fd,str,strlen(str);msgsnd(qid,&msg,sizeof(struct msq),0);int main(int argc,char*argv)struct sockaddr_in server_addr;int port;int do_number;struct message a;char strMAXLEN;char bufMAXLEN;pthread_t pid;if(argc!=3)printf(请输入服务器 IP 和端口n);port=atoi(argv2);if(sockfd=socket(AF_INET,SOCK_STR

20、EAM,0)=-1)printf(创建 socket 失败n);signal(SIGINT,handleQuit);printf(-n);printf(|n);printf(|input a number to work|n);printf(|t1.loginttt|n);printf(|t2.registertt|n);printf(|t3.exitttt|n);scanf(%d,&do_number);gets(str);while(do_number!=1&do_number!=2&=3)printf(你输入的不是上面的选项,请重新 输入:if(do_number=3)close(soc

21、kfd);printf(程序已退出!bzero(&server_addr,sizeof(struct sockaddr_in);server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=inet_addr(argv1);server_addr.sin_port=htons(port);if(connect(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr)=-1)printf(与服务器无响应,请隔一段时间再 连接n);exit(2);if(do_number=1)

22、int n=3;while(n)printf(请输入你的用户名:scanf(%s,a.name);printf(请输入密码:scanf(%s,a.msg);strcpy(a.flag,login);/a.flag3=0;a,sizeof(a),0);printf(正在等待服务器应答.n);recv(sockfd,buf,MAXLEN,0);printf(接到服务器发来的信 息:%sn,buf);if(strcmp(buf,登录成功!)=0)/int i,j,k;pthread_create(&pid,NULL,(void*)handlerecvmsg,(void*)&sockfd);strcp

23、y(a.flag,all);while(1)memset(a.msg,0,strlen(a.msg);memset(str,0,strlen(str);strcpy(buf,a.flag);cutStr(str,a.flag,15,a.msg,MAXLEN,$);printf(标志信息为:%sn,a.flag);if(strcmp(a.flag,view)=0)send(sockfd,&strcpy(a.flag,buf);else if(strcmp(a.flag,trans)=0)&(savefilefd=0)/printf(f=%s,a=%s,s=%d,a.flag,a.msg,save

24、filefd);if(strcmp(a.msg,agree)=0)&(savefilefd=0)char savefilename20;/char savefileallname22;printf(请输入保存 的文件名,文件将保存在当前目录下!do gets(savefilename);savefilefd=open(savefilename,O_RDWR|O_CREAT|O_EXCL,0666);if(savefilefd=-1)printf(文件名可能存在请重新命名.n);while(savefilefd=-1);if(savefilefd 0)printf(创建文件失败!else strcpy(a.name,filefromname);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1