Java-Qt-TCP數(shù)據傳輸
- 程序描述
使用Qt建立TCP Server,用Java建立TCP Client,Client發(fā)送本地圖片文件給Server,Server端使用Qt的QPixmap類顯示在QLabel實例的背景中。
- 核心代碼
- Java端
Main.java
import java.io.*;
import java.net.Socket;
public class Main {
public static void main(String[] args) {
Socket s;
File sendFile = new File("F:/Image/test8.png");
long fileSize = sendFile.length();
if(!sendFile.exists()) {
System.out.println("Cannot find the file");
return;
}
//定義文件輸入流,用于打開、讀取文件
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(sendFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//使用OutputStream向Socket發(fā)送數(shù)據
OutputStream outputStream = null;
//使用InputStream從Socket接收數(shù)據
InputStream inputStream = null;
/*建立客戶端,連接服務器*/
try {
s = new Socket("127.0.0.1", 8899);
outputStream = s.getOutputStream();
int size = 0;
byte[] buffer = new byte[(int) fileSize];
while((size = fileInputStream.read(buffer)) != -1) {
System.out.println("Data size: \t" + size);
outputStream.write(buffer, 0, size);
outputStream.flush();
}
//接收服務器反饋信息,等待數(shù)據傳輸結果確認
while(true) {
inputStream = s.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(inputStreamReader);
String str = br.readLine();
System.out.println("Server: \t" + str);
/*不能使用 (str == "ok") 判斷,因為str是String類型的,
"ok"是字符串數(shù)組,直接用==進行比較是不相等的*/
if (str.equals("ok")) {
break;
}
}
} catch (IOException e) {
System.out.println("Cannot connect the Server.");
e.printStackTrace();
}
}
}
- Qt端
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
// 2.添加頭文件
#include <QTcpServer>
#include <QTcpSocket>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
// 4.添加信號槽
public slots:
void slotNewConnection();
void slotReceiveData();
void slotSocketDisconnect();
private slots:
void on_startServerBtn_clicked();
private:
Ui::MainWindow *ui;
// 3.添加成員 TCP Server和TCP Socket
QTcpServer *myServer;
QTcpSocket *mySocket;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostAddress>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化GUI組件
ui->imgShowLabel->setScaledContents(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_startServerBtn_clicked()
{
//5.按鈕事件
ui->startServerBtn->setText("Listening...");
ui->startServerBtn->setEnabled(false);
this->myServer = new QTcpServer(this);
this->myServer->listen(QHostAddress::Any, 8899);
//連接myServer的newConnection()信號與MainWindow的槽函數(shù)slotNewConnection()
connect(this->myServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
}
void MainWindow::slotNewConnection()
{
//使用mySocket接收客戶端連接(這里只允許考慮一個連接的情況)
this->mySocket = this->myServer->nextPendingConnection();
//更新GUI
ui->startServerBtn->setText("Client Connected.");
//監(jiān)聽socket連接狀態(tài),準備接收數(shù)據
//連接信號與槽
connect(this->mySocket, SIGNAL(readyRead()), this, SLOT(slotReceiveData()));
connect(this->mySocket, SIGNAL(disconnected()), this, SLOT(slotSocketDisconnect()));
//控制臺輸出"Client connected success."
qDebug()<<"Client connected success.";
}
void MainWindow::slotReceiveData()
{
qDebug()<<"Start receive data from Client...";
QByteArray bytes = NULL;
while(this->mySocket->waitForReadyRead(100))
{
qDebug()<<"Data receiving...";
bytes.append(this->mySocket->readAll());
}
//Send Back Data to Client
if(this->mySocket->isWritable())
{
//結尾中的'\n'表示數(shù)據發(fā)送完畢
QString sendData = "ok\n" ;
this->mySocket->write(sendData.toStdString().c_str(), strlen(sendData.toStdString().c_str()));
}
else
{
qDebug()<<"Cannot send back data to Client.";
}
QPixmap pixmap;
pixmap.loadFromData(bytes);
//顯示到GUI中
ui->imgShowLabel->setPixmap(pixmap);
}
void MainWindow::slotSocketDisconnect()
{
this->mySocket->close();
ui->startServerBtn->setText("Listening...");
qDebug()<<"Socket disconnected";
}
GUI展示

Qt端初始化GUI

Qt端建立TCP Server

Java端圖片大小與服務器端接收確認

Qt端接收到圖片并顯示
參考

QPixmap支持的圖片格式