Java套接字与Qt的连接

标签 java c++ qt sockets

我正在尝试将一个非常简单的java套接字客户端连接到QTcpServer。但是,当它连接时,我无法发送消息。我还尝试将 java 客户端连接到 java 服务器(效果很好),将 Qt 服务器连接到 qt 客户端(效果也很好)。但以某种方式混合它们并不会......

这是 Java 客户端:

public class SocketClient {
    public static void main(String[] args) throws IOException {

        String hostName = "10.57.140.129";
        int portNumber = 2010;

        try (
            Socket kkSocket = new Socket(hostName, portNumber);
            PrintWriter out = new PrintWriter(kkSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                new InputStreamReader(kkSocket.getInputStream()));
        ) {
             BufferedReader stdIn =
                new BufferedReader(new InputStreamReader(System.in));
            String fromServer;
            String fromUser;

            while ((fromServer = in.readLine()) != null) {
                System.out.println("Server: " + fromServer);
                if (fromServer.equals("Test recieved. KKTHXBYE"))
                    break;

                fromUser = stdIn.readLine();
                if (fromUser != null) {
                    System.out.println("Client: " + fromUser);
                    out.println(fromUser);
                }
            }
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host " + hostName);
            System.exit(1);
        } catch (IOException e) {
             System.err.println("Couldn't get I/O for the connection to " +
                hostName);
            System.exit(1);
        }
    }
}

与相关的 QTserver 代码位:

#include "socketserver.h"

SocketServer::SocketServer(QObject *parent) :
    QTcpServer(parent) {
}

void SocketServer::StartServer(){
    if(!this->listen(QHostAddress::Any, 2010)){
        qDebug() << "Could not start server";
    }else{
        qDebug() << "Listening...";
    }
}

void SocketServer::incomingConnection(qintptr socketDescriptor){
    qDebug() << socketDescriptor << " Connecting...";
    SocketThread *thread = new SocketThread(socketDescriptor,this);
    connect(thread, SIGNAL(finished()),thread, SLOT(deleteLater()));
    connect(thread, SIGNAL(newData(QByteArray)), this, SLOT(incomeData(QByteArray)));
    thread->start();
}

void SocketServer::incomeData(QByteArray newData){
    emit sendBack(newData);
}

主题:

#include "socketthread.h"

SocketThread::SocketThread(qintptr ID, QObject *parent) :
    QThread(parent) {
    this->socketDescriptor = ID;
}

void SocketThread::run(){
    //thread starts here
    qDebug() << socketDescriptor << " Starting thread";
    socket = new QTcpSocket();
    if(!socket->setSocketDescriptor(this->socketDescriptor)){
        emit error(socket->error());
        return;
    }

    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()), Qt::DirectConnection);
    connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()), Qt::DirectConnection);

    qDebug() << socketDescriptor << " Client Connected";
    writeBack("connected");

    exec();
}

void SocketThread::readyRead(){
    QByteArray incomeData = socket->readAll();

    qDebug() << socketDescriptor << " Data in: " << incomeData;

    emit newData(incomeData);
}

void SocketThread::writeBack(QByteArray Data){
    socket->write(Data);
}

void SocketThread::disconnected(){
    qDebug() << socketDescriptor << " Disconnected";

    socket->deleteLater();
    exit(0);
}

如上所述,客户端连接,并写入这些调试输出: 第924章 正在连接…… 第924章 启动线程 924 客户端已连接

但是无论我尝试从客户端写入什么,它都不会使用readyReady() 函数获取任何内容。有任何想法吗?我是否遗漏了我正在写的行中的特定结尾? (我已经尝试过\r\n 和\0,它们似乎没有多大作用)

最佳答案

看起来您正在 Java 中使用基于行的处理,但没有在 C++ 中使用:

in.readLine()socket->readAll()

out.println(fromUser)writeBack("connected");

C++ 只是从不发送 CR/LF,当另一端不期望发送 CR/LF 时,这不是问题 -> readAll()。然而,Java 端确实期望(并发送)CR/LF,因为您使用 BufferedReader.readLine() 和 BufferedWriter.writeln()。

决定是否需要基于线路的通信,然后相应地调整 C++ 或 Java 端。

关于Java套接字与Qt的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38478336/

相关文章:

java - 带日期参数的 Lucene 搜索

java - "java.sql.SQLException: Access denied for user ' 根 '@' 本地主机 ' (using password: YES)"

java - Android 应用程序 Iframe 网站

c++ - 添加库时出现 Qt 错误 - 没有创建目标的规则

c++ - glutBitmapString() 未在此范围内声明

python - 在 Scientific Linux 6.5 上安装 PyQt4.11.2

java - 将 SharedPrefs 编辑器放入实用程序类?

c++ - Qt-C++通过绝对路径连接Sqlite

c++ - 如何判断是否在启用 NumLock 的情况下在小键盘输入上按下了 shift?或者至少获得 NumLock 状态?

c++ - Qt5 是否破坏了 QwtPlotRenderer postscript 支持?