目錄
前言
步驟
一、實作思路
二、配置服務器
服務器選購
登錄服務器
三、開放埠
1.設定安全組
2.開放服務器系統防火墻
四、實機演練
1.原始碼和應用程式資源
2.配置軟體所需檔案
3.除錯程式
結語
前言
之前想學網路編程,但是用內網做測驗總感覺沒什么意思,于是就買了一個云服務器,直接干公網,
配套用的原始碼都是從網上找的,畢竟我是初學的萌新嘛,
我是從一個購買服務器都需要別人指點的小白, 到最后成功搭建好服務器,再到利用公網ip實作了簡單通信,
求學程序中問了很多老師,也從網上翻閱了很多資料,搞了兩天左右吧,終于能夠實作通過公網ip進行通信,
寫這篇博客,主要是想分享一下我的經驗,希望能夠幫到后來的像我一樣的小白,
步驟
一、實作思路
這里主講實作的大致思路和基礎理論知識,方便理解之后的操作,
實作功能:利用公網ip實作簡單通信,
基本步驟:1.購買服務器(搭建服務器)
2.登錄服務器
3.開放服務器的ip地址和埠號
4.將應用程式的服務端下載到服務器桌面上
5.將應用程式的客戶端下載到客戶機桌面上
6.配置服務端與客戶端的ip地址和埠號
基本理論知識:
我會提供測驗用的原始碼和能夠直接運行的應用程式,c語言撰寫,編譯器是vs2019社區版,
應用程式分為服務端和客戶端兩個,使用TCP/IP協議,需要的引數有ip地址和埠,
ip地址相當于是你電腦的一個標識,可以理解為身份證或者QQ號,用來區分不同的計算機,ip分為公網ip和私網ip,公網ip是在互聯網中使用的,每個ip的歸屬都是唯一的且不可重復使用,私網ip是用在機房,局域網,公司內部的ip
想要暢游互聯網,則必須要有公網ip才行,一般像哪種聯網的軟體或者游戲,一定是有一個甚至多個獨立的公網ip,并且這個公網ip還是他們公司獨有的,而我們平常的這些wifi,手機流量上網,也是有公網ip的,你可以瀏覽器搜索ip,結果會顯示你正在使用的公網ip,但這個公網ip他并不是我們獨有的,而是我們非常多的人共用一個,我們上網使用的公網ip是運營商提供的,運營商通過這個公網ip連通了外網,然后運營商又建立了一個私網,也就是運營商內部的網路,將我們都囊括在這個內網當中,再用技術手段打通內網和外網,使得我們也可以通過這個公網ip訪問互聯網,這個技術應該叫內網穿透,有興趣的小伙伴可以去了解下,我們實際都是在運營商內部的網路里, 我們對運營商的公網ip是沒有控制權的,所以哪些互聯網公司才要有自己獨有的公網ip,
公網ip與服務器是購買服務器后就自動系結好了,直接用就行,客戶端ip地址不用管,
埠就相當于一個通道,給這個程式提供的一個服務端與客戶端之間用于通信的專屬通道,
ip地址就是像192.168.0.1這樣,埠號取值范圍是0-65535,
客戶端發送訊息給服務端,服務端接受訊息并將之輸出在軟體界面上,這是我提供的程式所實作的功能,
客戶端通過服務端的公網ip找到服務器,建立連接,然后在我們所提供的埠互相發送訊息,
客戶端負責發送訊息,且可以有很多個客戶端,他們的矛頭都對準服務器的公網ip,
服務端負責接受訊息,只有一個,他要接受所有客戶端發來的訊息,也就是接受所有ip地址發來的訊息,
服務端與客戶端的埠號要一致,一般取5000以上,因為5000以下已經被別的軟體占用,
常用埠號:80是網站默認埠,遠程桌面默認是3389
客戶端的目標ip填服務器的唯一公網ip,服務端的目標ip地址填0.0.0.0\0,指代所有ip地址,可以接收所有ip地址發來的訊息,
客戶端的埠,一般不用管,關閉防火墻即可,
服務器的埠,默認是關閉的、不允許使用的,因此我們在確立好ip地址后還要開放埠,
開放埠要設定兩處地方,一處服務器系統里的防火墻,一處是網頁控制臺云服務器中的安全組,后面會講開放埠的詳細操作,
這些基礎的理論全是個人理解和心得,旨在讓零基礎的伙伴也能在短時間內理解服務器與客戶機之間的通信原理,
二、配置服務器
服務器選購
服務器我是買的騰訊云服務器啦,最便宜最低的配置,
1核2G+50g硬碟+1M寬帶,期限1年,不過咱只是用來學習,夠用,
其他平臺類似谷歌、百度、阿里云之類都可以,像我這個配置一般在100塊大洋左右就可以入手啦,
具體的購買步驟,csdn里有很多,也可以找騰訊云服務器里面的客服小姐姐(很熱情的喲),
這里推薦一個騰訊云的客服小姐姐, 她的微信號是: TXYXH18632077257

她堅持不懈的精神,實在使我感動,也是她給我介紹了一位幫助到我很多的大佬,
有事找客服,既不收錢效率還高[狗頭],倆字: 專業!
購買服務器時,需要注意以下幾點:
(1)記下配送的公網ip,一般買的時候會附贈一個彈性公網ip,彈性公網ip就是可隨時更換的公網ip,
(2)服務器系統,樓主這里使用的Windows Server 2016,不過聽說目前主流還是用Windows Server 2012,關系不大,
(3)服務器所在地,優先選北京,我聽別個說的,上海丟包率較高,具體啥影響啥情況不清楚,
登錄服務器
1.進入控制臺,直接從這個網址進入: https://console.cloud.tencent.com/cvm
按照下面操作,把 云服務器 操作界面掛到導航欄上,方便以后訪問,


2.登錄,實體-->登錄,通過短信驗證 或者人臉驗證
3.下載RDP檔案,

4.在檔案夾中找到以.rdp為后綴的檔案,右鍵--編輯

5.常規---計算機,在計算機一欄中輸入購買服務器時配送的公網ip,然后點擊連接

6.只有第一次需要配置公網ip,以后只要雙擊.rdp檔案即可登錄到服務器,
登錄服務器后,是下面這個樣子,最大化不好截屏,所以只能這樣了,
是不是感覺跟win10差不多,看看開始選單就能發現一些不一樣的東西,
在配置服務器的時候,其實我是搭建過網站的,搭建網站的教程網上很多,我以后有可能會出,

三、開放埠
這里需要對服務器的安全組和防火墻兩處進行設定,兩處必須都開放,才能進行通信,
1.設定安全組
(1)打開 云服務器 界面,點擊 安全組
(2) 點擊 修改規則
(3)安全組規則-->入站規則-->添加規則

(4)型別選自定義 來源填 0.0.0.0/0 協議埠填 TCP:埠號(我這里使用65400) 策略選 允許 ,填好后點 完成
填0.0.0.0/0代表所有外來的,訪問我們服務器的ip地址

(5)弄好后是這個樣子,你可以點擊箭頭指向的按鈕對這條規則進行修改

2.開放服務器系統防火墻
這里提供兩種方案,任選一種 即可,
(1)直接關閉防火墻,省事,但是不安全,容易遭受網路攻擊,
1.打開控制面板,不會打開控制面板的小伙伴,可以點擊下方的b站鏈接喲(這個b站教程就是樓主錄的),只需要一分鐘不到就能學會,
https://www.bilibili.com/video/BV1DK411P7Rm

2.點擊系統和安全

3.點擊Windows防火墻

4.點擊啟用或關閉Windows防火墻

5.勾選關閉Windows防火墻,最好兩個都勾上,再點確定

(2)設定防火墻入站規則
1.打開Windows防火墻 參考直接關閉防火墻 前3個步驟
2.點擊高級設定

3.點擊入站規則

4.點擊新建規則

5.選擇埠,點下一步

6.選擇TCP,選擇特定本地埠,方框內填寫埠號,點下一步

7.選擇允許連接,點下一步

8.全部勾選,點下一步

9.填寫名稱,用數字或者字母最好,點完成

10.設定好是這個樣子

四、實機演練
1.原始碼和應用程式資源
堅果云:https://www.jianguoyun.com/p/Dc50naMQ2aKaCBiu1NsD
百度云:https://pan.baidu.com/s/1VR20ZV5l1RsZQ4aB0JoZrg 提取碼: kca9
必須要下載vcruntime140.dll,Rchat.exe才能正常運行,

原始碼如下,這是我從網上copy來的,稍微修改了一下,8至15行的函式red(),就是我添加的代碼,程式運行所需要的兩個引數,ip地址和埠號,是從一個叫top.txt的文本檔案中讀取,
這個程式因為太過簡單,所以服務端和客戶端都是打包在一起的,
#include<stdio.h>
#include"winsock2.h"
#include<conio.h>
#pragma comment (lib, "ws2_32.lib")
char Adr[40]; int dk;
void server();
void client();
void red()
{
FILE* fp;
fp = fopen("top.txt","r");
fgets(Adr,40,fp);
fscanf_s(fp,"%d",&dk);
fclose(fp);
}
int main()
{
int user;
red();
printf("IP:%s 埠:%d\n", Adr, dk);
printf("-------------------------------\n");
printf("請選擇(1-server 2-client):");
scanf_s("%d", &user);
getchar();//清理緩沖區中留下的回車鍵 gets();或fflush(stdin);效果一樣
printf("-------------------------------\n");
if (user == 1)
server();
else if (user == 2)
client();
getch();
return 0;
}
void server()
{
WSADATA wsadata;
SOCKET listeningsocket;
SOCKET connectionsocket;
SOCKADDR_IN serveraddr;
SOCKADDR_IN clientaddr;
int size_clientaddr = sizeof(clientaddr);
char recvdata[1024];
WSAStartup(MAKEWORD(2, 2), &wsadata);//初始化Winsock 2 DLL (Ws2_32.dll)
listeningsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//創建監聽套接字
serveraddr.sin_family = PF_INET;
serveraddr.sin_addr.s_addr = inet_addr(Adr);
serveraddr.sin_port = htons(dk);
bind(listeningsocket, (SOCKADDR*)&serveraddr, sizeof(serveraddr));//系結埠和本機地址
listen(listeningsocket, 5);//監聽連接,設定最多接受5個連接
printf("等待接受連接...\n");
connectionsocket = accept(listeningsocket, (SOCKADDR*)&clientaddr, &size_clientaddr);//等待連接
printf("新連接:IP:%s 埠:%d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
while (1)
{
if (recv(connectionsocket,(char *)&recvdata, 1024, 0) > 0)
printf("%s\n", recvdata);
else
break;
}
printf("連接中斷!\n");
closesocket(connectionsocket);
closesocket(listeningsocket);
WSACleanup();//終止Winsock 2 DLL (Ws2_32.dll) 的使用
}
void client()
{
WSADATA wsadata;
SOCKET sock;
SOCKADDR_IN sockaddr;
char senddata[1024];
WSAStartup(MAKEWORD(2, 2), &wsadata);//初始化Winsock 2 DLL (Ws2_32.dll)
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);//創建連接套接字
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.S_un.S_addr = inet_addr(Adr);
sockaddr.sin_port = htons(dk);
connect(sock, (SOCKADDR*)&sockaddr, sizeof(sockaddr));//請求連接
printf("連接成功!\n");
while (1)
{
printf("請輸入要發送的內容:");
gets_s(senddata);
send(sock, senddata, sizeof(senddata), 0);
}
printf("連接中斷!\n");
closesocket(sock);
WSACleanup();//終止Winsock 2 DLL (Ws2_32.dll) 的使用
}
2.配置軟體所需檔案
(1)在服務器和客戶機分別下載好Rchat.exe、vcruntime140.dll,并且兩個檔案需要放到同一個檔案夾里面,
這里推薦使用堅果云下,注冊后即可在線下載,無需安裝軟體,
客戶機就是你平常用來打游戲上網的電腦,要聯網,
(2)在服務器的檔案夾下面,創建一個txt檔案,命名為top.txt,并且如圖填寫內容

第一行寫0.0.0.0,代表接收所有ip地址發來的資訊
第二行寫自己設定的埠號,我這里寫的是65400
寫好后,按Ctrl+S快捷鍵保存

(3)在客戶機的檔案夾下面,創建一個txt檔案,命名為top.txt,并且如圖填寫內容

第一行填服務器的公網ip,代表把訊息發送到服務器
第二行寫自己設定的埠號,我這里是65400,須與服務器的埠一致
寫好后,按Ctrl+S快捷鍵保存

3.除錯程式
(1)雙擊運行服務器的Rchat.exe,輸入 1

(2)雙擊運行客戶機的Rchat.exe,輸入 2

(3)連接成功,反饋的埠號與設定的埠號不一致,可能是代碼的問題,但不影響正常通信,暫時不用管,懇請大佬給出解答,

但是反饋的ip地址與客戶機運營商提供的ip是一致的,為了人身安全考慮,有關公網ip的部分我都打了碼,
這就驗證了我之前在 實作思路 中的說法,

(4)發送訊息,服務器能夠正常接收由客戶端發出的訊息,到此,實驗成功,

結語
寫了將近一天一夜,熬夜到凌晨5點,終于寫完啦哈哈,中間防火墻那段截圖,是用手機遠程登錄服務器的截屏,所以可能會有些模糊,
最后, 求贊求收藏哇!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/249793.html
標籤:其他
上一篇:資料結構——堆
