io+day5

1,select服務端

1 #include<myhead.h>2 3 #define PORT 8888              //端口號4 #define IP "192.168.228.165"       //IP地址5 6 7 int main(int argc, const char *argv[])8 {9     //1、創建用于接受連接的套接字10     int sfd = socket(AF_INET, SOCK_STREAM, 0);11     if(sfd == -1)12     {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      13         perror("socket error");14         return -1;15     }16 17     printf("socket success sfd = %d\n", sfd);    //418 19 20     //設置端口號快速重用21     int reuse = 1;22     if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)23     {24         perror("setsockopt error");25         return -1;26     }27     printf("設置端口快速重用成功 _%d_ %s_ %s_\n", __LINE__, __FILE__, __func__);28 29 30 31 32 33     //2、綁定IP地址和端口號34     //2.1、填充要綁定的地址信息結構體35     struct sockaddr_in sin;36     sin.sin_family     = AF_INET;         //表明是ipv437     sin.sin_port     = htons(PORT);        //端口號38     sin.sin_addr.s_addr = inet_addr(IP);     //IP地址39 40     //2.2、綁定41     if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin))==-1)42     {43         perror("bind error");44         return -1;45     }46     printf("bind success _%d_ %s_ %s_\n", __LINE__, __FILE__, __func__);47 48     //3、將套接字設置成被動監聽狀態49     if(listen(sfd, 128) == -1)50     {51         perror("listen error");52         return -1;53     }54 55     printf("listen success _%d_ %s_ %s_\n", __LINE__, __FILE__, __func__);56 57     //4、阻塞等待客戶端連接請求,如果有新的客戶端連接,則創建一個新的用于通信的套接字58     //4.1、定義客戶端地址信息結構體59     struct sockaddr_in cin;             //客戶端地址信息結構體60     cin.sin_family     = AF_INET;61     socklen_t socklen = sizeof(cin);          //客戶端地址信息的大小62 63 64     定義一個用于檢測文件描述符的集合65     fd_set readfds, tempfds;                          //在棧區定義66 67     清空容器中的內容68     FD_ZERO(&readfds);69     將要檢測的文件描述符放入集合中70     FD_SET(sfd, &readfds);           //將sfd文件描述符放入71     FD_SET(0, &readfds);             //將0號文件描述符放入72 73 74 75     //定義一個容器76     char buf[128] = "";77     int res = 0;             //接收select的返回值78     int newfd = -1;          //存放用于最新連接客戶端的套接字79     int maxfd = sfd;          //定義控制select函數中最大文件描述符80 81     struct sockaddr_in saveCin[1024];       //用于存放客戶端地址信息結構體82 83 84     while(1)85     {86         將集合內容復制一份87         tempfds = readfds;88 89         使用select阻塞等待集合中的文件描述符有事件產生90         res = select(maxfd+1, &tempfds, NULL, NULL, NULL);91         if(res == -1)92         {93             perror("select error");94             return -1;95         }else if(res == 0)96         {97             printf("time out\n");98             return -1;99         }
100 
101 
102         //遍歷所有集合中文件描述符
103         for(int i=0; i<=maxfd; i++)
104         {
105             //判斷當前i是否在集合中,如果不在,直接判斷下一個
106             if(!FD_ISSET(i, &tempfds))
107             {
108                 continue;
109             }
110 
111             判斷sfd是否還在集合中
112             if( i == sfd)
113             {
114                 //4.2、阻塞接收客戶端的鏈接請求,并且獲取客戶端的地址信息
115                 newfd = accept(sfd, (struct sockaddr*)&cin, &socklen);
116                 if(newfd == -1)
117                 {
118                     perror("accept error");
119                     return -1;
120                 }
121                 printf("accept success _%d_ %s_ %s_\n", __LINE__, __FILE__, __func__);
122 
123                 將newfd放入readfds中
124                 FD_SET(newfd , &readfds);
125 
126                 //更新maxfd
127                 if(newfd > maxfd)
128                 {
129                     maxfd = newfd;
130                 }
131 
132                 //將最新的客戶端套接字放入數組的下標為new的位置
133                 saveCin[newfd] = cin;
134                 printf("newfd = %d\n", newfd);
135 
136             }else if(i == 0 )    //判斷是否是終端輸入
137 
138             {
139                 char buf1[1000] = "";
140 
141                 bzero(buf, sizeof(buf));
142                 //從終端獲取數據
143                 fgets(buf, sizeof(buf), stdin);       //從終端獲取數據
144                 buf[strlen(buf)-1]='\0';
145                 printf("觸發終端輸入事件:%s\n", buf);
146 
147                sprintf(buf1, "%s%s", "系統消息:", buf);
148 
149                 //將數據發送給所有客戶端
150                 for(int j=4; j<=maxfd; j++)
151                 {
152                     send(j, buf1,sizeof(buf1), 0);
153                 }
154 
155 
156             }else
157             {
158                 //5、收發數據使用newfd完成通信
159                 char buf[128] = "";
160                 //清空字符串
161                 bzero(buf, sizeof(buf));
162                 int ret = recv(i, buf, sizeof(buf), 0);        //從套接字中讀取客戶端發來的消息
163 
164                 //判斷收到的結果
165                 if(ret == 0)
166                 {
167                     printf("客戶端已經下線\n");
168                     close(i);             //關閉通信的套接字
169 
170                     將當前的文件描述符從集合中刪除
171                     FD_CLR(i, &readfds);
172 
173                     更新maxfd
174                     for(int j=maxfd; j>=0; j--)
175                     {
176                         //判斷當前的j是否在集合中,如果在,則為maxfd
177                         if(FD_ISSET(j, &readfds))
178                         {
179                             maxfd = j;
180                             break;
181                         }
182                     }
183 
184                     continue;           //繼續判斷下一個
185                 }else if(ret < 0)
186                 {
187                     perror("recv error");
188                     return -1;
189                 }
190 
191                 printf("[%s:%d]:%s\n", inet_ntoa(saveCin[i].sin_addr), ntohs(saveCin[i].sin_port), buf);
192 
193                 //將讀取的信息,加上一些字符發送回去
194                 strcat(buf, "*_*");
195                 send(i, buf, sizeof(buf), 0);
196 
197 
198             }
199         }
200 
201     }
202 
203 
204 
205     //6、關閉所有套接字
206     close(sfd);               //關閉監聽
207 
208     return 0;
209 }
~                                                                                                                          
 #include <myhead.h>2 3 #define SERPORT 8888              //服務器端口號4 #define SERIP "192.168.228.165"       //服務器IP地址5 6 int main(int argc, const char *argv[])7 {8     //創建用于通信的套接字9     int cfd = socket(AF_INET,SOCK_STREAM,0);10     if(cfd == -1)11     {12         perror("socket error");13         return -1;14     }15 16     //連接服務器17     ///填充服務器地址信息結構體18     struct sockaddr_in sin;19     sin.sin_family = AF_INET;20     sin.sin_port = htons(SERPORT);21     sin.sin_addr.s_addr = inet_addr(SERIP);22 23     ///連接服務器24     if(connect(cfd,(struct sockaddr *)&sin,sizeof(sin)) == -1)25     {26         perror("connect error");27         return -1;28     }29 30     //創建用于檢測文件描述符的集合31     fd_set readfds,tempfds;32 33     //清空集合34     FD_ZERO(&readfds);35 36     //將要檢測的文件描述符放入集合中37     FD_SET(cfd,&readfds);38     FD_SET(0,&readfds);39 40     int res = 0;    //接收select的返回值41     int maxfd = cfd;  //集合中值最大的文件描述符42 43     //向服務器進行數據的收發44     char buf[128] = "";45     int ret = 0;    //接收recv的返回值46     while(1)47     {48         tempfds = readfds;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            49 50         res = select(maxfd+1,&tempfds,NULL,NULL,NULL);51         if(res == -1)52         {53             perror("select error");54             return -1;55         }else if(res == 0)56         {57             printf("time out\n");58             return -1;59         }60 61         //遍歷集合中所有的文件描述符62         for(int i = 0;i <= maxfd;i++)63         {64             //判斷當前文件描述符是否在集合中65             if(!FD_ISSET(i,&readfds))66             {67                 continue;68             }69 70 71             //判斷0號文件描述符是否還在集合中72             if(0 == i)73             {74                 //從標準輸入中讀取數據75                 fgets(buf,sizeof(buf),stdin);76                 buf[strlen(buf)-1] == 0;77 78                 //將數據發送到服務器79                 if(send(cfd,buf,sizeof(buf),0) == -1)80                 {81                     perror("send error");82                     return -1;83                 }84 85             }else if(cfd == i)     //判斷cfd是否還在集合中86             {87                 //接收來自服務器的消息88                 ret = recv(cfd,buf,sizeof(buf),0);89                 if(ret == -1)90                 {91                     perror("recv error");92                     return -1;93                 }else if(ret == 0)94                 {95                     printf("服務器已關閉\n");96                     return -1;97                 }98 99                 printf("服務器消息:%s\n",buf);
100             }
101         }
102     }
103 
104     //關閉文件描述符
105     close(cfd);
106 
107     return 0;
108 }

效果圖

poll客戶端

  1 #include <myhead.h>2 3 #define IP "192.168.228.165"4 #define PORT 88885 6 int main(int argc, const char *argv[])7 {8     //創建用于連接的套接字9     int sfd = socket(AF_INET,SOCK_STREAM,0);10     if(sfd == -1)11     {12         perror("socket error");13         return -1;14     }15 16     //綁定服務器IP和端口號17     ///填充服務器地址信息結構體18     struct sockaddr_in sin;19     sin.sin_family = AF_INET;20     sin.sin_port = htons(PORT);21     sin.sin_addr.s_addr = inet_addr(IP);22 23     ///綁定24     if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin)) == -1)25     {26         perror("bind error");27         return -1;28     }29     printf("bind success\n");30 31     //將連接用套接字設置為被動監聽狀態32     if(listen(sfd,128) == -1)33     {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              34         perror("listen error");35         return -1;36     }37     printf("listen success\n");38 39     //定義一個集合管理sfd和打開的通信用文件描述符40     struct pollfd fds[1024];41     int maxfd = 0;42 43 44     //手動放入sfd45     fds[0].fd = sfd;46     fds[0].events = POLLIN;     //表明為讀事件47 48     //將fds中其余元素初始化為-149     for(int i = 4;i <= 1024;i++)50     {51         fds[i].fd = -1;52     }53 54     //填充客戶端地址信息結構體55     struct sockaddr_in cin;56     cin.sin_family = AF_INET;57     socklen_t socklen = sizeof(cin);58 59 60     char cbuf[128] = "";  //給客戶端用的容器61     int nfd;62     int res = 0;  //接收poll返回的結果63     while(1)64     {65         res = poll(fds,maxfd+1,-1);66         if(res == -1)67         {68             perror("select");69             return -1;70         }71         else if(res == 0)72         {73             continue;;74         }75         else if(res > 0)                //說明檢測到了有文件描述符對應的緩沖區的數據發生了改變76         {77             if(fds[0].revents ==  POLLIN)    //表明有新的客戶連接進來了78             {79                 int nfd = accept(sfd,(struct sockaddr*)&cin,&socklen);  //阻塞在此處,直到有客戶端連接上來80                 if(nfd == -1)   //增加這些錯誤的判斷非常重要,可以幫助找到出現問題的地方81                 {82                     perror("accept");83                     return -1;84                 }85 86                 //將新的文件描述符加入到集合中87                 for(int i = 1;i < 1024;i++)88                 {89                     if( fds[i].fd == -1)90                     {91                         fds[i].fd = nfd;92                         fds[i].events = POLLIN;93                         break;94                     }95                 }96 97                 //更新最大的文件描述符98                 if(nfd > maxfd)99                 {
100                     maxfd = nfd;
101                 }
102             }
103 
104             for(int i = 1;i <= maxfd;i++)     //輪詢客戶端對應的文件描述符
105             {
106                 if(fds[i].revents == POLLIN)  //說明此文件描述符對應的客戶端發送來了數據
107                 {
108                     int ret = read(fds[i].fd,cbuf,sizeof(cbuf));
109                     if(ret == -1)
110                     {
111                         perror("read");
112                         exit(-1);
113                     }
114                     else if(ret == 0)
115                     {
116                         printf("client closed\n");
117                         close(fds[i].fd);   //關閉對應的文件描述符
118                         fds[i].fd = -1;   //在fds中清空對應的文件描述符
119                     }
120                     else if(ret > 0)
121                     {
122                         printf("read buf = %s\n",cbuf);
123                         write(fds[i].fd,cbuf,strlen(cbuf)+1);
124                     }
125 
126 
127                 }
128             }
129         }
130     }
131     //關閉所有套接字
132     close(sfd);
133 
134     return 0;
135 
1 #include<myhead.h>2 #define SERIP "192.168.228.165"3 #define SERPORT 88884 #define CLIIP "192.168.228.165"5 #define CLIPORT 66666 7 int main(int argc, const char *argv[])8 {9     //1、創建客戶端用于通信的套接字10     int cfd = socket(AF_INET, SOCK_STREAM, 0);11     if(cfd == -1)12     {13         perror("socket error");14         return -1;15     }16     printf("cfd = %d\n", cfd);                //317 18 19     //2、綁定(可選)20     //2.1、填充地址信息結構體21     struct sockaddr_in cin;22     cin.sin_family     = AF_INET;            //使用的是ipv4通信23     cin.sin_port     = htons(CLIPORT);       //服務器端口號24     cin.sin_addr.s_addr     = inet_addr(CLIIP);       //服務器IP地址25     //2.2、綁定工作26     if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)27     {28         perror("bind error");29         return -1;30     }31     printf("bind success\n");32 33 34     //3、連接服務器35     //3.1、填充服務器地址信息結構體36     struct sockaddr_in sin;37     sin.sin_family     = AF_INET;            //使用的是ipv4通信38     sin.sin_port     = htons(SERPORT);       //服務器端口號39     sin.sin_addr.s_addr     = inet_addr(SERIP);       //服務器IP地址                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                40 41     //3.2、連接服務器42     if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) ==-1)43     {44         perror("connect error");45         return -1;46     }47     printf("connect success\n");48 49     //4、收發數據(send、recv、read、write)50     char buf[128] = "";51     char rbuf[128] = "";52 53     定義一個集合管理0號文件描述符和cfd54     struct pollfd fds[2];55 56     //將0號文件描述符放入57     fds[0].fd = 0;58     fds[0].events = POLLIN;          //表明要進行讀事件59 60     //將cfd放入集合61     fds[1].fd = cfd;62     fds[1].events = POLLIN;63 64     int res = 0;     //接收poll返回的結果65 66 67     while(1)68     {69         res = poll(fds, 2, -1);          //第三個參數如果是負數,表明一直等待70         if(res == -1)71         {72             perror("poll error");73             return -1;74         }else if(res == 0)75         {76             printf("time out\n");77             return -1;78         }79 80 81         bzero(buf, sizeof(buf));82         bzero(rbuf, sizeof(rbuf));83 84 85 86         //判斷是否是發送數據滿足條件87         if(fds[0].revents == POLLIN)88         {89             fgets(buf, sizeof(buf), stdin);       //從標準輸入中讀取數據90             buf[strlen(buf)-1] = '\0';91 92             //將數據發送給服務器93             send(cfd, buf, sizeof(buf), 0);94 95             //如果輸入的是quit則退出96             if(strcmp(buf,"quit") == 0)97             {98                 break;99             }
100         }
101 
102 
103 
104         //判斷是否為接收數據滿足條件
105         if(fds[1].revents == POLLIN)
106         {
107 
108             //接收服務器發送來的消息
109             int res = recv(cfd, rbuf, sizeof(rbuf), 0);
110             if(res == 0)
111             {
112                 printf("服務器已經關閉\n");
113                 break;
114             }
115             printf("rbuf = %s\n", rbuf);
116         }
117 
118     }
119 
120     //5、關閉客戶端套接字
121     close(cfd);
122 
123 
124     return 0;
125 }
126 
~                                                                                

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160893.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pikachu靶場PHP反序列化漏洞

pikachu靶場PHP反序列化漏洞 源碼分析 查看源代碼 class S{var $test "pikachu";function __construct(){echo $this->test;} }// O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_PO…

unityplayer.dll如何安裝?unityplayer.dll缺失的解決方法

Unityplayer.dll是Unity引擎所需的一個重要動態鏈接庫&#xff08;DLL&#xff09;文件&#xff0c;負責在運行Unity創建的游戲或應用程序時處理相關的軟件邏輯。如果此文件意外丟失&#xff0c;可能會導致錯誤提示&#xff0c;甚至阻止程序的正常運行。因此&#xff0c;對于許…

Threejs_12 物體陰影的實現

所以在Threejs的畫布世界之中&#xff0c;一個物體有自己的影子呢&#xff1f; 陰影效果的實現 你需要先知道在threejs世界中&#xff0c;有哪些燈光或者材質是可以產生陰影效果的 環境光沒有陰影 平行光有陰影(太陽) 點光源有陰影(燈泡) 聚光燈有陰影(手電筒) 平面光源沒有…

GB/T 40623-2021 船用防靜電升高地板檢測

防靜電升高地板是指由地板構架、可拆地板和防靜電貼面搭建的地板。 GB/T 40623-2021 船用防靜電升高地板測試&#xff1a; 測試項目 測試方法 尺寸偏差與形位公差 GB/T 40623 表面處理 GB/T 40623 外觀 GB/T 40623 升高地板電性能 GB/T 40623 升高地板的載荷性能-系…

代碼隨想錄二刷 | 鏈表 |環形鏈表II

代碼隨想錄二刷 &#xff5c; 鏈表 &#xff5c;環形鏈表II 題目描述解題思路 & 代碼實現判斷鏈表是否有環如何找到環的入口 題目描述 142.環形鏈表II 給定一個鏈表的頭節點 head &#xff0c;返回鏈表開始入環的第一個節點。 如果鏈表無環&#xff0c;則返回 null。 如…

想發EI國際學術會議,但學校要求知網,這種情況該如何解決?

#學術發表# #國際會議# #知網要求# 近期后臺有私信想把論文發表在EI國際會議上&#xff0c;但是畢業要求又規定必須在知網上發表。看起來處境比較困難&#xff0c;作為一名師兄&#xff0c;我來分享下我的建議。 先要明確知網和EI國際會議的不同和各自的優劣&#xff1a; 知…

圖神經網絡:消息傳遞算法

一、說明 圖網絡-GNN&#xff08;Graph Neural Networks&#xff09;是近幾年研究的主題之一&#xff0c;雖不及深度神經網絡那么火爆&#xff0c;但在一些領域&#xff0c;如分子化學方面是不得不依賴的理論。本文就一些典型意義的圖神經網絡消息傳遞展開闡述。 二、圖網絡簡述…

Vue 3 渲染機制解密:從模板到頁面的魔法

Vue 3 渲染機制解密 前言Vue 3的響應性系統1. **Reactivity API:**2. **Proxy 對象:**3. **Getter 和 Setter:**4. **依賴追蹤:**5. **批量更新:**6. **異步更新:**7. **遞歸追蹤:**8. **刪除屬性:** 虛擬DOM的角色1. **減少直接操作真實 DOM:**2. **高效的批量更新:**3. **跨平…

【java】想要限制每次查詢的結果集不能超過10000行,該如何實現?

文章目錄 前言 前言 對于一些Saas化軟件&#xff0c;當某個租戶在執行查詢SQL時&#xff0c;如果查詢條件出現了BUG&#xff0c;導致去查了所有租戶的數據&#xff0c;這種情況是非常嚴重的&#xff0c;此時就需要在架構層面做限制&#xff0c;禁止一些特殊SQL的執行&#xff…

@PropertySource適配通配符加載到Environment的一種方案

PropertySource可將配置文件加載到內存&#xff0c;時間有限說干的&#xff0c;PropertySource注解有4個參數&#xff0c;其中value表示要加載文件的路徑&#xff0c;這個參數不支持通配符。還有一個參數PropertySourceFactory是加載配置文件的工廠&#xff0c;這兩個參數配合使…

【GUI】-- 13 貪吃蛇小游戲之食物及成績判斷

GUI編程 04 貪吃蛇小游戲 4.4 第四步&#xff1a;食物及成績判斷 首先&#xff0c;添加食物與分數的數據定義&#xff1a; //食物的坐標int foodX;int foodY;Random random new Random();//積分面板數據結構int score;在初始化方法中&#xff0c;添加(畫出)食物與分數&…

CSDN最新最全pytest系列——pytest-base-url插件之配置可選的項目系統UR

前言 ①當我們的自動化代碼完成之后&#xff0c;通常期望可以在不同的環境進行測試&#xff0c;此時可以將項目系統的URL單獨拿出來&#xff0c;并且可以通過pytest.ini配置文件和支持pytest命令行方式執行。 ② pytest-base-url 是一個簡單的pytest插件&#xff0c;它通過命…

紐扣電池上架TEMU、亞馬遜美國站需要做什么認證?紐扣電池認證標準16CFR1700.15,16CFR1700.20

近日&#xff0c;Temu連發多條賣家彈窗內容均為商品質量事故違規處理通告。其中一條為賣家銷售的車載吸塵器發生燒毀、冒煙等情況&#xff0c;產生用戶人傷、財損等輿情。經查實是商家偷換關鍵部件鋰電池&#xff0c;導致商品質量下降造成事故。TEMU對于問題車載吸塵器處理結果…

opencv 存儲bgr格式/同理可類推yuv

需求背景 開發rk3588 音視頻硬件編解碼&#xff0c;然后看見他的輸入文件格式。。 只能是裸的文件。不能是壓縮過的。就是不能是jpg/png這種格式&#xff0c;只能是以下的圖像/視頻 的存儲格式.那么我沒有這個格式的&#xff0c;以前hi3559的bgr格式和他要的也不太一致&#x…

設計循環隊列,解決假溢出問題

什么是假溢出&#xff1f; 當我們使用隊列這種基本的數據結構時&#xff0c;很容易發現&#xff0c;隨著入隊和出隊操作的不斷進行&#xff0c;隊列的數據區域不斷地偏向隊尾方向移動。當我們的隊尾指針指向了隊列之外的區域時&#xff0c;我們就不能再進行入隊操作了&#xff…

單鏈表在線OJ題二(詳解+圖解)

1.在一個排序的鏈表中&#xff0c;存在重復的結點&#xff0c;請刪除該鏈表中重復的結點&#xff0c;重復的結點不保留&#xff0c;返回鏈表頭指針 本題的意思是要刪除鏈表中重復出現的節點&#xff0c;然后返回刪除重復節點后的鏈表。 我們可以直接用一個哨兵位以便于觀察鏈表…

【GIT】代碼倉庫服務器變更本地修改并推送

author: jwensh date: 20231122 問題背景 沒有使用域名的 gitlb 服務器搬移&#xff08;IP地址變了&#xff09;&#xff0c; 以至于 gitlab 管理的項目無法進行連接及推送。因為涉及到多個項目工程&#xff0c;所以可以用本地配置修改的方式來進行重新關聯&#xff08;這種修…

指針變量和地址

A.指針變量和地址 理解了內存和地址的關系&#xff0c;我們再回到C語?&#xff0c;在C語?中創建變量其實就是向內存申請空間&#xff0c;比如&#xff1a; #include <stdio.h> int main() {int a 10;return 0; } ?如&#xff0c;上述的代碼就是創建了整型變量a&…

spring-boot-admin-starter-server監控springboot項目

文章目錄 場景實現具體操作展示 場景 監控三件套Prometheus、Grafana、Alertmanager 部署起來太復雜,如果公司沒有運維而且項目很小就可以使用spring-boot-admin-starter-server替代。這個包使用起來還是很簡單的, 下面就實現一個對springCloud項目的監控 實現 參考 項目 具體操…

算法通關村第十二關|青銅|字符串轉換整數

1.轉換成小寫字母 原題&#xff1a;力扣709. 字符串大寫轉小寫有現成的API使用&#xff0c;但是我們也可以自己來實現。 使用或運算進行加操作能提高效率&#xff0c;因為 32 對應的二進制表示為 00100000 &#xff0c;而大寫字母的范圍 [65, 90] 的二進制表示在 00100000 的…