java通过tcp协议与qt通信

来源:互联网 发布:mac下python开发环境 编辑:程序博客网 时间:2024/06/03 20:56

最近碰到一个项目,用qt写了一个服务器,java写客户端,然后客户端发送信息,请求服务器的数据。网上很多资料都是qt与qt通信,java与java通信,既然都是利用tcp协议,理论上也是可以进行java与qt的通信的,但是有许多细节需要注意。比如双方接收数据时都是使用byte数组 类型,另外qt发送数据时不能把QString插入数据流中,这样java端接收的数据就是一个空串。以下是我简化的一段代码,java客户端发送一个数据(比如 0001),qt服务器端发回java客户端处理后的数据(0001 is ok !)。代码如下:

qt服务器端

tcpserver.h

#ifndefTCPSERVER_H

#define TCPSERVER_H
#include <QTcpServer>
class TcpServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit TcpServer(QObject *parent = 0, int port = 0);
    
signals:
private:
    void incomingConnection(int socketDescriptor);
    
public slots:
    
};
#endif // TCPSERVER_H

tcpserver.cpp

#include"tcpserver.h"

#include "tcpsocket.h"
#include <QDebug>
TcpServer::TcpServer(QObject *parent, int port) :
    QTcpServer(parent)
{
    if( !this->listen(QHostAddress::Any, port) ) {
    //if( !this->listen()) {
        qDebug() << "Server listen fail";
        exit(1);
    }
    //port = this->serverPort();
    qDebug() << "Port: " << port;
    qDebug() << "Server listening......";
    //while(1);
}
void TcpServer::incomingConnection(int socketDescriptor)
{
    TcpSocket *socket = new TcpSocket(this);
    socket->setSocketDescriptor(socketDescriptor);
}


tcpsocket.h

#ifndefTCPSOCKET_H

#define TCPSOCKET_H
#include <QTcpSocket>
class TcpSocket : public QTcpSocket
{
    Q_OBJECT
public:
    explicit TcpSocket(QObject *parent = 0);
    
signals:
private:
    QString msg;
    void sendResponse();
    
private slots:
    void dataReceived();
    
};
#endif // TCPSOCKET_H

tcpsocket.cpp

#include"tcpsocket.h"

#include <QByteArray>
#include <QVariant>
#include <QDebug>
#include <QTime>
TcpSocket::TcpSocket(QObject *parent) :
    QTcpSocket(parent)
{
    connect(this,SIGNAL(readyRead()),this,SLOT(dataReceived()));
}
void TcpSocket::dataReceived()
{
    //qDebug() << "Hello data";
    QByteArray qdb = this->readAll();
    QString ss = QVariant(qdb).toString();
    this->msg = ss;
    //qDebug() << this->msg;
    QString curTime = QTime::currentTime().toString("hh:mm:ss");
    QString str = curTime + " :  " + this->msg + " tested";
    qDebug() << str;
    this->sendResponse();
}
void TcpSocket::sendResponse()
{
    QString response = this->msg + " is ok !";
    this->write(response.toStdString().c_str(),strlen(response.toStdString().c_str()));
    disconnectFromHost();
    waitForDisconnected();
}
main.cpp

#include<QApplication>

#include "tcpserver.h"
int main(int argc,char *argv[])
{
  QApplication a(argc,argv);
  int port = 8010;
  TcpServer *tcpServer = new TcpServer(0, port);
  return a.exec();
}


最后在pro文件中添加QT += network即可

此时,qt客户端程序已经写好,本人已经测试成功。


java客户端

SocketUtil.java

import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.net.Socket;


public class SocketUtil {
    public static void main(String[] args) {
        //String str = null;
        Socket clientSocket;
        DataInputStream in = null;
        DataOutputStream out = null;
        
        try {
            clientSocket = new Socket("127.0.0.1",8010);
            in = new DataInputStream(clientSocket.getInputStream());
            out = new DataOutputStream(clientSocket.getOutputStream());
            //out.writeUTF("hello");
//            out.writeUTF("0001");
//            out.write("0001");
            //out.writeBytes("1000");
            //out.writeChars("0001");
            
            String temp=new String("0003");  
            out.write(temp.getBytes("UTF-8"));  
            
            System.out.println("Hello");
            byte[] by = new byte[1024];
            in.read(by);
            
            //System.out.println(by);
            String str1 = new String(by);
            System.out.println(str1);
            
            //System.out.println("End");
            in.close();  
            out.close();
            
            
            /*
            while(true) {
                str = in.readUTF();
                //out.writeUTF(((int) (Math.random()*10) +1) + "");
                System.out.println("Client:" + str);
            }
            */
            
        }catch(Exception e) {
            e.printStackTrace();
        }
        
        
    }
    
}

至此,java客户端也已经写完。测试成功。

以下是运行结果:

java客户端:


qt服务器端:




0 0
原创粉丝点击