当前位置: 首页 > news >正文

手机网站建设方案doc好听简短域名

手机网站建设方案doc,好听简短域名,seo 网站制作,网站建设1選宙斯站长网络基础 TCP与UDP基础 关于TCP与UDP的基础这里就不过多介绍了#xff0c;具体可以查看对应百度百科介绍#xff1a; TCP#xff08;传输控制协议#xff09;_百度百科 (baidu.com) UDP_百度百科 (baidu.com) 需要知道这两者的区别#xff1a; 可靠性#xff1a; TC…网络基础 TCP与UDP基础 关于TCP与UDP的基础这里就不过多介绍了具体可以查看对应百度百科介绍 TCP传输控制协议_百度百科 (baidu.com) UDP_百度百科 (baidu.com) 需要知道这两者的区别 可靠性 TCPTCP 是一种面向连接的协议它提供可靠的数据传输。它使用序号、确认和重传等机制来确保数据的可靠性以及按序传递数据包。如果数据包丢失或损坏TCP 会自动进行重传直到数据被正确接收。UDPUDP 是一种无连接的协议它不提供数据包的可靠性保证。UDP 发送的数据包可能丢失、重复或无序因此它不适合对数据可靠性要求很高的应用。 连接性 TCPTCP 是面向连接的它在通信双方建立连接后有客户端与服务器之分才能进行数据传输。TCP 连接是可靠的、有序的、全双工的通信双方可以进行双向通信。UDPUDP 是无连接的它不需要在通信双方之间建立连接没有客户端与服务器之分。每个 UDP 数据包都是独立的发送者和接收者之间没有持久的连接。 效率 TCPTCP 通过使用流量控制和拥塞控制等机制以及连接的建立和维护会产生一定的开销。因此TCP 在可靠性和有序性方面提供了较高的保证但可能会牺牲一些效率。UDPUDP 不需要进行连接的建立和维护也不需要进行重传或流量控制等操作因此它通常比 TCP 具有更低的开销和更高的效率。 网络通信以上两者都绕不开IP地址与端口这两个。 开发调试所需工具 一般情况需要网络调试助手或者wireshark抓包工具网络调试助手我用的是NetAssist。关于NetAssist和WireShark怎么使用后面会介绍。 windows与linux如何查看和修改本地的IP端口 Window cmd命令行ipconfig/all 修改 设置选中“网络和Internet” Linux 命令行ifconfig -a: static QStringList getIPAddresses() {QStringList addresses;for (const QHostAddress address : QNetworkInterface::allAddresses()) {if (address.protocol() QAbstractSocket::IPv4Protocol)addresses.append(address.toString());}return addresses; } 或者直接查看网络设置。 使用Qt函数获取 Qt要使用网络模块记得工程文件添加QT network static QStringList getIPAddresses() {QStringList addresses;for (const QHostAddress address : QNetworkInterface::allAddresses()) {if (address.protocol() QAbstractSocket::IPv4Protocol)addresses.append(address.toString());}return addresses; } 编译运行查看打印 Windows与Linux查看本地连接情况 Windows和Linux都需要借助netstat命令但是两者稍微有一些不一样。 Windows 比如我使用刚刚的调试助手NetAssist建立一个tcp服务器然后监听IP192.168.5.1端口8080。 查看一下这个服务器是否监听成功命令行输入netstat -antp TCP‘p’指定对应协议后面需要接协议类型TCP或UDP 或者直接输入命令 netstat -antp TCP|findstr 8080: 再起一个调试助手以客户端的形式连接这个服务器 再次输入 netstat -antp TCP|findstr 8080: 能够查看到刚刚建立的连接。 查看对应链接是哪个应用建立的先输入 netstat -antpo TCP|findstr 8080: 然后使用tasklist查看对应进程  如果是UDP改为 netstat -antp UDP|findstr 8080 即可 Linux  Linux 的netstat的命令指定对应协议不需要 -p TCP或者-p UDP而是-t就是TCP-u就是UDP如下图所示 Qt实现TCP 因为TCP是需要建立链接分客户端和服务器端的所以需要分别编写。 服务器端 服务器由QTcpServer来实现QTcpServer的信号 需要注意newConnection这个信号当有客户端连接这个服务器时会触发这个信号。 所有的方法 需要注意的几个方法 bool  listen(const QHostAddress address QHostAddress::Any, quint16 port 0)  监听对应IP和端口IP为空则默认监听any close() 停止监听 bool isListening() const  是否正在监听 QHostAddress serverAddress() const  监听的IP地址 quint16 serverPort() const  监听的端口 void setMaxPendingConnections(int numConnections)  设置允许建立的最大连接数 比如监听IP 127.0.0.1 端口 8080 QTcpServer server; server.listen(QHostAddress(127.0.0.1),8080);  写一个简单的例子。 ui 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include QTcpServer #include QTcpSocket QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow {Q_OBJECT public:MainWindow(QWidget *parent nullptr);~MainWindow(); private slots:void on_listen_clicked();void on_disconnect_clicked();void on_send_clicked();void newConnection(); private:Ui::MainWindow *ui;QTcpServer *m_Server;QTcpServer *m_Server1;QListQTcpSocket * m_Sockets;void showLog(const QString log); }; #endif // MAINWINDOW_H 源文件 #include mainwindow.h #include QDateTime #include QHostAddress #include QNetworkInterface #include ui_mainwindow.h static QStringList getIPAddresses() {QStringList addresses;for (const QHostAddress address : QNetworkInterface::allAddresses()) {if (address.protocol() QAbstractSocket::IPv4Protocol)addresses.append(address.toString());}return addresses; }MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui-setupUi(this);setWindowTitle(TcpServer);ui-tableWidget-setEditTriggers(QAbstractItemView::NoEditTriggers);ui-localIp-addItems(getIPAddresses());ui-tableWidget-setSelectionBehavior(QAbstractItemView::SelectRows);m_Server new QTcpServer;connect(m_Server, QTcpServer::newConnection, this,MainWindow::newConnection);for (QTcpSocket *socket : m_Sockets) {connect(socket, QTcpSocket::readyRead, []() {showLog(QString(%1:%2:%3).arg(socket-peerAddress().toString()).arg(socket-peerPort()).arg(QString(socket-readAll().toHex())));});connect(socket, QTcpSocket::disconnected, []() {showLog(QString(disconnect:%1:%2:%3).arg(socket-peerAddress().toString()).arg(socket-peerPort()).arg(QString(socket-readAll().toHex())));for (int i 0; i ui-tableWidget-rowCount(); i) {QTableWidgetItem *ipItem ui-tableWidget-item(i, 0);QTableWidgetItem *portItem ui-tableWidget-item(i, 1);if (nullptr ! ipItem nullptr ! portItem) {if (ipItem-text() socket-peerAddress().toString() portItem-text() socket-peerPort()) {ui-tableWidget-removeRow(i);break;}}}});connect(socket,static_castvoid (QTcpSocket::*)(const QAbstractSocket::SocketError)(QTcpSocket::error),[](QAbstractSocket::SocketError error) {qDebug() error: error;showLog(error: QString::number(int(error)));});connect(socket, QTcpSocket::stateChanged,[](QAbstractSocket::SocketState state) {qDebug() stateChanged: state;showLog(stateChanged: QString::number(int(state)));});} }MainWindow::~MainWindow() { delete ui; }void MainWindow::on_listen_clicked() {if (ui-listen-text() listen) {if (m_Server-listen(QHostAddress(ui-localIp-currentText()),ui-localPort-value()))ui-listen-setText(listening);elseui-textEdit-append(listen fail);} else {for (QTcpSocket *socket : m_Sockets) {socket-close();socket-disconnectFromHost();}m_Server-close();ui-listen-setText(listen);} }void MainWindow::on_disconnect_clicked() {int row ui-tableWidget-currentRow();if (-1 ! row) {QTableWidgetItem *ipItem ui-tableWidget-item(row, 0);QTableWidgetItem *portItem ui-tableWidget-item(row, 1);if (nullptr ! ipItem nullptr ! portItem) {QString ip ipItem-text();quint16 port portItem-text().toUShort();for (QTcpSocket *socket : m_Sockets) {if (ip socket-peerAddress().toString() port socket-peerPort()) {socket-close();socket-disconnectFromHost();break;}}}} }void MainWindow::on_send_clicked() {QByteArray ba ui-send-text().toUtf8();int row ui-tableWidget-currentRow();if (-1 ! row) {QTableWidgetItem *ipItem ui-tableWidget-item(row, 0);QTableWidgetItem *portItem ui-tableWidget-item(row, 1);if (nullptr ! ipItem nullptr ! portItem) {QString ip ipItem-text();quint16 port portItem-text().toUShort();for (QTcpSocket *socket : m_Sockets) {if (ip socket-peerAddress().toString() port socket-peerPort()) {socket-write(ba);break;}}}} }void MainWindow::newConnection() {QTcpSocket *socket m_Server-nextPendingConnection();m_Sockets.append(socket);// m_TcpSocket socket;int row ui-tableWidget-rowCount();ui-tableWidget-insertRow(row);QTableWidgetItem *ipItem new QTableWidgetItem(socket-peerAddress().toString());QTableWidgetItem *portItem new QTableWidgetItem(QString::number(socket-peerPort()));qDebug() socket-peerAddress().toString() , socket-peerPort() , socket-peerName();ui-tableWidget-setItem(row, 0, ipItem);ui-tableWidget-setItem(row, 1, portItem);connect(socket, QTcpSocket::disconnected, []() {showLog(QString(disconnected:%1:%2).arg(socket-peerAddress().toString()).arg(socket-peerPort()));// m_TcpSocket nullptr;for (int i 0; i ui-tableWidget-rowCount(); i) {QTableWidgetItem *ipItem ui-tableWidget-item(i, 0);QTableWidgetItem *portItem ui-tableWidget-item(i, 1);if (nullptr ! ipItem nullptr ! portItem) {if (ipItem-text() socket-peerAddress().toString() portItem-text() QString::number(socket-peerPort())) {ui-tableWidget-removeRow(i);break;}}}}); }void MainWindow::showLog(const QString log) {ui-textEdit-append(QString(%1:%2).arg(QDateTime::currentDateTime().toString(yyyy/MM/dd hh:mm:ss.zzz)).arg(log)); }有客户端连接后会触发newConnection这个信号然后在槽函数中使用nextPendingConnection()这个方法获取对应的客户端QTcpSocket 指针对象。客户端发送消息后会触发readyRead这个信号使用QTcpSocket的readAll获取发送的信息。编译运行输入监听的ip和端口然后点击listen按钮然后使用命令查看是否开始监听对应ip和端口 然后使用调试助手作为客户端连接这个服务器 可以看到触发了newConnection信号然后获取对应客户端对象将其信息显示到了的表格上面。 实验链接的建立与取消以及消息的互相发送 可以实现对应的通讯。  以上是使用调试助手也可以使用WireShark抓包查看发送和接受的数据。需要注意的是如果客户端和服务器都在本地自己发自己收是用WireShark抓不到的。 这里简单说一下wireshark的用法首先选择需要抓取的网卡 比如ping就是走的tcp测试时我是用 虚拟机ping我的主机如何使vmware虚拟机和主机ping通可以参考这位博主的博客实现虚拟机VM15.5.0与本机相互通信_vmware和主机怎样才能ping通-CSDN博客 然后查看wireshark可以看到ping的报文 因为我的主机ip192.168.1.3,虚拟机ip是192.168.1.4,可以输入“ip.src192.168.1.4 ip.dst192.168.1.3” 来过滤 同样我使用虚拟机和主机建立tcp连接然后发送消息也是可以抓到 X 客户端 客户端由QTcpSocket实现QTcpSocket继承自QAbstractSocket比如上文中在虚拟机中建立一个tcp服务器监听ip192.168.1.3,端口12345 QTcpSocket *socket new QTcpSocket; socket-connectToHost(QHostAddress(),12345); if(socket-waitForConnected()) {//TODO 连接成功 } else {//TODO 连接失败 }connect(socket,QTcpSocket::disconnected,[](){ //TODO 处理连接断开 }); connect(socket, QTcpSocket::readyRead, []() {QByteArray receiveDatasocket-readAll();//TODO 处理接收的数据});QByteArray sendData; //TODO 处理发送数据 //发送数据 socket-write(sendData); //断开连接两种方式 socket-abort;//强制中断连接 socket-disconnectFromHost();//不会马上关闭连接等待资源释放后才会中断连接 另外客户端套接字可以绑定bind对应ip和端口如果没有绑定则系统会使用之绑定一个随即的可用的ip和端口 Qt实现UDP 因为UDP不用建立连接不用分服务器和客户端所以对应Qt的UDP部分只需要使用QUdpSocket一个即可 QUdpSocket同QTcpSocket一样都继承自QAbstractSocket使用UDP通信前对应udp套接字需要绑定对应ip与端口然后发送数据时需要知道对方的ip与端口UDP分单播、组播与广播这里只说单播组播与广播后面博客再写 QUdpSocket *udpSocket new QUdpSocket(this); udpSocket-bind(QHostAddress(192.168.1.3), 12345); connect(udpSocket, QUdpSocket::readyRead,[](){while (udpSocket-hasPendingDatagrams()) {QByteArray data;QHostAddress host;quint16 port;data.resize(udpSocket-pendingDatagramSize());udpSocket-readDatagram(data.data(), data.size(), host, port);//TODO 处理接受数据} }); QByteArray sendData; //TODO 处理发送数据 udpSocket-writeDatagram(sendData, QHostAddress(192.168.1.4),12345); //取消绑定 udpSocket-unbind(); 使用网络助手模拟udp通信 使用自己写的udp程序在虚拟机中与之通信 使用wireshark抓包
http://www.hkea.cn/news/14510283/

相关文章:

  • 创可贴网站怎么做图片上海微信网站建设兼容网站
  • 电影网站盗链怎么做网站类网站建设
  • 社保汇算清缴哪个网站做的公司网站排名
  • 网站建设流程图在线制作制作社交app的网站
  • 物流网站建设wordpress 图片 旋转
  • 企业网站源码变现方法wordpress zp
  • 做衣服接订单的网站做网站去哪好
  • 椒江网站制作seo哪个软件好
  • 教育类网站 前置审批网站模板代码
  • weirdcore制作网站镇江网站搜索引擎优化
  • 搜索引擎营销网站有没有wordpress上的论坛
  • 网站建设评审会简报医疗网络营销方式
  • 网站开发用什么软件开发网站建设 ui 企业网站
  • 建筑学院app网站杭州优化外包
  • 大学跳蚤市场网站建设品牌升级策略
  • 教做网站视频wordpress刷新缓存
  • 怀化找什么人做网站店面设计公司
  • 建立网站需要多少钱萍畜湖南岚鸿首选怎么样让网站快速收录
  • 网站建设方案后期服务制作做的网站如何上传网上
  • 免费做房产网站怎么自己编码做网站
  • 大良陈村网站建设展厅设计图片
  • app电商网站新闻门户网站建设方案
  • 汽车网站怎么做装修案例文案
  • 浙江网站制作wordpress ajax 参数
  • 景区网站建设案例wordpress2016
  • 北京金方网站设计把网站提交谷歌
  • 西安建站系统linux网站建设
  • 自己做app的网站没有域名的网站需要备案吗
  • 网站建设费用计入什么二级科目怎么搜索家附近的公司
  • 企业网站怎么做省钱wordpress易语言登录