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日

相关文章

  • C# 开发圆角控件(窗体)的具体实现

    下面我将为你详细讲解“C# 开发圆角控件(窗体)的具体实现”的完整攻略,包含以下步骤: 步骤一:创建自定义控件类 在 Visual Studio 中,创建一个新 Windows 控制台应用程序,命名为“RoundedForm”。点击“解决方案资源管理器”中的项目根节点,在上下文菜单中选择“添加 → 新项”,选择“类”模板,并命名为“RoundedForm.c…

    other 2023年6月26日
    00
  • 怎么设置Win11右键默认显示更多选项?

    下面是设置Win11右键默认显示更多选项的完整攻略。 1. 打开本地组策略编辑器 首先需要打开本地组策略编辑器,可以通过以下步骤打开: 按下 Win + R 组合键打开“运行”对话框 输入“gpedit.msc”并按下回车键,打开本地组策略编辑器 2. 找到右键菜单相关的组策略 在本地组策略编辑器中,可以找到与右键菜单相关的组策略。具体步骤如下: 在本地组策…

    other 2023年6月27日
    00
  • js打开新页面的几种方式

    js打开新页面的几种方式 在开发Web应用中,我们常常需要在当前页面打开一个链接,但又不希望离开当前页面。下面将介绍几种使用JS在新窗口或新标签页中打开链接的方式。 使用window.open方法 使用window.open方法可以打开一个指定URL的新窗口或新标签页,该方法接受三个参数:URL、窗口名称和参数字符串。 window.open(‘http:/…

    其他 2023年3月28日
    00
  • C语言学习之指针的使用详解

    C语言学习之指针的使用详解 什么是指针 指针是C语言中非常重要的概念,它是一种数据类型,用于存储内存地址。指针是一种非常灵活的工具,它使得我们可以使用一些高效的算法来操作内存。 在C语言中,指针可以指向任何类型的数据,包括int、float、char等等。指针在函数传递参数、动态内存分配等方面都有着重要的应用。 定义和使用指针 在C语言中,定义指针需要使用*…

    other 2023年6月27日
    00
  • Java 方法签名详解及实例代码

    Java 方法签名详解及实例代码攻略 什么是方法签名? 在Java中,方法签名是指唯一标识一个方法的相关信息,包括方法的名称、参数类型、以及返回值类型。方法签名的作用是确保方法的唯一性,并提供编译器和运行时环境进行方法的匹配和调用。 方法签名的组成部分 方法签名由方法名、参数列表和返回值类型组成。 以下是方法签名的一般结构: 返回值类型 方法名(参数列表) …

    other 2023年6月28日
    00
  • Thinkphp5 如何隐藏入口文件index.php(URL重写)

    ThinkPHP5 是一款常用的 PHP 框架,其默认情况下网站会在URL中暴露“/index.php”,这不仅不美观,也容易被攻击者利用,以此进行一些不正当的访问和操作。因此,隐藏入口文件index.php是必不可少的保护措施之一。下面,我将为大家提供详细的攻略,让大家正确地完成操作。 步骤一:启用URL重写 在 ThinkPHP5 中,启用 URL 重写…

    other 2023年6月27日
    00
  • 如何使用docker对容器资源进行限制

    使用Docker对容器资源进行限制非常重要,这可以确保容器不会耗尽主机的资源。Docker提供了一些标记和选项来帮助您限制容器资源,本篇攻略将详细介绍如何使用Docker对容器资源进行限制,并提供两个示例。 限制CPU资源 要限制容器使用的CPU资源,您可以使用–cpus选项。–cpus选项用于限制容器使用的CPU数量,可以是整数或小数。 以下是一个示例…

    other 2023年6月27日
    00
  • 怎么迅速区分系统是32位?还是64位?

    当我们需要确定一个系统是32位还是64位时,可以按照以下步骤进行: 打开系统信息: 在Windows系统中,可以按下Win键 + R,然后输入\”msinfo32\”并按下回车键,打开系统信息窗口。 在Mac系统中,可以点击苹果菜单,选择\”关于本机\”,打开系统信息窗口。 查找系统类型: 在Windows系统信息窗口中,可以在左侧导航栏中找到\”系统摘要\…

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