Android 원 격 제어 PC 구현 (Android [클 라 이언 트] + Qt [서버 쪽])

본인 은 무선 공유 기 가 없 기 때문에 Win7 이 가지 고 있 는 가상 와 이 파이 로 휴대 전 화 를 인터넷 에 접속 하 게 합 니 다: Win 7 가상 와 이 파이
    하지만 컴퓨터 가 내 방 에 없어 서 매일 저녁 침대 에서 휴대 전 화 를 하고 침대 에서 내 려 와 컴퓨터 를 꺼 야 해 게 으 르 고 게 으 른 본인 을 기분 나 쁘 게 해 원 격 제 어 를 시도 했다.
    소프트웨어 클 라 이언 트 는 안 드 로 이 드 장치 에서 실행 되 고 서버 는 나의 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(); } } } }

좋은 웹페이지 즐겨찾기