2016-07-20 18 views
2

私は非常に単純なJavaソケットクライアントをQTcpServerに接続しようとしています。ただし、接続している間は、メッセージの送受信はできません。私はまた、Javaクライアントをjavaサーバに接続しようとしました(きちんと動作します)。Qtクライアントもqtクライアントに接続しました。しかし、どういうわけか、それらを混合しないの... QtとのJavaソケット接続

は、ここでのJavaクライアントです:

#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); 
} 
関連するQTserverコードのビットで

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

同様に、クライアントが接続し、これらのデバッグ出力は次のように書き込まれます。 924 Con接続... 924スレッドを開始 924クライアント接続

クライアントから何を書き込もうとしても、readyReady()関数では何も取得しません。何か案は?私が書いている行に特定の結末がないのですか?あなたはJavaではなく、C++で行ベースの処理を使用しているように(私は\ rをする\ n、および\ 0を試してみた、彼らは多くを行うにはいないようだ)

+1

ラインターミネータを確認してください。 QTとjavaが異なる行ターミネータを使用すると、より多くのデータが来るのを待っている行の終わりを検出することはできません...永遠に。また、文字列ではなくバイトプロトコルに基づいて送受信を試すこともできます。 – Fildor

答えて

2

に思える:

in.readLine()対>readAll()からsocket->readAll()

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

C++はちょうどもう一方の端が1つを期待していない問題ではありませんCR/LFを送ることはありません。しかし、Java側では、BufferedReader.readLine()BufferedWriter.writeln()を使用しているため、CR/LFが必要です(および送信します)。

回線ベースの通信を希望するかどうかを決定し、それに応じてC++またはJava側を調整します。

+0

それはまさにそれでした。ありがとうございました – Excludos