Android socket实现原理详解 服务端和客户端如何搭建

关于“Android socket实现原理详解 服务端和客户端如何搭建”的攻略,我会给你一个完整的解释和示例。

什么是Socket?

Socket是一个抽象概念,它通常被用来指代一个网络连接的端点,它是计算机之间进行通信的一种方式。在Socket通信中,通常分为服务端和客户端两部分,服务端负责监听并处理客户端的请求,而客户端则负责连接并发送请求给服务端。

Android中Socket的实现原理

在Android中,我们可以使用Java中提供的Socket API进行Socket通信。Android中的Socket通信分为两种:TCP和UDP协议。其中TCP协议是基于连接的协议,它可以保证数据的可靠传输和顺序交付,适用于对数据传输要求较高的情况;而UDP协议则是无连接的协议,它不保证数据的可靠传输和顺序交付,适用于对数据即时性要求较高的情况。

在Android中使用Socket进行通信的基本步骤如下:

服务端搭建

  1. 创建ServerSocket对象,指定服务端口:
int port = 8888;
ServerSocket serverSocket = new ServerSocket(port);
  1. 调用accept方法等待客户端的连接,accept方法是一个阻塞方法,在没有客户端连接时会一直阻塞:
Socket socket = serverSocket.accept();
  1. 获取输入流和输出流,进行读写操作:
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
  1. 最后,要记得关闭Socket和ServerSocket对象:
inputStream.close();
outputStream.close();
socket.close();
serverSocket.close();

客户端搭建

  1. 创建Socket对象,指定服务端IP地址和端口:
String host = "192.168.1.123";
int port = 8888;
Socket socket = new Socket(host, port);
  1. 获取输入流和输出流,进行读写操作:
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
  1. 最后,要记得关闭Socket对象:
inputStream.close();
outputStream.close();
socket.close();

示例1:使用Socket进行文件传输

下面我们通过一个示例来演示如何使用Socket进行文件传输。这个示例包含一个服务端和一个客户端。

服务端实现

服务端的实现如下:

public void run() {
    try {
        ServerSocket serverSocket = new ServerSocket(8888);
        Log.i(TAG, "服务端已启动");
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = new FileOutputStream(new File("sdcard/test.txt"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        Log.i(TAG, "文件传输完成");
        inputStream.close();
        outputStream.close();
        socket.close();
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

客户端实现

客户端的实现如下:

public void run() {
    try {
        Socket socket = new Socket("192.168.1.123", 8888);
        Log.i(TAG, "客户端已连接");
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = new FileInputStream(new File("sdcard/test.txt"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        Log.i(TAG, "文件传输完成");
        outputStream.close();
        inputStream.close();
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

示例2:使用Socket实现聊天室

下面我们通过另一个示例来演示如何使用Socket实现一个简单的聊天室。这个示例包含一个服务端和两个客户端。

服务端实现

服务端的实现如下:

public void run() {
    try {
        ServerSocket serverSocket = new ServerSocket(8888);
        Log.i(TAG, "服务端已启动");
        List<Socket> clientList = new ArrayList<>();
        while (true) {
            Socket socket = serverSocket.accept();
            clientList.add(socket);
            new Thread(() -> {
                try {
                    InputStream inputStream = socket.getInputStream();
                    while (true) {
                        byte[] buffer = new byte[1024];
                        int len;
                        while ((len = inputStream.read(buffer)) != -1) {
                            String msg = new String(buffer, 0, len);
                            Log.i(TAG, "收到客户端消息:" + msg);
                            for (Socket client : clientList) {
                                OutputStream outputStream = client.getOutputStream();
                                outputStream.write(msg.getBytes());
                            }
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

客户端实现

客户端的实现如下:

public void run() {
    try {
        Socket socket = new Socket("192.168.1.123", 8888);
        Log.i(TAG, "客户端已连接");
        new Thread(() -> {
            try {
                InputStream inputStream = socket.getInputStream();
                while (true) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = inputStream.read(buffer)) != -1) {
                        String msg = new String(buffer, 0, len);
                        Log.i(TAG, "收到服务端消息:" + msg);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
        Scanner scanner = new Scanner(System.in);
        OutputStream outputStream = socket.getOutputStream();
        while (true) {
            String msg = scanner.nextLine();
            outputStream.write(msg.getBytes());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

总结

以上就是关于“Android socket实现原理详解 服务端和客户端如何搭建”的攻略和示例的详细讲解。其中,我们通过示例演示了如何使用Socket进行文件传输和聊天室实现。希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android socket实现原理详解 服务端和客户端如何搭建 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • nsset用法

    nsset是一个用于管理域名服务器信息的命令行工具。它可以用来设置域名服务器的IP地址、名称服务器的权威性、域名服务器的TTL等信息。以下是使用nsset命令的完整攻略: 首先,使用nslookup命令查询要设置的域名的名称服务器信息。例如,要设置example.com域名的名称服务器为ns1.example.com和ns2.example.com,可以使用…

    other 2023年5月9日
    00
  • python清屏命令-python清屏命令

    以下是关于Python清屏命令的完整攻略,包括基本知识和两个示例说明。 基本知识 在Python中,我们可以使用特定的命令来清除控制台屏幕上的输出。这对需要清除屏幕并重新开始输出应用程序非常有用。 示例说明 以下是两个Python清屏命令的示例: 示例1:使用os模块 我们使用Python的os块来清除控制台屏幕上的输出。我们可以按照以下步骤操作: 在Pyt…

    other 2023年5月7日
    00
  • Vue加载中动画组件使用方法详解

    Vue加载中动画组件是一种可以用来增强用户交互体验的组件。这个组件一般是在数据加载的时候使用,可以让用户知道此时正在加载数据,不会让用户误以为程序崩溃或者卡住了。本篇攻略将详细讲解Vue加载中动画组件的使用方法。 1. 安装和引入 首先我们需要安装该组件。在命令行中输入: npm install vue-loading-overlay –save 成功之后…

    other 2023年6月25日
    00
  • Android中的Parcelable序列化对象

    下面是详细讲解“Android中的Parcelable序列化对象”的完整攻略: 什么是Parcelable Parcelable是一个序列化对象的接口,在Android中,如果我们想让一个Java对象能够在不同的组件或者进程间传递,那么这个Java对象必须去实现Parcelable接口从而达到序列化的目的。与Serializable相比,Parcelable…

    other 2023年6月27日
    00
  • 从C语言过渡到C++之基本变化

    从C语言过渡到C++需要理解两条基本变化:面向对象编程和类的概念。 面向对象编程 C++是一种面向对象编程语言,C语言则不是。面向对象编程将对象作为程序的基本单元,程序员利用面向对象编程语言构造出对象模型,运用特定的方法在对象之间传递消息和调用方法。对象的属性和方法封装在类中,类可以看作是对对象的模板定义。C++提供类的概念,而C语言则需要程序员自行实现一些…

    other 2023年6月26日
    00
  • 开机后win7任务管理器不断重启的解决方法

    标题:开机后win7任务管理器不断重启的解决方法 问题描述:在开机后进入win7系统后,任务管理器不断重启,无法正常使用。 解决方法: 清空任务管理器配置文件 可能是任务管理器的配置文件出现了一些问题,导致任务管理器不断重启。我们可以尝试清空任务管理器配置文件: 步骤1:按下[Win] + [R]键打开运行窗口。 步骤2:在运行窗口中输入“%AppData%…

    other 2023年6月27日
    00
  • 解决使用mybatis-plus时,生成的SQL大写变小写加下划线问题

    解决使用mybatis-plus时,生成的SQL大写变小写加下划线问题攻略 在使用mybatis-plus时,有时会遇到生成的SQL语句中,原本应该是大写的部分变成了小写,并且还加上了下划线的问题。下面是解决这个问题的完整攻略。 步骤一:检查数据库配置 首先,我们需要检查数据库配置,确保数据库的字符集设置为utf8mb4或utf8。这是因为在某些情况下,如果…

    other 2023年8月18日
    00
  • djangomodel中的classmeta详解

    以下是“Django Model中的class Meta详解”的完整攻略: Django Model中的class Meta详解 在Django中,Model是用于定义数据库表结构的类。在Model中,我们可以使用class Meta定义一些元数据,以控制Model的行为。在本攻略中,我们将详细讲解class Meta的用法。 常用选项 以下是class M…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部