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日

相关文章

  • python如何安装pyaudio

    Python如何安装Pyaudio攻略 Pyaudio是Python中一个用于音频处理的库,可以用于录制、播放、处理音频等。本攻略将详细介绍如何在Python中安装Pyaudio库,并提供两个示例说明,分别演示了如何录制音频和播放音频。 安装Pyaudio前的准备工作 在安装Pyaudio之前,需要先安装Python和pip。如果您已经安装了Python和p…

    other 2023年5月7日
    00
  • Grpc微服务从零入门

    Grpc微服务从零入门 什么是Grpc gRPC是谷歌推出的一款高性能、开源的通用的 RPC 框架。其支持多种语言,并且可以运行在任何地方。gRPC 基于标准的HTTP / 2协议构建,并支持多种序列化和反序列化协议(protobuf、JSON)。这一点使得 gRPC 很适合分布式系统的构建,并可完美结合Kubernetes、Istio等云原生技术基础设施,…

    其他 2023年3月28日
    00
  • 基于Java 注解(Annotation)的基本概念详解

    基于Java 注解(Annotation)的基本概念详解 什么是Java注解? Java注解(Annotation),也被称为元数据,是Java语言中的一种特殊语法元素,可以在不改变程序运行逻辑的情况下,对类、方法、变量、参数等各种程序结构进行标注和说明,为程序的正确性、安全性、稳定性、可读性以及各种功能需求的实现提供了基础的支持。 Java注解的种类 Ja…

    other 2023年6月26日
    00
  • 关于sqlserver:如何在sql中自动生成唯一id

    以下是关于“如何在SQL Server中自动生成唯一ID”的完整攻略,包含两个示例。 背景 在SQL Server中,我们经常需要为表中的每个记录生成唯一的ID。这个ID可以用作主键或其他用途。在SQL Server中,我们可以使用IDENTITY列或GUID列来生成唯一ID。 使用IDENTITY列生成唯一ID IDENTITY列是SQL Server中一…

    other 2023年5月9日
    00
  • C++中构造函数的参数缺省的详解

    C++中构造函数的参数缺省的详解 在C++中,我们可以为构造函数设置参数缺省值,使得在实例化对象时可以省略某些参数,也可以在某些场合给构造函数更灵活的设置。 构造函数参数缺省的语法格式 为构造函数设置参数缺省值的语法格式如下: class 类名{ public: 类名(参数列表 = 缺省值); … }; 构造函数的参数列表可以设置一个或多个缺省值,缺省值…

    other 2023年6月26日
    00
  • c语言求两个字符串的交集

    要求求两个字符串的交集,可按以下步骤进行: 步骤一:获取输入的两个字符串 在程序中先定义两个字符串数组,用来保存输入的两个字符串。可使用scanf()函数实现字符串输入。提醒:为避免数组越界等问题,请设定好字符串数组的固定长度,如100。 char str1[100], str2[100]; printf("请输入字符串1:"); sca…

    other 2023年6月20日
    00
  • AndroidHttpClient详解及调用示例

    AndroidHttpClient详解及调用示例 什么是AndroidHttpClient AndroidHttpClient是一个基于Apache HttpClient的AndroidHTTP客户端,它可以帮助我们更加轻松地使用HTTP/HTTPS来访问网络资源。在Android 6.0及以上版本中,AndroidHttpClient被标记为过时,我们应该…

    other 2023年6月26日
    00
  • Android自定义流式布局/自动换行布局实例

    Android自定义流式布局/自动换行布局实例攻略 在Android开发中,有时我们需要实现一种自定义的布局,能够自动换行并适应不同的屏幕尺寸。这种布局被称为流式布局或自动换行布局。下面是一个详细的攻略,包含两个示例说明。 步骤1:创建自定义布局类 首先,我们需要创建一个自定义的布局类,继承自ViewGroup。这个类将负责管理子视图的位置和大小。 publ…

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