Qt tcp通信简单实现


功能:Qt前台界面作为客户端,linux后台程序作为服务端,客户端发送字符串给服务端,服务端返回大写

前台界面实现:通过Qt designer生成   

(地址映射:10.200.1.46:19961 -> 172.18.18.99:9961)

10.200.1.46:19961(windows本机访问linux服务端对外地址端口)

172.18.18.99:9961(linux服务端地址端口)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

dialog.h:

#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include <QTcpSocket>
#include <QHostAddress>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private slots:
    void on_pushButton1_clicked();
    void recvMsg();
    void displayError(QAbstractSocket::SocketError);
 
private:
    Ui::Dialog *ui;
    QTcpSocket *tcpSocket;
 
 
};
 
#endif // DIALOG_H

--------------------------------------------------------------------------------------------------------------------------
dialog.cpp:
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket(this);
    ui->lineEdit->setText("10.200.1.46");
    ui->lineEdit_2->setText("19961");
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton1_clicked()));
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(recvMsg()));
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::on_pushButton1_clicked()
{
    QString port;
    int port_Int;
    port = ui->lineEdit_2->text();
    port_Int = port.toInt();
    tcpSocket->connectToHost(QHostAddress(ui->lineEdit->text()), port_Int);
    if(!tcpSocket->waitForConnected(2))
    {
        tcpSocket->disconnectFromHost();
        return;
    }
    QTextStream out(tcpSocket);
    out << ui->lineEdit_3->text() <<endl;
}
void Dialog::recvMsg()
{
    QString res;
    res += tcpSocket->readAll();
    ui->textEdit->setText(res);
    ui->textEdit->moveCursor(QTextCursor::End);
    tcpSocket->disconnectFromHost();
}
void Dialog::displayError(QAbstractSocket::SocketError)
{
    //qWarning("this is err!");
    qDebug() << tcpSocket->errorString();
}
-----------------------------------------------------------------------------------------------------------------------
main.cpp:
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

linux 后台服务端代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>


#define RCV_BUF_LEN 1024


int main(int ac, char **av)
{
    int sock;
    int client_Sock;
    int ret;
    char inputBuf[1024];
    char recvBuf[RCV_BUF_LEN];
    struct sockaddr_in svrAddr;
    int i;
    int val;
    
    
    /** 创建监听套接字 **/
    if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
       printf("socket error!\n");
       return -1;
    }
    
    /** 指定监听端口和地址 **/
    memset(&svrAddr, 0x00, sizeof(svrAddr) );
    svrAddr.sin_family =AF_INET;
    svrAddr.sin_addr.s_addr = htonl( INADDR_ANY );
    svrAddr.sin_port = htons(9961);
    
    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR, (char *)&val, sizeof(val));
    
    /** 绑定监听套接字和端口 **/
    if(bind(sock, (struct sockaddr *)&svrAddr, sizeof(svrAddr)) != 0 )
    {
       printf("bind error!\n");
       return -1;
    }
    
    /** 监听套接字 */
    if(listen( sock, 10 ) != 0)
    {
       printf("listen error!\n");
       return -1;
    }
    
    while(1)
    {
       /** 等待连接请求 **/
       printf("等待客户端连接请求..\n");
       if((client_Sock = accept(sock, NULL, 0)) < 0)
       {
          printf("accept error!\n");
          return -1;
       }
    
       printf("客户端已连入..\n");
    
       while(1)
       {
          memset(recvBuf, 0x00, RCV_BUF_LEN);
          ret = recv( client_Sock, recvBuf, RCV_BUF_LEN, 0);
          //printf("strlen(recvBuf) = %d\n", strlen(recvBuf));
          recvBuf[strlen(recvBuf) - 1] = 0;//0 ASCII 对应 空字符
          if(ret > 0)
          {
             printf("接收到:[%s]\n", recvBuf);
             for(i = 0; i < strlen(recvBuf); i++ )
             {
                 if(recvBuf[i] > 96 && recvBuf[i] < 123)
                 {
                    recvBuf[i] -= 32;
                 }
             }
             
             ret = send(client_Sock, recvBuf, strlen(recvBuf), 0 );
             if(ret > 0)
             {
                printf("处理并返回成功..\n");
             }
             else if(ret < 0)
             {
                printf("返回客户端错误..\n");
             }
          }
          else if (ret == 0)
          {
             printf("客户端断开..\n");
             break;
          }
          else
          {
             printf("rcv error!\n");
             break;
          }
       }
    
  }
    
  return 0;
}

----------------------------------------------------------------------------------------------------------------------
前台运行界面:



 

后台运行结果:

[gfj@KFJK c]$ gcc qt_server.c 
[gfj@KFJK c]$ ./a.out
等待客户端连接请求..
客户端已连入..
接收到:[guifujieGUIfuJIE]
处理并返回成功..
客户端断开..
等待客户端连接请求..


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值