Android 원 격 제어 PC 구현 (Android [클 라 이언 트] + Qt [서버 쪽])
하지만 컴퓨터 가 내 방 에 없어 서 매일 저녁 침대 에서 휴대 전 화 를 하고 침대 에서 내 려 와 컴퓨터 를 꺼 야 해 게 으 르 고 게 으 른 본인 을 기분 나 쁘 게 해 원 격 제 어 를 시도 했다.
소프트웨어 클 라 이언 트 는 안 드 로 이 드 장치 에서 실행 되 고 서버 는 나의 Win 7 노트 에서 실 행 됩 니 다.클 라 이언 트 는 안 드 로 이 드 플랫폼 응용 프로 그래 밍 을 사용 하고 서버 쪽 은 Qt 로 작 성 됩 니 다.
먼저 기본 포트 를 설정 한 다음 제어 방법 을 설정 합 니 다. 편 의 를 위해 표준 C 의 system 인 터 페 이 스 를 직접 이용 합 니 다.클 라 이언 트 는 서버 에 명령 을 보 내 고 서버 는 명령 을 직접 실행 하 며 표준 출력 을 클 라 이언 트 에 게 되 돌려 줍 니 다.
다음은 코드 를 보 겠 습 니 다. 구체 적 인 코드 는 여기 서 다운로드 할 수 있 습 니 다. 프로젝트 소스 코드 입 니 다.
서버 쪽:
헤더 파일:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtNetwork/QTcpServer>
#include <QTextDocument>
#include "server.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
QTextDocument *textDocument;
Server *server;
~MainWindow();
public slots:
void getConnect();
void execCommand(const char *command,int length,const char *add,int clientCode);
void showText(const char *text);
signals:
void writeFile(int clientCode);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
server.h
#ifndef SERVER_H
#define SERVER_H
#include <QTextDocument>
#include <QTcpServer>
class MainWindow;
class Server:public QTcpServer
{
Q_OBJECT
private:
int port;
MainWindow *mainWindow;
QHostAddress hostAddress;
int clientNum; //
public:
Server(MainWindow *m,int p,QHostAddress a);
void incomingConnection(int handle);
signals:
void printText(const char *text);
};
#endif // SERVER_H
serverthread.h
#ifndef SERVERTHREAD_H
#define SERVERTHREAD_H
#include <QThread>
#include <QTcpSocket>
#include "mainwindow.h"
class ServerThread:public QThread
{
Q_OBJECT
private:
QTcpSocket *socket;
MainWindow *mainWindow;
int clientCode;
public:
ServerThread(int socketDescriptor,QObject *parent,MainWindow *m,int clientCode);
void run();
signals:
void newCommand(const char *str,const int length,const char *add,int clientCode);
public slots:
void receiveData();
void readFile(int cC);
};
#endif // SERVERTHREAD_H
원본 코드:
main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include <QtNetwork/QHostAddress>
#include <QTextDocument>
#include <string>
#include <cstring>
#include <string.h>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
server=new Server(this,5648,QHostAddress::Any); //
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::getConnect()
{
QTextDocument *textDocumentM=new QTextDocument(QString("new connect !"),this);
ui->textEdit->setDocument(textDocumentM);
server->nextPendingConnection();
}
void MainWindow::execCommand(const char *command,int length,const char *add, int clientCode)
{
QTextDocument *textDocumentC=new QTextDocument(QString("message"),this);
char *commandStr=new char[length+15];
strcpy(commandStr,command);
char *para=commandStr+length;
char *c=" > temp.txt"; //
strcpy(para,c);
system(commandStr); // shell
emit writeFile(clientCode);
ui->textEdit->setDocument(textDocumentC);
}
void MainWindow::showText(const char *text)
{
QTextDocument *textDocumentT=new QTextDocument(QString(text),this);
ui->textEdit->setDocument(textDocumentT);
}
server.cpp
#include "server.h"
#include "serverthread.h"
Server::Server(MainWindow *m,int p,QHostAddress a)
{
this->hostAddress=a;
this->port=p;
this->mainWindow=m;
this->clientNum=0; //
this->QTcpServer::listen(hostAddress,quint16(port));
connect(this,SIGNAL(printText(const char*)),this->mainWindow,SLOT(showText(const char*)));
}
void Server::incomingConnection(int handle)
{
char ch[]="new connection !";
emit printText(ch);
ServerThread *thread=new ServerThread(handle,this,mainWindow,this->clientNum); // , ,
this->clientNum++;
thread->start();
}
serverthread.cpp
#include "serverthread.h"
#include <QFile>
#define COMMAND_SIZE 50
ServerThread::ServerThread(int socketDescriptor,QObject *parent,MainWindow *m,int c):QThread(parent)
{
this->mainWindow=m;
this->clientCode=c;
socket=new QTcpSocket(parent);
socket->setSocketDescriptor(socketDescriptor);
}
void ServerThread::run()
{
this->connect(socket,SIGNAL(readyRead()),this,SLOT(receiveData()));
connect(this,SIGNAL(newCommand(const char*,int,const char*,int)),this->mainWindow,SLOT(execCommand(const char*,int,const char*,int)));
connect(this->mainWindow,SIGNAL(writeFile(int)),this,SLOT(readFile(int)));
exec();
}
void ServerThread::receiveData()
{
int left=socket->bytesAvailable();
char *command=new char[COMMAND_SIZE];
while(left>0)
{
int read=socket->readLine(command,COMMAND_SIZE); //
emit newCommand(command,read,"test",this->clientCode);
left-=read;
}
}
// socket
void ServerThread::readFile(int cC)
{
if(cC==this->clientCode)
{
QFile *file=new QFile("temp.txt");
if(file->open(QIODevice::ReadWrite))
{
char *buffer=new char[100];
int length;
while((length=file->read(buffer,100))>0)
{
socket->write(buffer,length);
}
}
socket->flush();
file->close();
system("del temp.txt");//
}
}
클 라 이언 트:
Acitvity 가 하나 밖 에 없어 요.
MainActivity.java
package com.tobacco.phonetest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener,Runnable{
private Button button;
private Button clear;
private EditText editText;
private TextView tv;
private Socket socket;
private PrintWriter pw;
private BufferedReader br;
//private InputStream is;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler=new Handler();
button=(Button)findViewById(R.id.button);
clear=(Button)findViewById(R.id.clear);
button.setOnClickListener(this);
clear.setOnClickListener(this);
editText=(EditText)findViewById(R.id.edittext);
tv=(TextView)findViewById(R.id.textView);
try {
//socket=new Socket("tobacco5648.xicp.net",5648); // pc
socket=new Socket("192.168.137.1",5648); // socket, pc ip
//socket=new Socket("www.baidu.com",80);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("socket","unknown host");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("socket","io execption");
}
if(socket==null){
Log.e("socket","null");
}
else
try {
pw=new PrintWriter(socket.getOutputStream());
br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"gbk"));
String remote=socket.getInetAddress().getHostAddress();
String self=socket.getLocalAddress().getHostAddress();
tv.setText("connected!"+"\r
"+"remote:"+remote+"\r
"+"local:"+self+"\r
");
//is=socket.getInputStream();
if(pw!=null&&br!=null){
new Thread(this).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void onClick(View view) {
if(view==button){
String str;
str=editText.getText().toString();
pw.print(str);
pw.flush();
}
else if(clear==view){
tv.setText("");
}
}
public void run() {
while(true){
try {
String str;
while((str=br.readLine())!=null){
final String s=str;
handler.post(new Runnable(){
public void run() {
tv.setText(tv.getText()+s+"\r
");
}});
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.