1. Qt连接代码
void Client::toConnect()
{
if (isConnecting || QAbstractSocket::UnconnectedState != tcpSocket->state())
return;
tcpSocket->abort();
tcpSocket->connectToHost(QHostAddress(SERVER_IP), SERVER_PORT);
tcpSocket->waitForConnected();
}
这里省略Linux处理代码...
2. 问题分析以及解决方法
2.1 服务器IP是否能被Ping通?
打开cmd窗口(①win+r,然后输入cmd回车。②或直接搜索框直接搜索cmd)
ping 服务器地址/域名
2.2 客户端中的服务器IP和Port是否填写正确?
Qt中连接服务器的两个函数的函数原型:
注:quint16 = unsigned short
(1)第一个参数:QString形式的IP,第二个参数:quint16的参数,最后两个参数不需要填。
[virtual] void QAbstractSocket::connectToHost(const QString &hostName,
quint16 port,
QIODevice::OpenMode openMode = ReadWrite,
QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
(2)第一个参数:QHostAddress形式的IP,第二个参数:quint16的参数(quint16 = unsigned short),最后两个参数不需要填。
[virtual] void QAbstractSocket::connectToHost(const QHostAddress &address,
quint16 port,
QIODevice::OpenMode openMode = ReadWrite)
2.3 Linux的代码处理是否正确?
自己先在Linux上编写几个客户端测试测试,看看所写的服务器代码是否能够正确处理客户端连接。
2.4 Linux服务器端口是否开放(很重要)?
有两种解决方法:①开放端口;②关闭防火墙
2.4.1 开放端口(一劳永逸,推荐!)
先列举需要用到的命令:
(1)查看所有已开放端口:firewall-cmd --list-port
(2)查看某个端口是否开放:firewall-cmd --query-port=端口号/协议(tcp/udp)
(3)开启端口:firewall-cmd --zone=public --add-port=端口号/协议(tcp/udp) --permanent
(4)移除端口:firewall-cmd --zone=public --remove-port=端口号/协议(tcp/udp) --permanent
(5)重启防火墙:firewall-cmd --reload
实例说明:开放端口7799去用于客户端通信
第一步:开放端口7799用于TCP通信
[root@VM-4-2-centos ~]# firewall-cmd --zone=public --add-port=7799/tcp --permanent
第二步:重启一下防火墙
[root@VM-4-2-centos ~]# firewall-cmd --reload
第三步:添加服务器的防火墙规则,这一步不弄也是连接不上的
步骤分析:
1)第三步不弄的话也是连接不上的...,因为没添加务器的防火墙规则。
2)如果只是弄了第三步,那也是连接不上的...,因为使用firewall-cmd --list-port
命令是查不到服务器添加的防火墙规则。
2.4.2 关闭防火墙(开放所有端口,不推荐!)
这里也有两种方法,第一种麻烦但是相对安全,第二种方便但是很不安全。
方法一:每次通信时都去关闭防火墙
方法二:关闭防火墙之后,再禁用防火墙自启,防止防火墙自启导致端口无法使用
作用 | 命令 |
---|---|
关闭防火墙 | systemctl stop firewalld |
禁用防火墙自启 | systemctl disable firewalld |
启动防火墙 | systemctl start firewalld |
启动防火墙开机自启 | systemctl enable firewalld |