基于字符的聊天程序.docx
- 文档编号:30627362
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:8
- 大小:348.29KB
基于字符的聊天程序.docx
《基于字符的聊天程序.docx》由会员分享,可在线阅读,更多相关《基于字符的聊天程序.docx(8页珍藏版)》请在冰豆网上搜索。
基于字符的聊天程序
南华大学
计算机科学与技术学院
实验报告
(2010~2011学年度第2学期)
课程名称
分布式系统
题目
基于字符的聊天程序
一、实验目的
利用Socket套接字实现主机之间的数据通信,并设计一个网上聊天程序,基于UDP的通信,采用套接字方式和多线程方式完成两台计算机的互联并用编码实现连接,完成题目要求的功能,对等聊天工具实现的是局域网中的聊天功能,其为一个对等的应用,既是服务器又是客户端,对等聊天工具既可以自动发现在线的伙伴,又可以和在线的伙伴进行点对点的聊天
二、实验环境
操作系统:
Windows7
开发环境:
MicrosoftVisualstudioC++6.0
三、实验内容
1.服务器端:
导入winsock的头文件;创建套接字;将套接字绑定到一个本地地址和端口上;将套接字设为监听模式准备接受客户端请求;等待客户端请求;用返回的套接字和客户端进行通信;通信完毕,清空套接字。
2.客户端程序:
导入winsock的头文件;创建套接字;向服务器端发送连接请求;和服务器进行通信;关闭套接字。
3.服务端主要代码说明:
a.初始化WS232
interr;
err=WSAStartup(ver,&wsaData);
b.版本错误则清除导入的DLL
if(LOBYTE(wsaData.wVersion)!
=2||HIBYTE(wsaData.wVersion)!
=2){
WSACleanup();
return;
}
c.开始bind网卡
ret=bind(listenfd,(sockaddr*)&servaddr,sizeof(servaddr));
ret=listen(listenfd,10);
d.开辟一定的缓冲区,便于接收或发送字符
charrecvbuf[1024]={0};
recv(sock,recvbuf,1024,0);
cout< e.开辟一个线程 服务器: cout<<"peerip=["< send(connSocket,"welcometoby",strlen("welcometoby"),0); charbuf[1024]; while (1) { memset(buf,0,sizeof(buf)); recv(connSocket,buf,1024,0); cout< send(connSocket,buf,strlen(buf),0); } } 客户端: while (1) { memset(sendbuf,0,sizeof(sendbuf)); memset(recvbuf,0,sizeof(recvbuf))cin>>sendbuf; send(sock,sendbuf,strlen(sendbuf),0); recv(sock,recvbuf,1024,0); cout< } 4.代码编译成功 服务器: 客户端: 5.主函数 服务器: voidmain() {WORDwVersionRequested; WSADATAwsaData; interr; wVersionRequested=MAKEWORD(2,2); err=WSAStartup(wVersionRequested,&wsaData); if(err! =0){ return; } if(LOBYTE(wsaData.wVersion)! =2|| HIBYTE(wsaData.wVersion)! =2){ WSACleanup(); return; } SOCKETlistenfd=socket(AF_INET,SOCK_STREAM,0); if(listenfd==INVALID_SOCKET) { cout<<"socketfailedwitherrcode="< return; } sockaddr_inservaddr; memset(&servaddr,0,sizeof(sockaddr_in)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(5555); servaddr.sin_addr.s_addr=htonl(INADDR_ANY); intopt=1; intret=setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(constchar*)&opt,sizeof(opt)); if(ret==SOCKET_ERROR) { cout<<"setsockoptfailedwitherrcode="< return; } ret=bind(listenfd,(sockaddr*)&servaddr,sizeof(servaddr)); if(ret==SOCKET_ERROR) { cout<<"bindfailedwitherrcode="< return; } ret=listen(listenfd,10); if(ret==SOCKET_ERROR) { cout<<"listenfailedwitherrcode="< return; } sockaddr_inpeeraddr; intlen=sizeof(sockaddr_in); SOCKETconnSocket=accept(listenfd,(sockaddr*)&peeraddr,&len); if(connSocket==INVALID_SOCKET) { cout<<"acceptfailedwitherrcode="< return; } //开辟一个线程 cout<<"peerip=["< send(connSocket,"welcometoby",strlen("welcometoby"),0); charbuf[1024]; while (1) { memset(buf,0,sizeof(buf)); recv(connSocket,buf,1024,0); cout< send(connSocket,buf,strlen(buf),0); } } 客户端: voidmain() {WORDwVersionRequested; WSADATAwsaData; interr; wVersionRequested=MAKEWORD(2,2); err=WSAStartup(wVersionRequested,&wsaData); if(err! =0){ return; } if(LOBYTE(wsaData.wVersion)! =2|| HIBYTE(wsaData.wVersion)! =2){ WSACleanup(); return; } SOCKETsock=socket(AF_INET,SOCK_STREAM,0); if(sock==INVALID_SOCKET) { cout<<"socketfailedwitherrcode="< return; } sockaddr_inservaddr; memset(&servaddr,0,sizeof(sockaddr_in)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(5555); servaddr.sin_addr.s_addr=inet_addr("127.0.0.1"); intret=connect(sock,(sockaddr*)&servaddr,sizeof(servaddr)); if(ret==SOCKET_ERROR) { cout<<"connectfailedwitherrcode="< return; } charrecvbuf[1024]={0}; recv(sock,recvbuf,1024,0); cout< charsendbuf[1024]={0}; while (1) { memset(sendbuf,0,sizeof(sendbuf)); memset(recvbuf,0,sizeof(recvbuf)); cin>>sendbuf; send(sock,sendbuf,strlen(sendbuf),0); recv(sock,recvbuf,1024,0); cout< } } 四、实验结果 a.客户端发送 b.服务器端接收 五、实验心得 这个实验是一个很有趣的实验,特别是在成功完成聊天的过程后,有一种成就感不言而喻。 虽然过程很艰苦,费了不少神,在同学的帮助下,总算达到了目标,也学到不少知识。 比方说建立这个聊天程序大概的一个流程: 要绑定网卡,开辟缓冲区间用来接收或发送字符,还要开启一个线程,这样才算是一个比较合格完善的小聊天系统。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 字符 聊天 程序