linux应用开发之聊天室设计含效果图源程序.docx
- 文档编号:24664773
- 上传时间:2023-05-30
- 格式:DOCX
- 页数:26
- 大小:27.16KB
linux应用开发之聊天室设计含效果图源程序.docx
《linux应用开发之聊天室设计含效果图源程序.docx》由会员分享,可在线阅读,更多相关《linux应用开发之聊天室设计含效果图源程序.docx(26页珍藏版)》请在冰豆网上搜索。
linux应用开发之聊天室设计含效果图源程序
1.概述1
2.应用知识1
3.软件设计1
4.软件代码2
5.实现效果图4
6.实训总结5
实训题目:
基于TCP协议的网络通信
1.概述
基于网络编程的TCP通信,利用TCP通信原理实现在局域网内实现跨主机或同主机进行网络通信的功能,并且利用文件操作实现通过TCP通信传输文件。
2.应用知识
本次应用到了C语言编程,网络编程,Linux应用层开发,触屏知识,socket编程常用API汇总,程序模块编程,Linux基础指令,文件IO知识。
3.软件设计
使用到了以下软件和工具来完成本次实训:
(一)VMwareWorkstation
VMwareWorkstation(中文名“威睿工作站”)是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试、部署新的应用程序的最佳解决方案。
VMwareWorkstation可在一部实体机器上模拟完整的网络环境,以及可便于携带的虚拟机器,其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。
对于企业的IT开发人员和系统管理员而言,VMware在虚拟网路,实时快照,拖曳共享文件夹,支持PXE等方面的特点使它成为必不可少的工具。
(二)ubuntu
Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu是基于DebianGNU/Linux,支持x86、amd64(即x64)和ppc架构,由全球化的专业开发团队(CanonicalLtd)打造的。
其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,类似儒家“仁爱”的思想,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观。
Ubuntu基于Debian发行版和GNOME桌面环境,而从11.04版起,Ubuntu发行版放弃了Gnome桌面环境,改为Unity,与Debian的不同在于它每6个月会发布一个新版本。
Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。
Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。
Ubuntu对GNU/Linux的普及特别是桌面普及作出了巨大贡献,由此使更多人共享开源的成果与精彩。
(三)gcc
gcc是GNU编译器套件(GNUCompilerCollection),它包括了C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。
GCC的初衷是为GNU操作系统专门编写的一款编译器。
GNU系统是彻底的自由软件。
此处,“自由”的含义是它尊重用户的自由。
(4)pthread
POSIX线程(POSIXthreads),简称Pthreads,是线程的POSIX标准。
该标准定义了创建和操纵线程的一整套API。
在类Unix操作系统(Unix、Linux、MacOSX等)中,都使用Pthreads作为操作系统的线程。
Windows操作系统也有其移植版pthreads-win32 。
4.软件代码(主程序软件代码,需要添加程序功能描述)
================软件代码(START)===========================================
(1)创建套接字
intsockfd=socket(AF_INET,SOCK_STREAM,0);
/*****创建套接字,用于通信成功则返回待连接的套字节******/
if(sockfd==-1)/*****如果创建失败*****/
{
perror("error");
return-1;/*****返回-1*****/
}
(2)绑定IP地址和自己的端口号
structsockaddr_inser_addr;
bzero(&ser_addr,sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(8888);/*****绑定自己的端口号*****/
ser_addr.sin_addr.s_addr=inet_addr("192.168.31.108");
/*****绑定自己的IP地址*****/
ret=bind(sockfd,(structsockaddr*)&ser_addr,sizeof(ser_addr));
if(ret==-1)/*****绑定失败*****/
{
perror("binderror");
return-1;/*****返回-1*****/
}
(3)监听
listen(sockfd,5);/*****最大同时接收连接请求个数为5;将scokfd设置为套字节*****/
(4)连接
confd=accept(sockfd,(structsockaddr*)&cli_addr,&len);
/*****等待连接(阻塞等待),使用confd通信;成功返回已连接套接字(非负整数),用这个套接字去通信*****/
(5)账号登陆与注册
if((strcmp(usr1,usr2)==0)&&(strcmp(pass1,pass2)==0))
/*****输入的账号密码和已存的账号密码对比,相同则允许登陆,不同则重新输入*****/
=============软件代码(END)===============================
5.实验效果图
(一)服务端
如图5.1,这是服务端效果图。
服务端实现了账号注册,聊天,收发文件的功能。
图5.1
(2)客户端
如图5.2,这是客户端效果图。
客户端实现了账号注册,聊天,收发文件的功能。
图5.2
6.实训总结
Linux系统是通过提供套接字(socket)来进行网络编程的,网络程序主要通过对socket和其他几个函数调用来实现。
socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链句柄,也可以看成是一种文件描述符,socket实质上提供了进程通信的端点。
通常使用C语言进行网络编程,常用socket编程函数有socket、bind、connect、accept、send、recv等。
附完整程序
1.更改ip,将程序中IP改为你的。
配置ubuntu网络
a.点击上面虚拟机----点击设置----网络适配器----改成桥接模式
b.ubuntu界面----点击右上方网络连接图标----点击启用联网----等待显示网络连接已断开----重新点击启用联网----等待网络恢复
c.在终端输入:
ifconfig-----查看ubuntuIP地址,查看是否0网段
inet地址:
192.168.0.159广播:
192.168.0.255掩码:
255.255.255.0
2.编译时加上线程库pthread,如gcc1.c-pthread
3.值得注意的是,此程序不能传空txt文本。
正确操作是,发送端发工作目录已有的1.txt文档(内容123)输入命令“./1.txt”;接收端输入命令“./2.txt”,2.txt保存文件名,工作目录传输前没有2.txt,传输后生成2.txt,写入123.
1.服务端
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
intconfd;
intfd2;
charbuf[100]={0};
//线程函数(发送数据)
void*sendmssg(void*arg)
{
charbuf[50]={};
while
(1)
{
bzero(buf,50);
scanf("%s",buf);
write(confd,buf,50);//发送的大小和接受的大小必须一样
if(strcmp(buf,"quit")==0)
{
break;
}
}
}
intmain()
{
/*****************************
*创建套接字,用于通信
*成功则返回待连接的套字节
*失败返回-1
*****************************/
intsockfd=socket(AF_INET,SOCK_STREAM,0);
/*****
*AF_INET/PF_INET:
网际协议
*SOCK_STREAM:
流式套接字,代表TCP
*协议,一般为零
*****/
if(sockfd==-1)
{
perror("error");
return-1;
}
/*****************************
*解决在close之后会有一个WAIT_TIME,
*导致bind失败的问题
*****************************/
intval=1;
intret=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(void*)&val,sizeof(int));
if(ret==-1)
{
printf("setsockopt");
return-1;
}
/*****************************
*绑定IP地址和自己的端口号
*成功返回0
*失败返回-1
*****************************/
structsockaddr_inser_addr;
bzero(&ser_addr,sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(8888);
ser_addr.sin_addr.s_addr=inet_addr("192.168.0.116");
/*****
*特殊地址结构体——IPv4地址结构体:
structsockaddr_in{
*u_shortsin_family;地址族
*u_shortsin_port;端口
*structin_addrsin_addr;IPV4地址
*charsin_zero[8];结构体大小};
*****/
ret=bind(sockfd,(structsockaddr*)&ser_addr,sizeof(ser_addr));
/*****
*sockfd:
待连接套接字
*addr:
包含本地地址(IP+PORT)的通用地址结构体的指针
*sizeof(ser_addr)地址结构体大小
*****/
if(ret==-1)
{
perror("binderror");
return-1;
}
/*****************************
*监听套接字
*并设置最大同时接收连接请求个数为5
*成功返回0,并将scokfd设置为套字节
*失败返回-1
*****************************/
listen(sockfd,5);
/*****
*接口声明listen();
*sockfd:
待连接套接字
*接收连接请求个数为5
*****/
structsockaddr_incli_addr;
bzero(&cli_addr,sizeof(cli_addr));
socklen_tlen=sizeof(cli_addr);
/*****************************
*等待连接(阻塞等待),使用confd通信
*成功返回已连接套接字(非负整数),用这个套接字去通信
*失败返回-1
*****************************/
confd=accept(sockfd,(structsockaddr*)&cli_addr,&len);
if(confd==-1)
{
perror("accepterror");
return-1;
}
/*****
*sockfd:
监听套接字
*addr:
通用地址结构体,用以存储对端地址(IP+PORT)
*addrlen:
参数addr的存储区域大小
*****/
/*****************************
*和连接上套接字的对方进行通信
*****************************/
intg;
while
(1)
{
FILE*fp=fopen("./server.txt","a+");//以附加方式打开文件,文件不存在即创建,
//以读写打开,把内容追加到文件尾(原本内容会保留)
if(fp==NULL)
{
printf("打开失败!
\n");
}else
{
printf("打开成功!
\n");
}
charusr1[30]={0};
charusr2[30]={0};
charpass1[30]={0};
charpass2[30]={0};
char*fget_fp=fgets(usr1,20,fp);
if(fget_fp==NULL)//进行账号的注册
{
printf("请输入注册的账号:
");
scanf("%s",usr1);
intup1=strlen(usr1);
usr1[up1]='\n';
charfw=fwrite(usr1,1,up1+1,fp);
if(fw==0){printf("账号写入失败!
\n");}
printf("请输入注册账号的密码:
");
scanf("%s",pass1);
up1=strlen(pass1);
pass1[up1]='\n';
fw=fwrite(pass1,1,up1+1,fp);
if(fw==0){printf("密码写入失败!
\n");}
else{printf("注册成功!
\n");}
return-1;
}
else
{
fgets(pass1,20,fp);
printf("请输入账号:
");
scanf("%s",usr2);
intup2=strlen(usr2);
usr2[up2]='\n';
printf("请输入密码:
");
scanf("%s",pass2);
up2=strlen(pass2);
pass2[up2]='\n';
if((strcmp(usr1,usr2)==0)&&(strcmp(pass1,pass2)==0))
//输入的账号密码和已存的账号密码对比,相同则允许登陆,不同则提示账号或者密码错误
{
printf("欢迎登录服务端\n");
while
(1)
{
charname[20]={};
printf("请选择功能:
\n0-退出账号\n1-聊天\n2-接收文件\n3-发送文件\n请选择:
");
//功能模块,选择功能
scanf("%d",&g);
if(g==1)//聊天
{
pthread_tpid;
pthread_create(&pid,NULL,sendmssg,NULL);
while
(1)
{
bzero(buf,100);
read(confd,buf,100);//接收大小和发送的大小一样
printf("客户端:
%s\n",buf);
if(strcmp(buf,"quit")==0)
{
break;
}
}
pthread_join(pid,NULL);
}elseif(g==2)//接受文件
{
printf("接受文件名及路径:
");
scanf("%s",name);
intfd2=open(name,O_WRONLY|O_CREAT|O_TRUNC,0777);
/*****
*O_WRONLY:
以只写的方式打开
*O_CREAT:
如果要打开的文件不存在,即创建
*O_TRUNC:
如果以只写的方式打开,或者以可读可写方式打开,那么就清空文件的内容
*****/
if(fd2==-1)
{
perror("目标文件打开失败!
\n");
return-1;
}
while
(1)
{
bzero(buf,sizeof(buf));
ret=read(confd,buf,100);
if(ret<100)
{
write(fd2,buf,ret);
printf("发送完成\n");
close(fd2);
break;
}else
{
write(fd2,buf,ret);
printf("等待...\n");
}
}
}elseif(g==3)//发送文件
{
printf("输入需要发送的文件名及路径:
");
scanf("%s",name);
intfd=open(name,O_RDONLY);
if(fd==-1)
{
perror("打开失败\n");
return-1;
}
while
(1)
{
bzero(buf,sizeof(buf));
ret=read(fd,buf,100);
if(ret<100)
{
write(confd,buf,ret);
printf("发送完成\n");
close(fd);
break;
}else
{
write(confd,buf,ret);
printf("等待...\n");
}
}
}elseif(g==0)//退出账号
{
break;
}
}
}else
{
printf("账号或密码错误\n");
return-1;
}
}
}
/*****************************
*关闭打开的套接字
*****************************/
close(sockfd);
close(confd);
return0;
}
2.客户端
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
intsockfd;
charbuf[100]={0};
//线程函数(接收数据)
void*recvmssg(void*arg)
{
charbuf[50]={};
while
(1)
{
bzero(buf,50);
read(sockfd,buf,50);//接收大小和发送的大小一样
printf("服务端:
%s\n",buf);
if(strcmp(buf,"quit")==0)
{
break;
}
}
}
intmain()
{
//1.创建套接字(使用该套接字通信)
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("error");
return-1;
}
intval=1;
intret=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(void*)&val,sizeof(int));
if(ret==-1)
{
printf("setsockopt");
return-1;
}
structsockaddr_incli_addr;
bzero(&cli_addr,sizeof(cli_addr));
cli_addr.sin_family=AF_INET;
cli_addr.sin_port=htons(8000);
cli_addr.sin_addr.s_addr=inet_addr("192.168.0.116");
//2.绑定IP地址和端口号(自己的)
ret=bind(sockfd,(structsockaddr*)&cli_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 应用 开发 聊天室 设计 效果图 源程序