当前位置: 首页 > news >正文

学校信息化网站建设新手网站设计看哪本书

学校信息化网站建设,新手网站设计看哪本书,唐山网站建设推广,网站维护一年一般多少钱一、实验目的 本实验基于搭建好的开发环境和硬件环境#xff0c;通过编写简单的通信实验#xff0c;验证开发环境#xff0c;掌握多媒体开发编程基础#xff0c;包括SOCKET编程、多线程编程和线程同步知识。 二、实验内容 基于套接字、多线程、同步锁机制实现多媒体文件…一、实验目的 本实验基于搭建好的开发环境和硬件环境通过编写简单的通信实验验证开发环境掌握多媒体开发编程基础包括SOCKET编程、多线程编程和线程同步知识。 二、实验内容 基于套接字、多线程、同步锁机制实现多媒体文件的收发 发送端Ubuntu的PC机读取文件每1024个字节组成一个包通过TCP报文发送到接收端接收SE5上启动2个线程线程1接收报文并将报文存入缓存线程2通过缓存读取报文存入文件中要求线程1和线程2之间通过同步锁进行线程同步。 三、开发环境 开发主机Ubuntu 22.04 LTS 硬件算能SE5 本地如果有SE5硬件则可以PC机作为客户端SE5作为服务器端。本地如果没有SE5硬件只有云空间则可以直接将客户端和服务器端都通过云空间实现机在云空间的SE5模拟环境中实现。 四、实验器材 开发主机 云平台或SE5硬件 五、实验过程与结论 5.1 原理流程 硬件部署环境如下图所示 如上图所示可以利用PC作为客户端SE5作为服务器端将PC机的文件传送至SE5中。如果是云平台开发可以直接将客户端和服务器端都放在云平台的模拟器中。此时即在一台机器内既实现客户端也实现服务器端设置服务器端的通信地址为回环地址127.0.0.1。 客户端程序采用TCP协议进行文件收发。客户端程序采用单线程处理在和服务器端建立连接后循环读取流媒体文件并进行套接字发送。客户端运行流程包含了 创建套接字输入执行文件名传输文件名服务器地址和端口四个参数连接服务器的ip地址及端口读取需要发送的媒体文件启动TCP发送文件循环读取流媒体文件直到结束后断开连接。 图3-1 客户端操作流程图 接收端作为服务端采用多线程进行编程。主线程用于接收连接后接收客户端发送的报文存入缓存。另起一个线程用于从缓存中读取数据包并存入文件中。服务器端的运行流程包含如下关键步骤 创建套接字描述符绑定ip地址和端口便于客户端接入监听是否有客户端发出连接请求收到连接请求后启动接收和写文线程将接受的报文存入缓存中同时从缓存读取报文存入文件中传输完成后重新等待连接请求。 图3-2 服务端操作流程图 5.2 关键代码解析 5.2.1 客户端 由于需要用到套接字进行编程因此在头文件上需要包含一些必要的头文件 #include iostream        #include errno.h #include string.h #include unistd.h #include arpa/inet.h 创建套接字可以直接利用操作系统的SOCKET接口实现关键函数如下 int sockfd; struct sockaddr_in servaddr;if ((sockfd socket(AF_INET, SOCK_STREAM, 0)) 0)   //创建套接字并判断是否成功 {printf(create socket error: %s(errno: %d)\n, strerror(errno), errno);return 0; }memset(servaddr, 0, sizeof(servaddr));    //初始化结构体 servaddr.sin_family AF_INET;            //设置地址家族 servaddr.sin_port htons(atoi(argv[3]));  //设置端口//发出连接请求判断是否连接成功 if (connect(sockfd, (struct sockaddr *) servaddr, sizeof(servaddr)) 0)         {printf(connect error: %s(errno: %d)\n, strerror(errno), errno);return 0; } 至此客户端主动向服务器发送链接。 在发送端可通过fopen打开文件通过fread函数读取流媒体文件    if ((fq fopen(argv[1], rb)) NULL){/*判断文件是否打开*/close(serverFd);return -1;} ...... /*循环读取文件并发送*/ size_t readLen fread(buffer, 1, sizeof(buffer), fq); 发送端启动TCP发送这里的write函数中调用的sockfd是套接字的句柄 while (!feof(fq)){/*循环读取文件并发送*/size_t readLen fread(buffer, 1, sizeof(buffer), fq);if (readLen ! write(serverFd, buffer, readLen)){printf(write error.\n);break;} } 5.2.2 服务器端 服务器端由于涉及到多线程因此需要包含多线程头文件。并且服务器端还涉及到缓冲区本实例可以通过队列方法设计缓冲区因此可以包含队列头文件。还有涉及到同步锁机制因此还需要包含同步锁头文件具体如下 #include stdio.h #include string.h #include netinet/in.h #include unistd.h #include thread #include mutex #include queue 服务器端首先也需要创建套接字并等待客户端发起连接服务器端的关键代码如下 int main(int argc, char **argv) {int listenFd, clientFd;struct sockaddr_in servaddr;if ((listenFd socket(AF_INET, SOCK_STREAM, 0)) 0){/*创建套接字*/printf(create socket error\n);return -1;}memset(servaddr, 0, sizeof(servaddr));                     //初始化结构体servaddr.sin_family AF_INET;                              //设置地址族协议servaddr.sin_addr.s_addr htonl(INADDR_ANY);               //设置地址servaddr.sin_port htons(6666);                            //设置默认端口if (bind(listenFd, (struct sockaddr *)servaddr, sizeof(servaddr)) 0){/*绑定套接字地址和端口*/printf(bind socket error\n);return -1;}if (listen(listenFd, 10) 0){/*开启监听*/printf(listen socket error\n);return -1;}struct sockaddr_in client_addr;socklen_t size sizeof(client_addr);if ((clientFd accept(listenFd, (struct sockaddr *)client_addr, size)) 0){/*建立连接*/printf(accept socket error\n);return -1;}std::thread write_thread(writeThread);size_t readLen 0;while (true){/*循环读取客户端消息*/char buff[MAXBUFF] {0};readLen read(clientFd, buff, MAXBUFF);if (readLen 0)break;std::string data(buff, readLen);g_mx.lock();                                        //上锁g_dataQue.push(data);g_mx.unlock();                                      //解锁}write_thread.join();close(clientFd);close(listenFd);return 0; } 注意在上述函数中定义了写文件线程 std::thread write_thread(writeThread); 并且在主线程中启动了写文件线程 write_thread.join(); 接收线程执行函数 std::queuestd::string g_dataQue;                   //全局队列 std::mutex g_mx;                                     //互斥锁void writeThread() {/*写线程*/FILE *out_put fopen(recv_data.mp4, w);sleep(1);                                        //休眠一秒确保队列中有数据while (true){/*从队列中读取数据并存储*/if (g_dataQue.size() 0)break;g_mx.lock();std::string data g_dataQue.front();g_dataQue.pop();g_mx.unlock();fwrite((void *)data.data(), 1, data.size(), out_put);}fclose(out_put); } 如上所示同步锁用于进行缓冲区的读写同步。上述实例中通过std::mutex实现同步。 g_lock.lock();         //上锁 ​​​​​​​g_lock.unlock();       //解锁
http://www.huolong8.cn/news/167506/

相关文章:

  • qq人脸解冻自助网站开发app需要多少人
  • wordpress自定义文章页面模板下载seo优化包括什么
  • 做网站基本教程wordpress 图片比例
  • 东莞金融网站建设山东省城乡与建设厅网站首页
  • 企业网站建站的专业性原则是指网站信息内容应该体现建站目的和目标群体北京网站建设东轩seo
  • 外贸网站建设不可缺少的灵活性网站关键词推广工具
  • oa网站开发模板网站建设中扁平化结构
  • 宿迁市住房和城乡建设局老网站网页封装网站怎么做的接口
  • 杭州网站开发工程师wordpress 响应式主题
  • 个人网站空间一般多大百度移动网站检测
  • led外贸网站制作营销型网站模板下载
  • 营销型网站 策划运营网站wordpress子目录站点
  • 广东双语网站建设价格推广有奖励的app平台
  • 北京平台网站建设哪家好品牌建设的十六个步骤
  • 门户网站开发软件行业应用网站建设成本
  • 专业建站源码开网店哪个电商平台好
  • 网站建设开发背景在上海找工作用哪个招聘网好
  • 池州做网站培训中企动力初期做的网站
  • 做网站以前出名的公司子商务网站建设的一般流程图
  • 怎么查到网站是谁做的企业信息免费查询系统
  • 网站搭建行业seo点石论坛
  • 网站做微信支付宝支付接口云海建设工程有限公司网站
  • 南宁网站排名优化公司内蒙古住房建设部官方网站
  • 建设通网站怎么注销邯郸小程序
  • 做兼职哪个网站好文化传播网站模板
  • 拼多多网站建设方案绍兴聚氨酯制作公司
  • 万网的网站建设好吗wordpress新版编辑器
  • 针对网站开发者的问答网站html网页可以用以下哪个工具制作
  • 和男朋友都是第一次做网站公司宣传册模板免费下载
  • 做阿里巴巴企业网站frontpage2007网站建设