网络编程大作业报告.docx
- 文档编号:3335456
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:17
- 大小:378.87KB
网络编程大作业报告.docx
《网络编程大作业报告.docx》由会员分享,可在线阅读,更多相关《网络编程大作业报告.docx(17页珍藏版)》请在冰豆网上搜索。
网络编程大作业报告
网络编程大作业报告
——基于TCP的简易聊天室
一、设计背景简介
网络时代的到来,给人们的生产和生活带来了跳跃式的发展。
以前人们的信息交流是通过电话、信件、电报等手段,由于功能的局限给收发双方带来了很多的不方便。
随着网络聊天、电子邮件、万维网等的出现,使人们阅读和交换信息变得更加便捷。
以前一封信件从一方到另一方最快也要一天的时间才能送到,现在只要双方都拥有连入互联网的计算机,发送同样内容的信息只需要几分钟甚至更短的时间。
二、具体实现方案
1、开发环境及软件
开发环境:
Vmware虚拟机下的Ubuntuvi编辑器
编程语言:
C语言
2、协议:
TCP/IP
3、预计实现的具体功能:
(1)用户在已登录下聊天(群聊)
(2)用户向其他用户传输文件
(3)对聊天内容、时间、聊天用户等信息进行记录。
(要求对用户传送的文件名称、路径,发送和接收的用户进行记录;)
(选项):
能够查找特定信息,比如用户聊天内容中出现的某个词,某个用户发送的文件的名称等
4、数据流图
5、设计功能模块
(1)客户端功能模块
1)连接服务器
2)发送消息功能
(2)服务器端功能模块
6、聊天室简介
客户端运行命令:
服务器端运行命令:
(1)界面:
使用终端界面,界面风格较为朴素,没用使用复杂的颜色。
但是对聊天时界面进行了一定的控制和修正使得界面较为美观,易读。
服务器端:
客户端:
(2)聊天室功能
1)群聊
服务器端:
客户端:
(2)查看聊天记录:
服务器端:
客户端:
(3)传送文件:
要传送文件中的内容:
传送之后收到的文件:
7、收获与感悟
本次大作业,利用空余时间,通过查找资料,结合课上所学,共历时2周完成。
系统还不是很完善,有很多的不足之处,有一些问题也没有得到实际解决,如登陆模块由于时间紧迫,没有很好地实现;选做内容搜索也没来得及完成。
通过此次的开发过程,让我深刻的了解了网络编程的知识,虽然有些浅薄,但以后会继续深入学习。
也同样从中学到了不少的道理,真正的理解到,理论与实践之间还是有很大的距离,这必将有利于我们以后的学习。
使我明白,在以后的学习中,要不断的完善自己的知识体系结构,注意理论与实践的结合,学知识关键是要学活,这样所学到的东西才真正的学以致用,才达到了学习的真正目的。
附源码:
Client端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSERVER_PORT5500
#defineBUF_SIZE512
intsocketfd;
intmain(intargc,char*argv[])
{
structsockaddr_inservaddr;
structhostent*host;
charbuf[BUF_SIZE],buffer[BUF_SIZE],f[2]={'a'},buffe[500],fname[10];
charname[20],pwd[20];
inttype,i=0;
pid_tpid;
charflag[100],Time[100];
FILE*stream,*f2;
time_ttimep;
time(&timep);
host=gethostbyname(argv[1]);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr=*((structin_addr*)host->h_addr);
servaddr.sin_port=htons(SERVER_PORT);
socketfd=socket(AF_INET,SOCK_STREAM,0);
type=connect(socketfd,(structsockaddr*)&servaddr,sizeof(servaddr));
printf("====================欢迎使用聊天室================\n");
printf("操作指南:
\n\t输入任意开始聊天\n\t输入A发送文件\n\t输入B查询聊天记录\n");
printf("=================================================\n");
printf("请输入用户名:
\n");
fgets(name,sizeof(name),stdin);
printf("请输入密码:
\n");
fgets(pwd,sizeof(pwd),stdin);
write(socketfd,name,sizeof(name));
printf("登录成功!
\n");
if((pid=fork())!
=0)
{
while(fgets(buf,BUF_SIZE,stdin)!
=NULL)//父进程,处理读标准输入,并发数据
{
printf("%s",ctime(&timep));
if(buf[0]=='A'){
bzero(buffer,BUF_SIZE);
stream=fopen("read.txt","r");
bzero(buffer,BUF_SIZE);
send(socketfd,buf,strlen(buf)-1,0);
bzero(buf,sizeof(buf));
intlengsize=0;
while((lengsize=fread(buffer,1,512,stream))>0){
//printf("%s--\n",buffer);
send(socketfd,buffer,sizeof(buffer),0);
bzero(buffer,512);
}
strcpy(fname,"read.txt");
send(socketfd,fname,sizeof(fname),0);
fclose(stream);
}
else
write(socketfd,buf,strlen(buf)-1);
}
}
else
{
while((type=read(socketfd,buf,BUF_SIZE-1))>0)//子进程,接收数据,并输出
{
if(buf[0]=='r'){
send(socketfd,f,sizeof(f),0);
read(socketfd,buffe,sizeof(buffe));
f2=fopen("recv.txt","w");
fwrite(buffe,sizeof(char),strlen(buffe),f2);
fclose(f2);
}
buf[type]='\0';
printf("%s\n",buf);
printf("%s",ctime(&timep));
}
}
close(socketfd);
return(0);
}
Server端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSERVER_PORT5500
#defineBUF_SIZE512
#defineLNUM4
structnames{
charname[10];
}cname[10];
intmain()
{
intlisten_fd,client_id,len=1,len_s;
structsockaddr_inserver_addr;
pid_tpid;
FILE*f1;
FILE*f2;
charflag[512],buffer[512],flag2[3]={'r'},f[2],fname[10],name[10];
FILE*stream;
time_ttimep;
time(&timep);
listen_fd=socket(AF_INET,SOCK_STREAM,0);
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SERVER_PORT);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);//允许地址重用,不需要等待TIME_WAIT,1为可重用,0为不可
setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&len,sizeof(len));
bind(listen_fd,(structsockaddr*)&server_addr,sizeof(server_addr));
listen(listen_fd,LNUM);
structsockaddr_insaddr;
socklen_tsaddrlen=sizeof(saddr);
printf("服务器端已准备好!
\n");
fd_setmaster;
fd_setread_fds;
intfdmax,i,newfd,j;
charbuf[BUF_SIZE+1];
FD_ZERO(&master);
FD_ZERO(&read_fds);
FD_SET(listen_fd,&master);
fdmax=listen_fd;//现在只有一个监听的
while
(1)
{
read_fds=master;
select(fdmax+1,&read_fds,NULL,NULL,NULL);//永远等待,仅在有一个描述符准备好I/O才返回
for(i=0;i<=fdmax;i++)//遍历所有连接,读取数据
{
if(FD_ISSET(i,&read_fds))//新的客户端连接
{
if(i==listen_fd)//从监听端口来的
{
if((newfd=accept(listen_fd,(structsockaddr*)&saddr,&saddrlen))==-1)
{
perror("Error");
}
else
{
FD_SET(newfd,&master);//下一轮要关注的描述符
if(newfd>fdmax)
{
fdmax=newfd;//保持fdmax为最大
}
read(newfd,name,sizeof(name));
len_s=strlen(name);name[len_s-1]='\0';
//printf("-%s-\n",name);
strcpy(cname[newfd].name,name);
printf("有新的客户端链接,from%s,SocketIDis%d.\n",inet_ntoa(saddr.sin_addr),newfd);
}
}
else//如果是已经建立的链接
{
sprintf(buf,"来自%s:
\n",cname[i].name);
//printf("%d\n",strlen(buf));
if((len=recv(i,buf+11,BUF_SIZE-12,0))<=0)//链接断开或出错
{
if(len==0)
{
printf("客户端%s已离开\n",cname[i].name);
}
else
{
perror("Therecv()gotend");
}
close(i);
FD_CLR(i,&master);//移除
}
else//处理得到的数据
{
//write(i,buf,len);
len+=11;
buf[len]='\0';
printf("%s\n",buf);
printf("%s",asctime(gmtime(&timep)));
f1=fopen("record.txt","a+");
fputs(buf,f1);
fputs("\n",f1);
fprintf(f1,"%s",ctime(&timep));
fputs("\n",f1);
fclose(f1);
//write(i,buf,len);
if(buf[11]=='A'){
//printf("hello\n");
if((stream=fopen("data.txt","w"))==NULL)
printf("Error");
//bzero(buffer,512);
intlength;
while(length=recv(i,buffer,sizeof(buffer),0)){
//printf("--%s--\n",buffer);
ints=strlen(buffer);
//printf("%d\n",s);
intwrite_length=fwrite(buffer,sizeof(char),strlen(buffer),stream);
if(write_length break; //bzero(buffer,512); } fclose(stream); recv(i,fname,sizeof(fname),0); //printf("-%s-\n",fname); f1=fopen("record.txt","a+"); fputs("From",f1); fprintf(f1,"%s",cname[i].name); fputs("\n",f1); fprintf(f1,"Filename: %s",fname); fputs("\n",f1); fprintf(f1,"%s",ctime(&timep)); fclose(f1); for(j=0;j<=fdmax;j++) { if(FD_ISSET(j,&master)&&j! =listen_fd&&j! =i)//信号j在master列表里有,发给除了发信号的和监听的所有进程(客户端)FD_ISSET(j,&master)&&j! =listen_fd&&j! =i { send(j,flag2,sizeof(flag2),0); read(j,f,sizeof(f)); send(j,buffer,sizeof(buffer),0); } } } if(buf[11]=='B'){ f2=fopen("record.txt","r"); intl=0; while (1){ flag[l++]=fgetc(f2); if(feof(f2)) break; } flag[l-1]='\0'; //printf("%s\n",flag); send(i,flag,sizeof(flag)-1,0); } for(j=0;j<=fdmax;j++) { if(FD_ISSET(j,&master)&&j! =listen_fd&&j! =i)//信号j在master列表里有,发给除了发信号的和监听的所有进程FD_ISSET(j,&master)&&j! =listen_fd&&j! =i { send(j,buf,len,0); } } } } } } } return(0); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 作业 报告