도와주세요!!
slotReadClient()
{
...
QTextStream str = ts.readLine(); // 여기가 실행되지 않습니다..
while( canReadLine() )
{
QStrring str = ts.readLine();
ts<<str.length() << : << str <<endl;
}
...
}
클라이언트가 메시지를 보내면 서버가 다시 시리얼로 protocol를 보내야 합니다.. 그래서 클라이언트가 보내 메시지를 파싱하고 싶은데.. 안 됩네요.. 어디를 어떻게 수정해야 하나용..
염침없지만 전체 소스를 올리겠습니다.. 도와주세요..;;
우선 QTextStream( this)의 this 는 QSocket에서 상속받은 QClient로 소켓 객체입니다. 그리고 이 소켓은 클라이언트의 접속 요구로 서버에서 자동으로 생성되는 소켓입니다. 그러므로 당연히 QTextStream( this) 가 됩니다.
소스가 이렇게 구성되어 있네요.
qDebug( "111111");
while( canReadLine())
{
QString str = ts.readLine();
:
}
프로그램을 실행하면 qDebug()에 의해 "1111"은 출력되는데, QString str = ts.readLine(); 이 실행되지 않습니까?
그럼 아래와 같이 수정해서 확인해 보면 어떻게 되나요?
qDebug( "111111");
while( TRUE)
{
qDebug( "before\n");
if ( canReadLine())
{
qDebug( "reading\n");
QString str = ts.readLine();
}
else
{
qDebug( "break\n");
break;
}
:
}
역시 "1111"가 출력되고 "before"까지만 출력됩니까?
아니에요.. 그렇게 말씀하시면 제가 더 미안해서 더 이상 물어보지 못합니다.. 님 말씀대로 canReadLine블럭 되는것 같습니다.. 어떻게 해결하면 되나용??;;
테스트 결과...
read
bkeak
read 콘솔창에 보이지가 않네용..;;
그런데 현재 님 답글이 안 보이네요..;;
하하..이해해 주셔서 고맙습니다. 저 때문에 혹시 헤깔리시는 것은 아닌지 걱정됩니다.
답글이 안 보이는 이유는 여러 번 글을 수정하다 보니 다시 내용을 정리해서 올렸기 때문으로 생각됩니다.
실행해 보시니까 1111, before, reading, break 이런 순으로 출력이 됩니까? 그러 정상적으로 실행이 된것입니다.
canReadLine() 도 블록된 것이 아니구요. 블록되었다면 reading 이나 break 문자열은 출력되지 않았을 것입니다.
또한 reading과 break 문자열까지 출력되었다면 역시 ts.readLine()도 블록되지 않았다는 얘기가 됩니다.
그러므로 아래와 같이 해서 정말 수령된 데이터가 없는지 확인해 보세요. ^^
qDebug( "111111");
while( TRUE)
{
qDebug( "before\n");
if ( canReadLine())
{
qDebug( "reading\n");
QString str = ts.readLine();
qDebug( str); // 수신한 문자열을 바로 출력
}
else
{
qDebug( "break\n");
break;
}
:
}
제가 사정이 있어서 qDebug( str)이 제대로 실행되는지 모르겠습니다만 결국은 옳바르게 자료를 수신했는지 확인을 해 보면 된다는 말씀이 되겠습니다. ^^
다른 일땜시 짐 댓글을 보았습니다.. 님이 알려준대로 하고 테스트를 하면 reading 이 콘솔창에 나오지가 않습니다..
님 말씀대로 블록되어 if()절을 실행하지 못하는것 같습니다.. 어떻게 해결 해야 하나요..
지금 하고 싶은 것은 str 을 받아서 파싱하고 싶은뎅.. 도움 청합니다..
테스트 결과..
before
break
if 절이 실행되지 않아용..;;
제 생각은 그렇지 않습니다. if 절이 실행되지 않았는데 어떻게 else 구문이 실행되겠습니까?
if 에서 canReadLine()을 실행했는데 읽어 들일 자료가 없으니가 else로 빠지게 된 것으로 생각됩니다.
qDebug( "11111")로 1111이 출력되었다면 상대방의 전송 행동이 있었기 때문에 정상적으로 슬롯함수가
호출된 것이고, canReadLine()을 읽었는데 읽어 들일 자료가 없다면 상대방에서 제대로 데이터를 전송했는지
먼저 체크하시는 것이 빠르지 않을까 생각됩니다.
즉, 데이터를 전송했는데, 사이즈 적용이라든지, 실제 데이터가 없다든지 하는 경우가 예상됩니다.
님 감사합니다.. 님의 this 소켓이라는 것이 많은 도움이 되었습니다.. 이놈아도 시리얼처럼 not-blocking, blocking 모드가 있네요..
그래서 slotReadClient 에 다음과 같이 수정하였습니다..
slotReadClient()
{
char buff[10];
memset( buff, 0x00, sizeof(buff) );
int available = 0;
available = this -> bytestAvailable();
qDebug("slot read available %d", available);
int len = this -> readBlock(buff, available);
// 이제 buff 에 들어오는 값을 파싱해서 시리얼로 보내기만 하면 됩니당..^^
}
이제 서버에서 클라이언트로 보내는것을 해결하면 되는뎅..;; qsocknotifier 로 시리얼이 보내값 받은 후에 다시 클라이언트로 보내야 하는뎅.. 현재 구현한 소스에서 클라이언트 소켓을 어떻게 참조해야 할징..;;; 아.. 산넘고 또 산이넹..;;\
저두 난중에 님처럼 남에게 도움이 되면 좋겠습니다..
신경써주었어 감사합니다.. 테스트 해보았습니다.. 님이 말한 부분은 헤더 파일의 QClient 부분에 있습니다..
그런데 님 한가지 갠적으로 궁금한것이 있는데 보통 윈도우나 리눅스 네트워크 프로그램을 보면
socket 으로 주고 받고 하는것 같던뎅.. 강좌에있는 소스를 보니까 QTestStream(this); 이렇게 되어 있던뎅.. 여기에 this 말고 socket 를 넣어주어야 하는것 아니가용??