目录
前言
步骤
一、实现思路
二、配置服务器
服务器选购
登录服务器
三、开放端口
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)打开 云服务器 界面,点击 安全组
(2) 点击 修改规则
(3)安全组规则-->入站规则-->添加规则
(4)类型选自定义 来源填 0.0.0.0/0 协议端口填 TCP:端口号(我这里使用65400) 策略选 允许 ,填好后点 完成
填0.0.0.0/0代表所有外来的,访问我们服务器的ip地址
(5)弄好后是这个样子,你可以点击箭头指向的按钮对这条规则进行修改
这里提供两种方案,任选一种 即可。
(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.设置好是这个样子
坚果云: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
#include"winsock2.h"
#include
#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) 的使用
}
(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快捷键保存
(1)双击运行服务器的Rchat.exe,输入 1
(2)双击运行客户机的Rchat.exe,输入 2
(3)连接成功,反馈的端口号与设置的端口号不一致,可能是代码的问题,但不影响正常通信,暂时不用管,恳请大佬给出解答。
但是反馈的ip地址与客户机运营商提供的ip是一致的。为了人身安全考虑,有关公网ip的部分我都打了码。
这就验证了我之前在 实现思路 中的说法。
(4)发送消息。服务器能够正常接收由客户端发出的消息,到此,实验成功。
写了将近一天一夜,熬夜到凌晨5点,终于写完啦哈哈。中间防火墙那段截图,是用手机远程登录服务器的截屏,所以可能会有些模糊。
最后, 求赞求收藏哇!!!