Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与Qt的Java套接字连接_Java_C++_Qt_Sockets - Fatal编程技术网

与Qt的Java套接字连接

与Qt的Java套接字连接,java,c++,qt,sockets,Java,C++,Qt,Sockets,我正在尝试将一个非常简单的java套接字客户端连接到QTcpServer。但是,当它连接时,我无法在之间发送消息。我还尝试将java客户机连接到java服务器(运行良好),将Qt服务器连接到Qt客户机(运行良好)。但不知何故,把它们混在一起并不 下面是Java客户端: public class SocketClient { public static void main(String[] args) throws IOException { String hostNam

我正在尝试将一个非常简单的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);
}
#包括“socketserver.h”
SocketServer::SocketServer(QObject*parent):
QTcpServer(父级){
}
void SocketServer::StartServer(){
如果(!this->listen(QHostAddress::Any,2010)){

qDebug()看起来您在Java中使用的是基于行的处理,而不是在C++中:

in.readLine()
vs.
socket->readAll()

out.println(fromUser)
vs.
writeBack(“已连接”);

< C++ >永远不会发送CR/LF,当另一端不期望一个> >代码> Read()/Cube时,这不是问题。java端确实会期望(并且发送)CR/LF,因为您使用<代码> BuffEdRead .RealLoad()/<代码>和 BuffReDeDebug .Wrrelnf()<< /C> > /P>

决定是否要进行基于线路的通信,然后相应地修改C++或java端。< /P>检查行终止符。如果QT和java使用不同的行终止符,它们就永远无法检测到等待更多数据的行的末尾……永远。也可以尝试基于字节协议而不是斯特林发送/接收。没错,谢谢

#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);
}