Android编程之客户端通过socket与服务器通信的方法

我们先来介绍一下 Android 编程中使用 Socket 与服务器进行通信的方法。

什么是 Socket?

Socket,即“套接字”,是一种网络通信的方式。在进行网络通信时,程序之间需要建立起通信链路,Socket 就是建立该通信链路所使用的一种方法。在 Android 编程中,可以使用 Socket 进行与服务器的通信,使得客户端与服务器之间可以进行数据的交换。

Android 中使用 Socket 进行通信

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

  1. 创建 Socket 对象
  2. 建立连接
  3. 发送数据
  4. 接收数据
  5. 关闭连接

下面我们来详细介绍每个步骤的具体实现方法。

1. 创建 Socket 对象

在 Android 中,可以使用 Java 中的 Socket 类来创建 Socket 对象。创建方式为:

Socket socket = new Socket(ip, port);

其中,ip 为服务器的 IP 地址,port 为服务器的端口号。通过这个语句,就可以创建一个 Socket 对象。

2. 建立连接

Socket 对象创建完毕后,可以通过调用 connect() 方法来建立与服务器的连接。代码示例:

socket.connect(new InetSocketAddress(ip, port), timeout);

其中,ip 是服务器的 IP 地址,port 是服务器的端口号,timeout 是连接的超时时间,单位为毫秒。

3. 发送数据

连接建立之后,可以通过 OutputStream 对象来向服务器发送数据。代码示例:

String message = "Hello, server!";
OutputStream os = socket.getOutputStream();
os.write(message.getBytes());

其中,message 是要发送的消息,os 是通过 Socket 对象获取到的 OutputStream 对象。

4. 接收数据

向服务器发送完消息后,可以通过 InputStream 对象来接收服务器返回的消息。代码示例:

InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int count = is.read(buffer);
String response = new String(buffer, 0, count);

其中,is 是通过 Socket 对象获取到的 InputStream 对象,buffer 是用来存储接收数据的字节数组,count 是实际接收到的字节数,response 是服务器返回的消息。

5. 关闭连接

通信完成后,需要关闭连接。代码示例:

socket.close();

这样就可以关闭连接,释放资源。

示例介绍

下面我们来介绍两个使用 Socket 与服务器进行通信的示例。

示例1:获取服务器时间

客户端发送请求给服务器,服务器返回当前的时间。具体代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private static final String SERVER_IP = "192.168.1.100";
    private static final int SERVER_PORT = 12345;

    private TextView mResponseTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mResponseTv = findViewById(R.id.tv_response);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket(SERVER_IP, SERVER_PORT);

                    InputStream is = socket.getInputStream();
                    byte[] buffer = new byte[1024];
                    int count = is.read(buffer);
                    String response = new String(buffer, 0, count);

                    mResponseTv.setText(response);

                    socket.close();
                } catch (IOException e) {
                    Log.e(TAG, "run: ", e);
                }
            }
        }).start();
    }
}

示例2:与服务器进行聊天

客户端与服务器进行聊天,客户端输入消息发送给服务器,服务器返回相同的消息。具体代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private static final String SERVER_IP = "192.168.1.100";
    private static final int SERVER_PORT = 12345;

    private EditText mMessageEt;
    private ListView mChatLv;
    private ChatListAdapter mAdapter;

    private List<String> mChatList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMessageEt = findViewById(R.id.et_message);
        mChatLv = findViewById(R.id.lv_chat);

        mAdapter = new ChatListAdapter(this, mChatList);
        mChatLv.setAdapter(mAdapter);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket(SERVER_IP, SERVER_PORT);

                    while (true) {
                        InputStream is = socket.getInputStream();
                        byte[] buffer = new byte[1024];
                        int count = is.read(buffer);
                        String response = new String(buffer, 0, count);
                        mChatList.add("Server: " + response);

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mAdapter.notifyDataSetChanged();
                                mChatLv.setSelection(mChatList.size() - 1);
                            }
                        });
                    }
                } catch (IOException e) {
                    Log.e(TAG, "run: ", e);
                }
            }
        }).start();
    }

    public void sendMessage(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket(SERVER_IP, SERVER_PORT);

                    String message = mMessageEt.getText().toString();
                    OutputStream os = socket.getOutputStream();
                    os.write(message.getBytes());

                    InputStream is = socket.getInputStream();
                    byte[] buffer = new byte[1024];
                    int count = is.read(buffer);
                    String response = new String(buffer, 0, count);
                    mChatList.add("Client: " + response);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mMessageEt.setText("");
                            mAdapter.notifyDataSetChanged();
                            mChatLv.setSelection(mChatList.size() - 1);
                        }
                    });
                } catch (IOException e) {
                    Log.e(TAG, "run: ", e);
                }
            }
        }).start();
    }
}

这两个示例分别演示了客户端与服务器之间进行通信的两种情况。具体实现中,我们创建了 Socket 对象,并且利用 InputStreamOutputStream 对象来进行数据的接收和发送,使得客户端与服务器之间达到了数据的互通。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android编程之客户端通过socket与服务器通信的方法 - Python技术站

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

相关文章

  • C语言超全面讲解字符串函数

    C语言超全面讲解字符串函数攻略 序言 字符串是C语言中重要的数据类型,处理字符串是在C语言程序中常常遇到的任务。在C语言中,提供了多种不同的字符串函数,用于处理字符串,它们是操作字符串的重要工具。本文将对C语言中常见的字符串函数进行超全面的讲解,并提供两个实例进行说明。 C语言中常见的字符串函数 以下是C语言中常见的字符串函数: strlen size_t …

    other 2023年6月20日
    00
  • Windows下git使用代理服务器的设置方法

    Windows下Git使用代理服务器的设置方法 当在 Windows 操作系统下使用 Git 进行代码管理的时候,需要访问远程 Git 服务器获取代码,但是很多公司或机构部署了代理服务器,使得 Git 客户端无法直接访问远程 Git 服务器,这时就需要进行代理服务器的设置。本文将介绍 Windows 下 Git 使用代理服务器的设置方法。 设置 HTTP 代…

    其他 2023年3月28日
    00
  • Java子类实例化总是默认调用父类的无参构造操作

    Java子类实例化总是默认调用父类的无参构造操作 父类构造器的作用 在Java中,构造器是一种特殊类型的方法,主要用于创建和初始化对象。在对象生成过程中,当一个对象被创建时,总是先执行其父类的构造方法,然后再执行自己的构造方法完成自身的初始化操作。因此,一个子类初始化之前,总是要先对父类进行初始化。 子类默认调用父类无参构造器的原因 在Java中,如果一个类…

    other 2023年6月26日
    00
  • Spring源码之循环依赖之三级缓存详解

    下面是对”Spring源码之循环依赖之三级缓存详解”的完整攻略: 什么是循环依赖 循环依赖指的是对象之间出现相互依赖的情况,通常是两个或多个对象互相持有对方的引用,从而导致它们之间出现循环依赖的问题。在Spring框架中,循环依赖的问题通常在bean的创建过程中出现。 三级缓存解决循环依赖问题 Spring框架为了解决bean之间的循环依赖问题,设计了三级缓…

    other 2023年6月27日
    00
  • 电脑高手必读 服务器基础知识大全(图文)

    电脑高手必读 服务器基础知识大全(图文)攻略 简介 本文主要介绍了服务器基础知识,包括:什么是服务器、服务器的种类及其功能、服务器的软硬件配置、服务器的安装和调试、以及常见的服务器应用等内容。文章中配有图片、图表,易于理解和掌握。 什么是服务器? 服务器是一种能够接受客户端请求并向其提供服务的计算机系统,是用于支持网络或互联网应用的硬件和软件集合。服务器通常…

    other 2023年6月27日
    00
  • 黑鲨游戏手机2 Pro真机上手:骁龙855 Plus+12G运行内存++UFS 3.0闪存

    黑鲨游戏手机2 Pro真机上手攻略 1. 硬件配置 黑鲨游戏手机2 Pro是一款高性能的游戏手机,采用了以下主要硬件配置: 处理器:骁龙855 Plus 运行内存:12GB 存储:UFS 3.0闪存 这些配置使得黑鲨游戏手机2 Pro在游戏性能和运行速度方面表现出色。 2. 游戏性能优化 黑鲨游戏手机2 Pro针对游戏性能进行了优化,提供了以下功能: a. …

    other 2023年8月2日
    00
  • JS前端轻量fabric.js系列物体基类

    JS前端轻量fabric.js系列物体基类是一种用于在前端创建图形和动画的JavaScript库。它是基于HTML5 Canvas元素的,可以帮助前端开发人员轻松地创建各种图形和动画效果。本文主要介绍了fabric.js系列物体基类的使用和实现方法。 安装和使用 fabric.js是一个开源的JavaScript库,可以从Github下载。你可以使用npm或…

    other 2023年6月26日
    00
  • C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解 重载(Overload) 在C++中,重载指的是使用同一个函数名,但是参数类型或数量不同。在编译时,编译器根据实参的类型和数量,自动匹配相应的函数调用。函数的返回类型可以相同也可以不同。例如: int add(int a, int b){ return a + b; } float add(float a, float b…

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