매우 간단한 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에서 라인 기반 처리를 사용하는 것처럼
라인 터미네이터를 확인하십시오. QT와 java가 다른 라인 종결자를 사용한다면 더 많은 데이터를 기다리는 라인의 끝을 영원히 감지 할 수 없습니다. 문자열이 아닌 바이트 프로토콜을 기반으로 송수신을 시도 할 수도 있습니다. – Fildor