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

北京专业做网站公司商业运营是做什么的

北京专业做网站公司,商业运营是做什么的,小程序企业网站源码,昆山花桥做网站udp终结篇~ 文章目录 前言一、udp服务器实现大型网络聊天室总结 前言 根据上一篇文章中对于英汉互译和远程操作的两个小功能大家应该已经学会了#xff0c;我们的目的是让大家可以深刻的理解udp服务器所需要的接口已经实现的简单步骤#xff0c;下面我们开始实现网络聊天室。… udp终结篇~ 文章目录 前言一、udp服务器实现大型网络聊天室总结 前言 根据上一篇文章中对于英汉互译和远程操作的两个小功能大家应该已经学会了我们的目的是让大家可以深刻的理解udp服务器所需要的接口已经实现的简单步骤下面我们开始实现网络聊天室。 一、udp服务器实现大型网络聊天室 首先我们的实现思想是当客户端发消息给服务器这个时候服务器会将这条消息发给所有在线的用户这样的话每个用户就能看到别人的消息了所以我们首先创建一个文件来写用户管理的代码由于我们的实现只是为了增加对udp服务器的理解所以我们不会特别详细就比如应该先注册再用账号和密码登录然后图形化界面什么的我们就不搞了有兴趣的可以自己下去手动添加我们只是写出最主要的功能。 #include iostream using namespace std;class User { public:User(const string ip,const uint16_t port):_ip(ip),_port(port){}~User(){} private:string _ip;uint16_t _port; };首先每个用户都要有自己的端口号和IP然后我们就暂时写一个构造和析构就好了在这里大家就可以设计每个用户的昵称等信息了。然后我们还需要有一个管理用户的类 class UserManager { public:UserManager(){}~UserManager(){}void addUser(const string ip, const uint16_t port){}void delUser(const string ip, const uint16_t port){}private:unordered_mapstring,User users; }; 我们的目的是直接通过用户的IP和端口号组成一个ID来实现映射也就是让map去实现用户的增加删除操作。下面我们完善每个接口的代码 void addUser(const string ip, const uint16_t port){string id ip - to_string(port);users.insert(make_pair(id,User(ip,port)));}void delUser(const string ip, const uint16_t port){string id ip - to_string(port);users.erase(id);} 首先每个用户都有自己的IP和端口号所以我们用一个字符串去拼接他们的ID和端口号这样就形成了唯一的id然后用map的插入插入的用户对象我们直接用匿名对象构造即可。删除一个用户也是同样的套路下面我们再写一个判断是否在线的接口 bool isOnline(const string ip,const uint16_t port){string id ip - to_string(port);if (users.find(id)users.end()){return false;}else {return true;}} 我们就通过这个用户是否在map中来判断这个用户是否在线即可。管理用户的部分我们搞定后下面我们再重新写一个回调方法 然后我们开始设计消息路由的回调方法 void routeMessage(int sockfd,string clientip,uint16_t clientport,string message) {//首先用户要上线就需要先给服务器发送onlineif (messageonline){onlineuser.addUser(clientip,clientport);}if (onlineuser.isOnline(clientip,clientport)){//进行消息的路由}else{//不在线就提示用户需要先上线string response;struct sockaddr_in client;socklen_t len sizeof(client);bzero(client,sizeof(client));client.sin_family AF_INET;client.sin_port htons(clientport);client.sin_addr.s_addr inet_addr(clientip.c_str());response 你还没有上线,先输入online上线;sendto(sockfd,response.c_str(),response.size(),0,(struct sockaddr*)client,len);} } 我们首先判断用户是否输入online,如果输入就添加到map中如果不在线就告诉用户需要先在线那么我们该如何实现消息的路由呢因为我们的map中存放的都是已经在线的用户所以我们直接在用户管理中写一个函数这个函数的目的是遍历map然后给每个用户发消息因为我们是知道用户的端口号和ip的所以发消息的内容就非常简单了 首先包含网络相关的头文件然后进行消息广播接口的编写 void broadcastMessage(int sockfd,const string message){for (auto ur:users){struct sockaddr_in client;bzero(client,sizeof(client));client.sin_family AF_INET;client.sin_port htons(ur.second.returnport());client.sin_addr.s_addr inet_addr(ur.second.returnip().c_str());sendto(sockfd,message.c_str(),message.size(),0,(struct sockaddr*)client,sizeof(client));}} 首先我们发送消息必须用到sendto接口这个接口会用到文件描述符所以我们除了需要一个广播的消息还需要文件描述符然后给每个在线的用户发消息发消息要用到用户的ip和port,这两个参数是用户的私有成员变量所以我们写两个接口拿到这两个参数 当然我们考虑到广播消息的时候其他用户还要看到这条消息是谁发的所以我们应该加入发消息这个人的ip和port: void broadcastMessage(int sockfd,const string clientip,const uint16_t clientport, const string message){for (auto ur:users){struct sockaddr_in client;bzero(client,sizeof(client));client.sin_family AF_INET;client.sin_port htons(ur.second.returnport());client.sin_addr.s_addr inet_addr(ur.second.returnip().c_str());string s clientip - to_string(clientport) # ;smessage;sendto(sockfd,s.c_str(),s.size(),0,(struct sockaddr*)client,sizeof(client));}} 我们在回调方法中还应该加入用户下线的信息一旦下线我们就将这个用户从map中移除上面服务端的代码我们就写完了下面开始修改客户端的代码 客户端的代码中我们只需要让每次客户输入前有#的标记最后消息打印完换行即可注意上面代码中我们用recvfrom这个函数的时候将结构体进行了填充实际上recvfrom这个函数并不需要填充结构体。下面我们引入多线程的知识让我们的消息变成有一个线程专门读消息另一个线程专门发送消息这样的话即使有人不想说话也依旧能看到其他用户的聊天内容如果我们不加入多进程或多线程的概念那么就会出现用户不说话就无法看到其他用户的消息 首先加入一个线程的变量然后我们让这个读线程去执行客户端中读取服务端发送消息的过程主线程去给服务端发消息 static void *readMessage(void* args){int sockfd *(static_castint*(args));pthread_detach(pthread_self());while (true){char buffer[1024];struct sockaddr_in temp;socklen_t len sizeof(temp);int n recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)temp, len);if (n 0){buffer[n] 0;}cout buffer endl;}return nullptr;}void run(){pthread_create(reader,nullptr,readMessage,(void*)_sockfd);struct sockaddr_in server;memset(server,0,sizeof(server));server.sin_family AF_INET;server.sin_addr.s_addr inet_addr(_serverip.c_str());server.sin_port htons(_serverport);string message;while (!_quit){cout# ;char commandbuffer[1024];fgets(commandbuffer,sizeof(commandbuffer)-1,stdin);message commandbuffer;sendto(_sockfd,message.c_str(),message.size(),0,(struct sockaddr*)server,sizeof(server));} 创建线程后让reader去执行read方法将文件描述符传过去由于主线程是死循环的发送消息所以我们就不让主线程去等待reader线程了直接将reader线程分离即可。分离后read线程就执行接收服务器消息的代码主线程执行向服务器发送消息的代码。 下面我们演示一下 首先我们可以搞一个小玩法先创建一个管道文件然后让服务器启动起来将所有服务器发给我们客户端的消息我们都重定向到管道文件中然后用另一个窗口使用cat命名查看管道文件中的内容这样的话就实现了一个窗口我们只发送消息一个窗口只查看服务器给我们发的消息群聊消息可以在服务器看到。但是因为我们客户端run函数中是cout打印cout会向一号描述符去打印这就导致打印的消息也被重定向到管道了所以我们将客户端中的消息用cerr打印cerr会打印到二号描述符这样就不会被重定向到管道文件了 上面重定向有什么作用呢作用其实就是让我们单独接收服务器给我们发送的消息这也是重定向的一种玩法。当我们运行起来后发现我们不能上线输入online不识别 原因是我们输入的时候会带有回车所以我们直接将回车去掉就好了 去掉后我们重新运行 我们发现这次可以正常的上线了我们再试试下线 下线也没有问题。下面我们开启两个Xshell来测试一下 先开启服务端 然后我们已经用另一个xshell发了消息客户端收到了消息 现在我们让这个用户上线 这个时候我们自己还没有上线 然后让自己上线 可以看到是没有问题的下面可以看一下多人一起聊天的成果 以上就是我们udp服务器实现大型网络聊天室的全部内容了。
http://www.pierceye.com/news/797772/

相关文章:

  • 怎么在word里做网站wordpress 父页面跳转
  • 网站添加验证码WordPress食谱小程序
  • 网站打包app公明做网站
  • 服装网站设计策划工业设计最吃香的专业
  • 东莞找公司网站ui界面设计说明范文
  • 淘宝网页版手机登录保定seo外包服务商
  • 网站开发 总结报告想给公司做网站怎么做
  • 思创医惠网站建设wordpress熊掌号号主页展现
  • 网站设置的参数新兴县城乡建设局网站登录
  • 网站未备案或已封禁六安城市网官网
  • 信息产业部网站备案系统建立一个网站的流程
  • 门户网站建站多少钱功能性质网站
  • 网站关键词是什么意思易网网站多少
  • 网站建设培训 上海网站建设公司有前途吗
  • 做普通网站选择什么服务器企业vi设计公司哪家好
  • 嘉兴本地推广网站如何查看网站是否开启gzip
  • 网站菜单导航制作教程畅言 wordpress插件
  • 太原网站建设联系方式免费创建网站教程
  • 有服务器自己怎么做网站深圳财务小公司网站
  • 装修装饰网站建设东莞环保公司
  • 网站开发大公司需要资格证吗申请域名免费
  • 建设维护网站未签订合同网站上线之前做哪些工作
  • dede 网站图标网站安装php
  • 网站管理更新维护湖南网站建设策划
  • 桥头东莞网站建设网站建设的开发方式和费用
  • 无锡网站优化哪家好wordpress会员内容
  • 网站需求分析的重要手机网站建设的规划
  • 国内大一html网站简单设计用那种语言做网站比较好
  • 网站的flash陕西煤化建设集团铜川分公司网站
  • 网站还能赚钱吗logo公司商标设计