基于TCP的多线程聊天室实现讲解_第1页
基于TCP的多线程聊天室实现讲解_第2页
基于TCP的多线程聊天室实现讲解_第3页
基于TCP的多线程聊天室实现讲解_第4页
基于TCP的多线程聊天室实现讲解_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于TCP的多线程聊天室实现Linux网络应用技术基于的多线程聊天室设计姓 名:李元池,宋权页9号:班级:14软工云计算4班基于TCP的多线程聊天室实现一:设计思想:创建通信套接字,进行对于客户端的监听,定义的有一个全局变量int user_fdMAX_USER;用来保存已经连接的用户的通信套接字;用户选择群聊的时候服务器会把接收到的信息发送给除了发送此消息的其他所有客 户端,用户选择私聊则通过服务器端定义的结构体struct user_messchar message100; char name20; intk; User10;中的k;来判断次编号对应的客户套接字,把此消息发送给指定的客户端

2、!利用shocket套接字进行对于信息的传递,同时 shocket套接字也是一种对于信息识别的判断依据,根据套接字可以找到接受的信息 的意图,并且进行处理相应的信息,而且服务器还可以通过对于shocket的识别,然后判断哪个客户发送的信息,然后进行转发个其他客户端,进而实现客户与客户之间的通信。服务器相当于一个对于客户端发送的信息进行转发的平台,当客户端的信息发送过来后,服务器会自动通过套接字将信息在全部转发给其他的客户,实现客户端之间的通信二:流程图三:分工合作基于TCP的多线程聊天室实现李元池负责服务器端的编写,宋权负责客户端的编写,在写的过程中商量好用于收发 消息的结构体保持一致。四:运

3、行步骤及注意事项:在服务器开启监听服务之后,启用客户端段进行连接,服务器程序编译:gcc 2_sever.c sever Tpthread运行:./s客户端程序编译:gcc 1_client.c client -pthread运行:./c+服务器的IP+端口号+你的昵称目前代码存在的问题有:用户昵称重复处理;异常退出处理;五:运行截图开启一个服务器和三个客户端昵称分别为:李元池,更渊博,许阳,1:(群聊)李元池发送一个”Hello!everybody! ”的消息:文件(日 编辂曰 査看ty)标wjtfi(H)文啊曰 漏娴E)童看仪】 魏埼m *s(a)帮助出nMtlocalhost T# cd

4、 liyuanchi/I rMWlocaIhost llyuanchi# 肚 期阳更 澜馬 WWW衽辅入清息洁回卓椁后再丽入川户零户搞的塢号送入社叩 黄送ift对应厠户 当软入J肿时偵为为群麒!输入料B为quit的时健退岀谨富II天:T恤人罢倉送的信息;働到来目李元池; Hellulevevrtwdy! (12;39;55rontilDcallhcist -J# cd liyuanchi/rw-tlQGalho5t liyoanchi# /X 127Pe,l 3S59 李元池 娶元港在耦入消恳后回车,撚后再输人用户容户端的集号逬入和和 岌送绪对敢用户 当S A-1的时候为,

5、淘爭即F隔.扎消息为即Mt的时倾退出该聊天室编入査議退的憎息:Hello reveurbody!J揃人赛叢送的恼息:ro-::t -i 1 门:: arPi ost: = 1 iyi.ja n ch iroot瞬 1 oca 1 host: liyuanchi文侍(日 sn)as-(y)终绷口 祈蛊切文件(巳瞬匡)SXY)终嫩D标盤值)幡韵也(radtlo亡日Ibid呂 t fJ# 亡d liyuanChi/froot!ocalh&st liyuanchi# Vc药卿 许阳itEB在辅人滑息后回车,懷后再输入用户容户建的出号逋入孔卵 览送蛤对庄耳 当辅人7的时侯右,丸群期f输入汹B为quit的

6、时帳退出垓即天室辅入要炭送的佰息:收到未自率元It的消見:Hellolevevrbody! (12:3&-55(raoocaIhbs t )# Cd liyuahChi/roctlucalhost liyuamwhj# P/s 等得吾戶端连揑 新消忌:容户已连按 新清J6 :容户趙2己建搏新消息s喜户箱弓已连擾 抿收未自容户矣1李元迪的沖B i Hello!evevrbody! 12:M-SS2 :私聊:李元池给客户端 2更渊博发送消息:基于TCP的多线程聊天室实现丈fH日編址旧查看切缪SSCD瞬(时叨助H)文件迂)蹄a#(y)住鎖cd 标釘旦)帮斬也rwtlalhD5t 豪 cd liyua

7、nchi/(rocitl&ca Ihos t -)# cd liyuanchi/raatlac-alhost 1 iyunchj W . /c 127, S.fl. 1更潤価?M-n在特入消息后囿丰,feSJ&SSfcA用户客尸進的堀号,逛A.馳砂境送蜡对应用户 当揃人7貯时侯打为群输入油息向quit的时摆退岀煜刖天豆晞入要廉送的牯息:牧和来自藝元祂的消息L Hello(evtwrbady! (12j35:55J征辅人沽血后回车.榕后再崗入用户君户館的堀号,进入农卿規走蛤对应用户 当Sft人-1的时就为.为柑冲1掃A,筒总为quit的吋侯退,=谨卿无室 同人旻炭送的信息:HeLLalevBvr

8、toody* -1罚人賁壤送的愴息:HH许阳蘭人要忠送的信農:匸枝却東门主元能的濟丸H1I许阳(和,瓷消总)(12:431 4? raotlca)hOiSt:-/1lyuflnchi文杵倒 垢融曰 直看也)墟制J 标图创 却血1応丈件(目勵站E】古看便ift(I) KrS(fi)幣助(也|ocalhost J# cd liyuanchi/roatilocalhost liyuanchi# ./c 36B9 祥阳 样阳在输入晴息后回车撤后再轲人用户君户騙前塢号进入和卿 发送蜡对应用户 当辅入1的时候为为辟聊!输入衲息为quit前时攸退岀谆則天空林扎竟炭送的僧息:收到未自李元沌

9、的消息? HellffSevevrlMdyl (1239:55nootlocallwst =# cd liyuanchi/rootelocaUwst liyuanchi./s苓待香户鋼诲按新洁.电:n卢端1己is播浙溶JB L吾户S2BiSffl船沽息:客户購3己连按播收来自E户端1,声元池的消息3 Hellolevevrbtxly I (12 :39:55)捋妝牙.自净户调1丰元建的淸自;Hil许阳赴茁淸J& ) (12:43:473:许阳给客户端1,李元池发送消息:(? )?嗨 boby !J文件 塢凶E)査看(业)终端CD 标筈 *SHh(U)rootglocalhost T# cd l

10、lyuanchi/rootlDcalhast liyuanclhi* ./ 1270.01 3&89 甲瀾 flj 更润博在输入消息后回丰然后再编入用户善户端的逅号入象聊 岌送蛤对应用户 当输入1的対帳为8为楙聊T柿入消息为quit的时帳退出倭口黃至输入!FSi送的倍息:收到衆自爭元袍的消息:H电UE购tvEntiy !12:39:55|rootltocailho5t # c=10;j/=10)power*=10;for(;power0;power/=10)*stri ng+=0+i/power;i%=power;*stri ng=0;void show_system_time() /得到当前

11、系统时间time_t timep;七:附录 客户端代码! /Clie nt.cpp#i nclude#in clude #in clude#in clude#in clude#in clude#in clude #in clude#in clude#in clude#in clude#defi ne MAX_SIZE 100void *se nd fun (void *arg);struct tm *p_curtime;基于TCP的多线程聊天室实现char *time_tmp;bzero(&(clie ntaddr.si n_zero),0);time_tmp=(char *)malloc(2

12、);if(clie ntfd = socket(AF_INET,SOCK_STREAM,0) = -1)memset(time_tmp,0,2);/绑定客户端套接字time(&timep);p_curtime = localtime(&timep);perror(socketn);exit(1);prin tf(%d:%d:%d)n,p_curtime-tm_hour,p_curtime-tm_mi n, p_curtime-tm_sec);if(conn ect(clie ntfd,(struct sockaddr*)&clie ntaddr,sizeof(struct sockaddr)

13、= -1) / 连接服务端struct user_message um;struct user_messageperror(c onn ectn);exit(1);char message100;char n ame20;elseint l;用户标识men u();pthread_t th1,th2;void men u()if(pthread_create(&th1,NULL,se nd_fun ,(void*)&clie ntfd)printf(t在输入消息后回车,n);perror(create thread fail);printf(t然后再输入用户客户端的编号,进入私exit(1);

14、聊发送给对应用户n);printf(t当输入-1的时候为,为群聊!n);if(pthread_create(&th2,NULL,recv_fu n,(voidprintf(t输入消息为quit的时候退岀该聊天室*)&clie ntfd)n “);perror(create thread fail);int main (i nt argc, char *argv)exit(1);struct sockaddr_ in clie ntaddr;/ 定义地址结构pthread _joi n(th1,NULL);pid_t pid;pthreadoi n(th2,NULL);int n,clientf

15、d;/定义客户端套接字as: return 0;struct hoste nt *host;char *buf,*buf_r;void *se nd_fu n( void *arg)if(argc 群聊):);host = gethostbyname(argv1); 服务器 IPsca nf(%d,&um.l);if(um.l!=-1)clie ntaddr.sin_family = AF_INET;strcat(um.message,(私密消息);clie ntaddr.s in _port = hton s(ui nt16_t)atoi(argv2);int n = sen d(sfd,(

16、char *)&um,sizeof(um),0);clie ntaddr.s in _addr = *(struct in _addr *)host-h_addr);if(n!=sizeof(um)基于TCP的多线程聊天室实现prin tf(se nd fail!n);void *recv_fu n( void *arg)int sfd = *(i nt *)arg);/char recv_message100;struct user_message my;while(1)int n = recv(sfd,(char *)&m y,sizeof(my),0); if(n=-1)prin tf(

17、recv fail!n “);exit(1);get_system_time(time_str);printf(n 收到来自%s的消息:%s,my. name,my.message);show_system_time();服务器端代码!/Sever.c#i nclude #in clude #i nclude #in clude #in clude #in clude #i nclude #i nclude #in clude#defi ne MAX_LINE 100#defi ne MAX_USER 10int user_fdMAX_USER;struct user_messchar mes

18、sage100;char n ame20;int k;void show_system_time() /得到当前系统时间time_t timep;struct tm *p_curtime;char *time_tmp;time_tmp=(char *)malloc(2);memset(time_tmp,0,2);time( &timep);p_curtime = localtime(&timep);prin tf(%d:%d:%d)n,p_curtime-tm_hour,p_curtime-t m_mi n, p_curtime-tm_sec);void *recv_fu n(void *ar

19、g)int fd = *(i nt*)arg);struct user_mess um;int k;while(1)int n = recv(fd,(char *)&u m,sizeof(um),0); int i;if(n=-1)prin tf(recv fail!n); exit(1); for(i=0;iMAX_USER;i+)if(fd=user_fdi) break;printf(接收来自客户端 %d,%s的消息:%s,i,,um.message);show_system_time(); prin tf(n);if(um.k=-1)基于TCP的多线程聊天室实现for(i=0;iMAX_USER;i+) if( (user_fdi!=fd) & (user_fdi!=-1) sen d(user_fdi,(char*)&um,sizeof(um),0);elsesen d(user_fdum.k,(char*)&um,sizeof(um),0);int mai n()struct sockaddr_ in sin;struct sockaddr_ in cin;int l_fd;sockle n_t len;char bufMAX_LINE; 缓存区 char addr_p16;/ 存储客户端 IPun sig ned short int port

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论