对商家而言网站建设的好处同心食品厂网站建设项目任务分解

web/2025/9/30 10:00:22/文章来源:
对商家而言网站建设的好处,同心食品厂网站建设项目任务分解,网站开发两端对齐底行左对齐,西安企业免费建站目录 ​编辑 一#xff0c;引入 二#xff0c;在Server端修改的代码 1#xff0c;保存用户信息功能实现 2#xff0c;拼接消息 3#xff0c;广播消息 三#xff0c; Client端要修改的代码 四#xff0c;效果演示 一#xff0c;引入 在上一篇文章udp网络服务器中引入 二在Server端修改的代码 1保存用户信息功能实现 2拼接消息 3广播消息 三 Client端要修改的代码 四效果演示 一引入 在上一篇文章udp网络服务器中我实现了一个简易版的网络服务器。而在今天的这篇文章中我要实现的便是基于这个udp网络服务器而实现的多人聊天室。这个聊天室的新增功能如下 1添加用户。 2广播消息。 3使用不同的线程来接收消息和和发送消息。 二在Server端修改的代码 1保存用户信息功能实现 这个功能的实现其实就像我们日常生活中的通讯录的作用一样。我们可以用线性表等方式实现。但是为了提高查找效率我采用的方式是使用哈希表的方式实现。 std::unordered_mapint,sockaddr_in online_user_;//建立一个用户上线表用哈希表的方式存储 哈希表参数类型解释 int:因为要存放的是接收方的ip地址。 sockaddr_in:套接字类型可以通过这个参数来获取接收方的端口号。 有了表以后就要来想想一个常识性问题了。我们的表里面需要有重复信息吗答案当然是不需要。所以在将数据插入到表里时我们要检查这个表里面的数据是否和当前要插入的数据重复,暂时通过ip的方式识别。 bool Check_user(int clientId)//检查是否为新用户{if(online_user_.find(clientId) online_user_.end()){return true;}return false;} 为什么是在Run函数里面修改 因为在这个函数内部实现了接收消息的功能所以发送方的端口号和ip等消息便可以在这个函数内获得。 2拼接消息 在得到发送方的端口号和ip以后为了标识显示发送方。那我们便要将发送方的ip和port以及发送的消息拼接在一起 //拼接消息 inbuf[r1] 0; std::string ip inet_ntoa(si.sin_addr); std::string port std::to_string(si.sin_port); std::string message inbuf; std::string tostring [ip:port] message; 3广播消息 在做完用户表的添加和消息的拼接以后我们便知道了消息是什么消息要发给谁。所以我们便可以开始广播消息让所有人看到消息了。 void Broad_cast(std::string message)//广播函数{for(auto e:online_user_)//广播{socklen_t len sizeof(e.second);int r sendto(socketfd_, message.c_str(), message.size(), 0, (sockaddr*)e.second, len);if(r0){std::cout broad cast error! std::endl;continue;}}} 采用循环的方式将消息发送给用户表里的所有人。 所以我们在run函数里面要修改的全部代码便是 void Run(const funcfun)//加入远程操作{char inbuf[inbufSize] {0};sockaddr_in si;socklen_t len sizeof(si);//一定要初始化while (true){int r1 recvfrom(socketfd_, inbuf, sizeof inbuf-1, 0, (sockaddr *)si, len);//收消息if(r10)//读取消息失败{perror(recvfrom error);exit(10);}if (Check_user(si.sin_addr.s_addr)) // 检查是否是新用户{std::cout welcome....... std::endl;online_user_.insert({si.sin_addr.s_addr, si});//加入到用户表里}//将消息发送给用户//拼接消息inbuf[r1] 0;std::string ip inet_ntoa(si.sin_addr);std::string port std::to_string(si.sin_port);std::string message inbuf;std::string tostring [ip:port] message;//将消息广播Broad_cast(tostring);//std::cout tostring std::endl;// std::cout 收到消息正在处理std::endl;// std::string command inbuf;// std::string cip inet_ntoa(si.sin_addr);// int cport si.sin_port;// std::string message fun(command,cip,cport );// // std::cout message std::endl;// int r2 sendto(socketfd_, message.c_str(), message.size(), 0, (sockaddr *)si, sizeof si);//将处理结果返回给发送方// std::cout std::endl处理完成;// if (r2 0)// {// perror(server send message error);// continue;// }}} 对于server端的代码我们只需要修改Run函数里面的代码即可。 三 Client端要修改的代码 在平时的生活中我们很容易的便可以知道。收发消息是可以同时的运行的。所以在实现Client端的代码时我们最好创建两个线程实现收发消息的并发执行。 void Run(){// 客户端接收函数分两个线程执行// 定义线程变量pthread_t Send_thread;pthread_t Receve_thread;pthread_create(Send_thread, nullptr, Send, this);pthread_create(Receve_thread, nullptr, Receve, this);pthread_join(Send_thread, nullptr);pthread_join(Receve_thread, nullptr);// char outbuf[outbufSize];// while (true)// {// std::cout 请输入内容 ;// std::getline(std::cin, requestes); // client输入内容// if (sendto(socketfd_, requestes.c_str(), sizeof requestes, 0, (sockaddr *)si, sizeof si) 0) // 发送消息// {// continue;// }// int r3 recvfrom(socketfd_, outbuf, sizeof outbuf, 0, (sockaddr *)si, len);// if(r30)// {// continue;// }// outbuf[r3] 0;// std::cout outbuf std::endl;// memset(outbuf, 0, sizeof outbuf);// }} 在这段代码中我将Client端的Run函数修改如上。Run函数的作用便只是创建两个线程然后再执行对应的方法。这两个方法便是接收消息和发消息。 接收消息 static void *Receve(void *args) // 收消息的线程{Client *C static_castClient *(args);char outbuf[outbufSize];sockaddr_in si;socklen_t len sizeof(si);C-Dup(); // 重定向到别的窗口while (true){int r3 recvfrom(C-socketfd_, outbuf, sizeof outbuf-1, 0, (sockaddr *)si, len);if (r3 0){continue;}outbuf[r3] 0;std::cerr outbuf std::endl;memset(outbuf, 0, sizeof outbuf);}} 发消息 static void *Send(void *args) // 发消息的线程{Client *C static_castClient *(args);std::string requestes;sockaddr_in si;socklen_t len;bzero(si, sizeof si);si.sin_family AF_INET;si.sin_port htons(C-port_);si.sin_addr.s_addr inet_addr(C-ip_.c_str());while (true){std::cout 请输入内容 ; // client输入内容std::string requestes;std::getline(std::cin, requestes);if (sendto(C-socketfd_, requestes.c_str(), requestes.size(), 0, (sockaddr *)si, sizeof si) 0) // 发送消息{continue;}}} 解释 1为什么要使用static函数来修饰这两个方法 因为pthread_create函数里面的方法类型是void*(void*)但是类里面的成员方法的参数里面有一个隐藏的this指针。所以只能使用static修饰让成员方法变成静态成员方法进而去掉前面隐藏的this指针。 2pthread_create函数中为什么要传入this指针 因为在这两个函数的内部要使用类的私有成员。但是没有this指针不能直接调用。所以便传入this指针来进行调用私有成员。 3为什么*Receve方法中的Dup()函数是什么 其实这是一个重定向的函数。主要是为了实现输入和输出的分离。让输入和输出打印在不同的终端。 代码实现如下   void Dup() {int fd open(/dev/pts/17, O_WRONLY|O_CREAT);//这是一个终端文件路径//可以使用w命令查看自己打开的终端号if(fd0) //终端号是数字前面部分的路径是一样的{perror(open error);exit(30);}dup2(fd, 2);//重定向重定向的是2号标准错误。因为我的消息是用cerr输出的。 } 补充 如果不想实现重定向的功能也可以在启动可执行程序时直接重定向到不同的终端 首先要使用w来查看自己的终端号是什么 然后使用重定向操作 ./Server 8080 /dev/pts/17 ./Client 111.230.60.61 8080 /dev/pts/18 四效果演示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建设银行网上银行网站进入不了一键建站哪家信誉好

简介 对于 对象--json 数据的序列化和反序列有很多的工具可以选择,fastjson和jaskson等,fastjosn有时候麻烦,不想再导入依赖文件,这时候我们可以使用springboot默认的json工具--Jaskson 使用 主要会用 objectMapper.writeValu…

网站建设与应用岗位临汾万词霸屏网站建设免费咨询

文章目录 前言2D官方游戏案例资源下载项目配置添加角色节点模拟运行移动根节点 结束 Godot专栏地址 前言 Godot 官方给了我们2D游戏和3D游戏的案例,不过如果是独立开发者只用考虑2D游戏就可以了,因为2D游戏纯粹,我们只需要关注游戏的玩法即可…

建站工具也成为什么系统做个网站一年要多少钱

写在前面千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员的自白 这篇文章会这么火,更没想到的是张善友队长的公众号居然也转载了这篇文章,这就导致两天的时间就有两百多位读者朋友加入了.NET Co…

北京网站设计技术乐云seo丹东制作网站公司

LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: park:阻塞当前线程(Block current thread),字面理解park&#x…

中国空间站简介100字网站未备案可以做经营活动吗

登陆SAP 之后,菜单下面一行,最右边的那个彩色按钮(SAP GUI),点击“选项”-可视设计-字体设计-固定狂赌字体设计,点击:选择字体 即可。转载于:https://www.cnblogs.com/RogerLu/p/9612648.html

公司网站建设费用包括哪些免费做网站的公司

目录 一、JShell 二、Dynamic Class-File Constants类文件新添的一种结构 三、局部变量类型推断(var ”关键字”) 四、新加的一些实用API 1. 新的本机不可修改集合API 2. Stream 加强 3. String 加强 4. Optional 加强 5. 改进的文件API 五、移…

自己在线制作logo免费网站心理学门户网站开发与实现

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 研判(入侵检测) 研判我理解为人工层面对入侵检测事件进行再分析,即借助已有的设备告警根据经验判断是否为真实action 研判工作…

昆山公司网站建设电话免费网站建设 免备案

JIRA 重建索引加快速度 JIRA数据量大时,做一遍reindex的速度会很慢,经常需要几个小时 这是后需要查看CPU,如果做reindex时候CPU占用率不高,增加 index的线程数以加快 reindex 配置步骤 停止掉JIRA在home目录下的 jira-config.…

南充北京网站建设域名价格排行

目录 一、EnableWebMvcSecurity 二、MvcRequestMatcher 三、AuthenticationPrincipal 四、异步 Spring MVC 整合 五、Spring MVC 和 CSRF 整合 1、自动包含 Token 2、解析 CsrfToken Spring Security提供了一些与Spring MVC的可选整合。本节将进一步详细介绍这种整合。 …

h5网站制作价格大连企业做网站

TCP是通过确认机制和超时重传机制实现可靠传输 UDP UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结…

asp企业网站源码docker wordpress 备份

学习是有境界的,下面以C语言中的结构型为例简单分析。 第一种境界:理解了。 结构型是自定义数据类型,与C语言中基本的数据类型如int的作用相同,用于定义变量。(变量是内存中存储单元的标识,C语言中通过变…

数字营销 h5 网站开发外包岗位为什么不能去

目录 面试官:redis的分片集群有什么作用 面试官:Redis分片集群中数据是怎么存储和读取的? 面试官:redis的分片集群有什么作用 候选人:分片集群主要解决的是,海量数据存储的问题,集群中有多个m…

网站制作 常见问题广告设计与制作需要学什么专业

用手机号申请了163免费邮箱,在网页端或手机网易邮箱客户端可以正常登录,但在电脑Foxmail客户端中,按相同的邮件服务器进行设置,显示密码不正确。难道163邮箱已经不支持PC中的Foxmail客户端了吗?让我们一同探究解决之道…

用织梦网站后台发布文章为什么还需要审核河南开封网站建设

id:19 A.三数论大小(引用) 题目描述 输入三个整数,然后按照从大到小的顺序输出数值。 要求:定义一个函数,无返回值,函数参数是三个整数参数的引用,例如int &a, int &b, int &c。…

检察院网站建设自查如何做360购物网站

目录 前言 一、设计理念 1.1 支持不同的计算设备与计算单元 1.2 存储空间的分配与维护 1.2.1 简单内存池的实现 1.3 浅拷贝与写操作检测 1.4 底层接口扩展 1.5 类型转换与求值 1.6 数据接口与规范 前言 一个深度学习框架的初步实现为例,讨论如何在一个相对…

怎么给网站添加图标做视频有收益的网站

目录 dirsearch下载地址: githack下载(一次不成功可多试几次) 一、什么是Git 1.git结构 2.git常用命令及示例 3.Git泄露原理 二、Git泄露 1.Log 2.Stash 3.Index 工具准备:dirsearch、githack dirsearch下载地址: GitHub - mauroso…

猎奇网站源码垂直类网站怎么做

在当今的自动化工业领域,川崎工业机器人以其卓越的性能和可靠的工作效率赢得了广泛的赞誉。作为机器人的核心组成部分,伺服电机的作用至关重要。然而,就像所有机械设备一样,也可能会遭遇电机磨损或故障,需要适时的川崎…

龙岗区网站建设哪个公司好东莞网站制作百年

目录 说明: 1. 参数模型(全局字典) 2. 实现过程(C) 创建功能包 参数命令行的使用 YAML参数文件 rosparam命令 使用示例 编程方法(C) 配置代码编译规则 编译并运行 编译 运行 3. 实…

保定模板建站哪家好淮南网站建设

最近很无聊.....得到了3天假期~~~ 于是乎把Ubuntu10.10下载下来安装了 结果第二天root用户就登陆不上了 进入单用户模式后读shower文件发现密码那就一"!" 真是奇怪.... 之前在网上查说passwd命令没加载... 结果明明加载了 改了之后终于用上root权限了 结果又是惨…

企业网站规划书范文如何做网站诊断

使用conda或anaconda的小伙伴们都知道,图形界面时不靠谱的,而在命令行下,所有的操作就会稳定很多,且极少出现问题。因此,熟记conda的命令行就变得十分有用。但对于我这样近50岁依旧奋斗在代码第一线的大龄程序员而已&a…