1、qt的tcp通信 伺服器和客戶端讀寫數據的問題
首先回答第一個問題,讀和寫可以有多種實現方式,用write和read只是其中一種,前面一個函數中的 clientConnection->write(block)是調用了QTcpSocket 類中的write方法來實現,如果你想不用此方法調用類中的read和write方法,就是你問的第二個問題,in和out的作用,in和out在這里將對socket中的報文收發變為數據流的形式來操作,QDataStream in(tcpSocket)比如這一句是將tcpSocket這個連接的實例對象作為一個文件描述符傳遞給QDataStream,然後 in >> blockSize這句話實現的就是相當於read的操作,就是將數據流讀出來。這個 out << (quint16)(block.size() - sizeof(quint16))是寫入。實際上對諸如串口收發,讀寫文件,socket通信等等,用C語言來寫,抽象出來都是對文件描述符進行操作,都可以用write和read來做,所以,實際上,第一種方法和第二種方法是一樣的,就看你選擇什麼樣的方法了,第三個問題可參考out << (quint16)(block.size() - sizeof(quint16))這樣的方法在收到數據以後把數據發出去。
請給分。。。
2、qt 寫的tcp伺服器,客戶端不是qt寫的,接收到的是亂碼,怎麼解決?反之也是亂碼
是不是傳的中文?如果是的話,和字元編碼有關
3、qt中用tcp怎麼實現客戶端給伺服器發消息
通常來說我們的伺服器是分三類,資料庫的伺服器,web的伺服器,以及其內他應用的伺服器容。這些其實都是小型機,伺服器,只不過是根據用途不同而分類。正常來說一個網站的常規伺服器的架構就是這三塊。
他所說的 " 資料庫連接到伺服器" 可能是指 "怎麼樣把web伺服器和資料庫能夠建立連接 " 。這里所說的web伺服器應該是指tomcat,apache,IIS,weblogic之類的東西,而不是真正意義上的web伺服器。
這樣的話就簡單了。要麼ODBC要麼JDBC,該怎麼樣怎麼樣。ODBC就是添加到數據源,JDBC就是要寫JDBC驅動,或者使用mybatis之類的解決方案
4、qt寫的tcp socket程序客戶端只能和用qt寫的服務端通信嗎
所有標準的TCP伺服器端都可以
~~~~~~~~~~~
5、使用QT編寫的TCP服務程序,怎麼獲取連接的客戶端IP地址
cp
ip協議中
tcp
跟ip
具體作用
tcp是主機到主機層的協議,它負責從上層獲得數據為之分回段、編號、排序。而且使用答確認機制,窗口機制,保障了數據的安全傳送。就像是郵局的人郵寄包裹的過程!
ip是網際網路層協議,負責查看數據包的ip地址,並且通過路由表網路定址,尋找數據到目的主機的最佳路徑。
6、Qt Tcp 客戶端無法連續分開發送數據,怎麼辦?
表醬紫寫...
不能用Sleep來間隔.
用一個定時器 QTimer 的timeout 來觸發發送事件.
每個發送事件就發一個字元串就ok了.
7、QT TCP網路通信問題
客戶端要流程:流程:
1.創建tcpSocket,tcpClient= new QTcpSocket(this);
2.關聯信號connected和槽函數startTransfer,
connect(tcpClient,SIGNAL(connected()),this,SLOT(startTransfer()));
其中信號connected在連接伺服器成功(即本客戶端執行 tcpClient->connectToHost,得到伺服器的成功響應)時發射,
3.關聯信號bytesWritten和槽函數updateClientProgress,
connect(tcpClient,SIGNAL(bytesWritten(qint64)),this,SLOT(updateClientProgress(qint64)));
其中信號bytesWritten在當有數據發送成功時(即本客戶端執行 tcpClient->write(outBlock);
伺服器的成功收outBlock時)時發射,此時執行updateClientProgress來更新進度條並接著發送剩餘數據。
4.連接到某個ip的某個埠,tcpClient->connectToHost(QHostAddress(ui->hostLineEdit->text()),ui->portLineEdit->text().toInt())
服務端:流程
1. 創建 QTcpServer tcpServer;
使之監聽本機的某個埠,tcpServer.listen(QHostAddress("192.168.1.100"), 6666);
2. 關聯信號newConnection和槽函數sendMessage,connect(&tcpServer, SIGNAL(newConnection()),
this, SLOT(acceptConnection()));其中信號newConnection在有客戶端的連接請求(即客戶端執行
tcpSocket->connectToHost)時發射,此時執行acceptConnection;
3. 實現槽函數acceptConnection,在裡面從tcpServer取得已經建立但掛起的QTcpSocket連接
tcpServerConnection = tcpServer.nextPendingConnection();
並關聯信號readyRead和槽函數updateServerProgress,
connect(tcpServerConnection, SIGNAL(readyRead()), this, SLOT(updateServerProgress()));
4. 實現槽函數updateServerProgress。
8、socket TCP伺服器連接多個客戶端,服務端接收數據時怎麼判斷是哪個客戶端發來的數據
調用recv時 是有條件的,這個條件即有讀事件觸發,該讀事件觸發者即為與之通信的socket,也即你所要的「判斷發送方的socket」,順著這個道理就能找到對應關系了。
9、qt中用tcp怎麼客戶端怎麼給伺服器發消息
Marker – 信息來包含信息接收端可預測值。自
Length – 包含協議頭的信息長度。
Type –信息類型。信息可能是:Open、Update、Notification、Keepalive。
打開(Open)分組,用來與相鄰的另一個BGP發言人建立聯系
更新(Update)分組,用來發送某一路由的信息,以及列出多條要撤銷的路由
保活(Keepalive)分組,用來確認打開分組和周期性地證實鄰站關系
通知(Notification)分組,用來發送檢測到的差錯
10、QTcpServer 最多能承受多少client同時持久連接著
Qt用的是來select,libevent和boost用的是epoll(linux),iocp(win),k``自`(bsd)、、、
最大吞吐量的確應該達不到libevernt和boost級別,但是支持幾千個連接是沒問題的、、
注意自己繼承TCPserver,重寫incomingConnection函數,因為qtcpserver默認是把tcpsocket存在一個list里的、、
還有更改下默認的最大值,默認是30個的、、
個人測試1000個連接無壓力的,在win下、、