2016-07-20 7 views
2

매우 간단한 Java 소켓 클라이언트를 QTcpServer에 연결하려고합니다. 그러나 연결되어있는 동안에는 메시지를주고받을 수 없습니다. 나는 또한 java 서버에 자바 클라이언트 (잘 작동한다)와 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 necting ... 924 시작 스레드 924 클라이언트 연결

클라이언트에서 쓰려고 시도 할 때마다 readyReady() 함수를 사용하여 어떤 작업도 수행하지 않습니다. 어떤 아이디어? 내가 쓰고있는 줄에서 특정 결말을 놓치고 있습니까?

in.readLine() 대를 : 당신 ++ 자바가 아닌 C에서 라인 기반 처리를 사용하는 것처럼

+1

라인 터미네이터를 확인하십시오. QT와 java가 다른 라인 종결자를 사용한다면 더 많은 데이터를 기다리는 라인의 끝을 영원히 감지 할 수 없습니다. 문자열이 아닌 바이트 프로토콜을 기반으로 송수신을 시도 할 수도 있습니다. – Fildor

답변

2

것 같다 (I 해봤 \ 연구 \ n를 \ 0, 그들은 많은 일을하지 않는 것) >readAll()-socket->readAll()

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

은 C++는 단지 다른 쪽 끝을 기대하지 않는 문제가 아닌 CR/LF를 전송하지 않습니다. 그러나 Java 측은 BufferedReader.readLine()BufferedWriter.writeln()을 사용하기 때문에 CR/LF를 예상 (및 전송)합니다.

라인 기반 통신을 원할지 여부를 결정한 다음 그에 맞게 C++ 또는 Java 쪽을 조정하십시오.

+0

그게 바로 그거야. 고맙습니다 – Excludos