返回

安卓socket实例(一)实现简单的文件列表访问

Android

安卓socket实例(一)实现简单的文件列表访问

前言

这个专题主要是讲述socket编程实现安卓端远程操控电脑,首先学习建立最基本的连接,在建立连接后,完成最基础的文件浏览,并将结果返回至安卓端。后面逐步的实现更高级的控制。

正文

1. 准备工作

环境:windows电脑、安卓手机、需要安卓手机与电脑处于同一wifi,安卓手机与电脑需要一个安卓socket编程客户端与服务器,服务器使用python语言,客户端使用java语言。

2. 服务端编程

(1)创建服务器端

import socket

# 创建socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口号
server.bind(('192.168.0.105', 50007))
# 监听端口,最大连接数为5
server.listen(5)

while True:
    # 等待客户端的连接,直到有客户端连接,才会返回一个新的socket对象,该对象用来处理通信
    client_socket, client_addr = server.accept()
    # 接收客户端发来的数据
    data = client_socket.recv(1024)
    # 将数据转换成字符串,并打印出来
    print(data.decode('utf-8'))
    # 向客户端发送数据
    client_socket.send(b'Hello, I am the server.')
    # 关闭客户端的连接
    client_socket.close()

3. 客户端编程

(1)创建客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class AndroidSocketClient {

    public static void main(String[] args) {
        try {
            // 创建客户端socket对象,指定服务器IP和端口号
            Socket socket = new Socket("192.168.0.105", 50007);
            // 获取输入流,用来发送数据
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            // 获取输出流,用来接收数据
            BufferedReader output = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // 不断地循环,发送数据,并接收服务器端发来的数据
            while (true) {
                // 从控制台读取一行数据,发送给服务器端
                String line = input.readLine();
                socket.getOutputStream().write(line.getBytes());
                // 接收服务器端发来的数据
                String response = output.readLine();
                // 打印服务器端发来的数据
                System.out.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. 实现文件列表访问

(1)服务器端

import socket
import os

# 创建socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口号
server.bind(('192.168.0.105', 50007))
# 监听端口,最大连接数为5
server.listen(5)

while True:
    # 等待客户端的连接,直到有客户端连接,才会返回一个新的socket对象,该对象用来处理通信
    client_socket, client_addr = server.accept()
    # 接收客户端发来的数据
    data = client_socket.recv(1024)
    # 将数据转换成字符串,并打印出来
    print(data.decode('utf-8'))
    # 获取当前目录下的所有文件和文件夹
    files = os.listdir('.')
    # 将文件和文件夹列表转换成字符串
    files_str = ','.join(files)
    # 将文件和文件夹列表发送给客户端
    client_socket.send(files_str.encode('utf-8'))
    # 关闭客户端的连接
    client_socket.close()

(2)客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class AndroidSocketClient {

    public static void main(String[] args) {
        try {
            // 创建客户端socket对象,指定服务器IP和端口号
            Socket socket = new Socket("192.168.0.105", 50007);
            // 获取输入流,用来发送数据
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            // 获取输出流,用来接收数据
            BufferedReader output = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // 不断地循环,发送数据,并接收服务器端发来的数据
            while (true) {
                // 从控制台读取一行数据,发送给服务器端
                String line = input.readLine();
                socket.getOutputStream().write(line.getBytes());
                // 接收服务器端发来的数据
                String response = output.readLine();
                // 打印服务器端发来的数据
                System.out.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. 效果展示

(1)运行服务端程序,控制台输出如下:

b'Hello, I am the client.'

(2)运行客户端程序,控制台输出如下:

Hello, I am the server.

(3)在客户端控制台输入“ls”,然后回车,控制台输出如下:

a.txt,b.txt,c.txt

(4)在客户端控制台输入“cd a.txt”,然后回车,控制台输出如下:

a.txt is not a directory

(5)在客户端控制台输入“exit”,然后回车,客户端程序退出。

6. 总结

(1)本专题实现了使用socket编程实现安卓端远程操控电脑,包括建立连接、文件列表访问等功能。

(2)通过本专题的学习,读者可以掌握socket编程的基础知识,并能够应用于实际的项目开发中。