Socket使用中常见的异常整理

在平时开发过程中,不可避免的会涉及到网络编程,虽然网上有很多网络开发框架,但是基本的网络操作还是要有所了解的,如果想要告别“屌丝码农”的境地,那么基本的网络编程知识是必须的,而且要深入。越深越好~最近看郭霖大哥的一部视频,感觉棒棒的,是讲Android即时推送的,以Androidpn这个开源项目为基础,讲解内部实现原理,相信对理解客户端与服务器通信会有更深入的理解,虽然我刚开始,一个Socket就把我弄懵逼了,现在整理一下在使用Socket过程中常见的异常,自己在使用中遇到了部分,剩下的其他估计在以后会遇到吧,先整理下来,为以后做个铺垫。
1.java.net.SocketTimeoutException.这个异常比较常见,socket超时。一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(SocketAddress endpoint,int timeout)中的后者来决定,还有就是setSoTimeout(int timeout),这个是设定读取的超时时间。它们设置成0均表示无限大。

2.java.net.BindException:Address already in use: JVM_Bind。该异常发生在服务器端进行new ServerSocket(port) 或者socket.bind(SocketAddress bindpoint)操作时。
原因:与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。

3.java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行new Socket(ip, port)或者socket.connect(address,timeout)操作时.
原因:指定ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。应该首先检查客户端的ip和port是否写错了,假如正确则从客户端ping一下服务器看是否能ping通,假如能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在

<think>好的,用户想了解如何在Qt中使用TCP Socket进行网络通信,并希望得到教程和示例代码。首先,我需要整理Qt中TCP通信的核心组件,即QTcpServer和QTcpSocket。根据引用[3],QTcpServer用于监听端口和获取客户端连接,而QTcpSocket用于实际的通信。用户可能需要从基础步骤开始,包括创建服务器和客户端,设置信号槽机制,处理连接和断开的情况。 接下来,我需要参考提供的引用内容,尤其是引用[1]和[3],里面提到了如何处理断开连接的情况,以及基本的API使用。比如,服务端通过监听newConnection信号来处理新连接,客户端连接后通过QTcpSocket进行数据读写。同时,引用[4]中的示例可能涉及到数据传输的具体实现,比如使用JSON格式,但用户可能更关注基础通信流程,所以暂时不需要深入复杂的数据处理。 用户需要示例代码,因此要分别提供服务端和客户端的代码片段。服务端部分应包括创建QTcpServer实例,绑定地址和端口,监听连接,并在有客户端连接时获取QTcpSocket。客户端部分则是创建QTcpSocket,连接到服务器,处理数据接收。同时,要确保代码符合Qt的标准写法,比如使用信号槽连接,处理错误情况。 另外,需要注意用户提到的系统级指令,比如行内数学表达式不需要,但代码块需要用正确格式。引用部分需要自然添加标识,比如在讨论断开连接时引用[1],提到QTcpServer和QTcpSocket时引用[3]。 可能还需要考虑常见的注意事项,比如网络权限、事件循环、线程安全等,这些在引用[1]和[2]中有提到。例如,在.pro文件中添加network模块,处理不同平台下的网络权限问题,以及避免在子线程中直接操作UI组件。 最后,生成相关问题时要围绕Qt TCP通信的扩展,比如多线程处理、数据协议、心跳机制和错误处理,这些都是用户可能进一步需要了解的内容。确保问题与教程内容相关,帮助用户深入学习。</think>在Qt中使用TCP Socket进行网络通信主要通过$QTcpServer$和$QTcpSocket$类实现。以下是详细步骤和示例代码: --- ### 一、核心流程与类说明 1. **服务端** - **$QTcpServer$** 负责监听端口和接受连接 - 绑定地址与端口:调用$listen(QHostAddress::Any, port)$[^3] - 通过$newConnection$信号触发客户端连接事件 2. **客户端/服务端通信** - **$QTcpSocket$** 实现数据读写 - 使用$connectToHost(ip, port)$建立连接 - 通过$readyRead$信号触发数据接收[^3] --- ### 二、服务端实现示例 ```cpp // Server端代码(基于Qt 5.9.9) #include <QTcpServer> #include <QTcpSocket> #include <QDebug> class MyServer : public QTcpServer { Q_OBJECT public: explicit MyServer(QObject *parent = nullptr) : QTcpServer(parent) { connect(this, &QTcpServer::newConnection, this, &MyServer::handleNewConnection); if (!listen(QHostAddress::Any, 12345)) { qDebug() << "监听失败:" << errorString(); } } private slots: void handleNewConnection() { QTcpSocket *clientSocket = nextPendingConnection(); connect(clientSocket, &QTcpSocket::readyRead, [=](){ QByteArray data = clientSocket->readAll(); qDebug() << "收到数据:" << data; clientSocket->write("服务端已接收"); }); connect(clientSocket, &QTcpSocket::disconnected, [=](){ qDebug() << "客户端断开"; clientSocket->deleteLater(); }); } }; ``` --- ### 三、客户端实现示例 ```cpp // Client端代码 #include <QTcpSocket> #include <QDebug> class MyClient : public QObject { Q_OBJECT public: explicit MyClient(QObject *parent = nullptr) : QObject(parent) { socket = new QTcpSocket(this); connect(socket, &QTcpSocket::connected, [](){ qDebug() << "已连接到服务端"; }); connect(socket, &QTcpSocket::readyRead, [this](){ qDebug() << "收到回复:" << socket->readAll(); }); socket->connectToHost("127.0.0.1", 12345); } void sendMessage(const QString &msg) { if (socket->state() == QAbstractSocket::ConnectedState) { socket->write(msg.toUtf8()); } } private: QTcpSocket *socket; }; ``` --- ### 四、关键注意事项 1. **网络权限配置** - 在.pro文件中添加$QT += network$[^2] - 移动端需配置网络权限 2. **连接状态判断** - 检测$disconnected$信号时,可通过$socket->state() == QAbstractSocket::UnconnectedState$确认断开类型[^1] 3. **错误处理** - 监听$errorOccurred(QAbstractSocket::SocketError)$信号处理网络异常 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值