1. Ok, winsock przeczytam, na pewno wiele pozytku z tego wyniknie :) (czy bede mogl tego uzyc w Qt?)
2. Zgadza sie, posluguje sie jednym glownym watkiem, (prawde mowiac, nie mam jeszcze pojecia o programowaniu dodatkowych watkow, za co tez z pewnoscia sie niebawem wezme),[B]ale[/B] inne zdarzenie jest obslugiwane poprawnie, tzn laczenie klienta do serwera:
-wciskam polacz (laczy z wpisanym ip i portem przez connectToHost)
-po ustanowieniu polaczenia, w oknie klienta pojawia sie informacja, ze polaczenie jest ustanowione
-a w oknie serwera wypisuje sie informacja, ze klient pomyslnie polaczony - wyskakuje ta informacja automatycznie
w kodzie serwera jest:
connect(serwer,SIGNAL(newConnection()),this,SLOT(wypisz_info())); - czyli, ze bez dodatkowych watkow samoczynnie serwer obsluguje sygnaly z socketa(wskaznika na obslugiwane polaczenie z klientem)
- "Jeżeli wiadomości odbierasz w chwili wciśnięcia przycisku..." - wiadmosc wysylam w momencie wcisniecia przycisku send i ona juz jest wyslana, znajduje sie w socket i czeka na zczytanie, tu wlasnie chcialem obsluzyc sygnal readyRead() (void QIODevice::readyRead () [signal]
This signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device)
ale poki co, to w serwerze moge tylko recznie odczytac dane z socketa, funckja ponizej:
wpisuje wiadomosc w oknie klienta, wciskam button PB_SEND, ktory wywoluje:
void MainWindow::send()
{
QByteArray data;
QDataStream out( & data, QIODevice::WriteOnly );
out.setVersion( QDataStream::Qt_4_6 );
out <<( quint16 ) 0;
out << ui->tx->text();
out.device()->seek( 0 );
out <<( quint16 )( data.size() - sizeof( quint16 ) );
socket->write( data );
ui->tx->clear();
}
a tu kod, ktory odpowiedzialny za czytanie na serwerze:
void MainWindow::readData1()
{
QDataStream in( socket );
if( block == 0 )
{
if( socket->bytesAvailable() <( int ) sizeof( quint16 ) )
{
return;
}
quint16 sizeOfBlock;
in >> sizeOfBlock;
block = sizeOfBlock;
}
if( socket->bytesAvailable() < block )
{
return;
}
in >> message;
full += message + "\n";
ui->edit->setText( full + full.setNum( socket->bytesAvailable() ) );
block =( quint16 ) 0;
}
ps>> udalo juz mi sie zrobic, aby po nacisnieciu pb_send w kliencie, automatycznie wyswielila sie w oknie serwera ilosc bajtow gotowych do zczytania z socketa, jeszcze brakuje tylko, aby samoczynnie je zczytal i wyswietlil w oknie serwera, poki co zrobilem to przez qtimera, ktory sprawdza co 100ms, ile socket->bytesAvaible();