安卓手机socket通信(服务器和客户端)

yizhihongxing

安卓手机socket通信(服务器和客户端)攻略

要实现安卓手机之间的socket通信,需要涉及到两个角色:服务器和客户端。服务器用于监听客户端的请求,客户端则向服务器发送请求并接收响应。以下是详细攻略。

创建服务器

1. 添加网络权限

在AndroidManifest.xml文件中添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

2. 创建ServerSocket

使用ServerSocket可以监听客户端请求。在服务器端创建一个ServerSocket,并指定一个端口号,等待客户端连接:

try {
    ServerSocket serverSocket = new ServerSocket(8888);
    Socket socket = serverSocket.accept();
} catch (IOException e) {
    e.printStackTrace();
}

3. 接收客户端请求

当客户端连接成功时,可以通过Socket获取输入流和输出流,进行通信:

try {
    InputStream inputStream = socket.getInputStream();
    OutputStream outputStream = socket.getOutputStream();             
} catch (IOException e) {
    e.printStackTrace();
}

创建客户端

1. 添加网络权限

在AndroidManifest.xml文件中添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

2. 连接服务器

客户端通过Socket连接服务器,需要指定服务器的IP地址和端口号:

try {
    Socket socket = new Socket("192.168.0.100", 8888);
} catch (IOException e) {
    e.printStackTrace();
}

3. 向服务器发送请求

客户端向服务器发送请求,可以通过输出流写入数据:

try {
    OutputStream outputStream = socket.getOutputStream();
    String message = "Hello Server!";
    byte[] bytes = message.getBytes();
    outputStream.write(bytes);
} catch (IOException e) {
    e.printStackTrace();
}

4. 接收服务器响应

客户端从服务器接收响应,可以通过输入流读取数据:

try {
    InputStream inputStream = socket.getInputStream();
    byte[] bytes = new byte[1024];
    int len;
    StringBuilder sb = new StringBuilder();
    while ((len = inputStream.read(bytes)) != -1) {
        String s = new String(bytes, 0, len);
        sb.append(s);
    }
    String response = sb.toString();
} catch (IOException e) {
    e.printStackTrace();
}

完整示例

以下是一个完整的安卓手机socket通信示例,包含服务器和客户端两部分:

服务器部分

public class ServerActivity extends AppCompatActivity {

    private static final String TAG = "ServerActivity";

    private TextView mTvMessage;

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

        mTvMessage = findViewById(R.id.tv_message);

        new Thread(() -> {
            try {
                ServerSocket serverSocket = new ServerSocket(8888);
                Log.d(TAG, "server started.");

                Socket socket = serverSocket.accept();
                Log.d(TAG, "client connected.");

                InputStream inputStream = socket.getInputStream();
                OutputStream outputStream = socket.getOutputStream();

                byte[] buffer = new byte[1024];
                int len;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(buffer)) != -1) {
                    String s = new String(buffer, 0, len);
                    sb.append(s);
                }

                String request = sb.toString();
                Log.d(TAG, "request: " + request);

                String response = "Hello Client!";
                outputStream.write(response.getBytes());
                Log.d(TAG, "response: " + response);

                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

客户端部分

public class ClientActivity extends AppCompatActivity {

    private static final String TAG = "ClientActivity";

    private EditText mEtMessage;
    private TextView mTvResponse;

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

        mEtMessage = findViewById(R.id.et_message);
        mTvResponse = findViewById(R.id.tv_response);

        new Thread(() -> {
            try {
                Socket socket = new Socket("localhost", 8888);
                Log.d(TAG, "connected.");

                OutputStream outputStream = socket.getOutputStream();
                String message = mEtMessage.getText().toString();
                byte[] bytes = message.getBytes();
                outputStream.write(bytes);

                InputStream inputStream = socket.getInputStream();
                byte[] buffer = new byte[1024];
                int len;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(buffer)) != -1) {
                    String s = new String(buffer, 0, len);
                    sb.append(s);
                }

                String response = sb.toString();
                Log.d(TAG, "response: " + response);
                runOnUiThread(() -> mTvResponse.setText(response));

                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

以上就是安卓手机socket通信的完整攻略及示例。注意,在实际应用中,客户端和服务器的代码应该分别放在不同的应用中,以实现不同应用之间的socket通信。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:安卓手机socket通信(服务器和客户端) - Python技术站

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

相关文章

  • 苹果iOS刷机出现未知错误2005的解决方案大全

    苹果iOS刷机出现未知错误2005的解决方案大全 什么是“未知错误2005”? “未知错误2005”是指在刷写苹果手机 iOS 系统时出现的错误码,通常与硬件故障或无效 USB 端口等问题相关。该错误代码表明设备无法从 DFU 模式进入恢复模式。 解决方案 针对“未知错误2005”的问题,以下这些解决方案可能有所帮助: 检查电脑和 USB 端口 首先,用户需…

    other 2023年6月26日
    00
  • MySQL使用正则表达式去检索指定数据库字段

    MySQL使用正则表达式(Regular Expression)可以实现非常强大的字符串匹配功能。以下是MySQL使用正则表达式去检索指定数据库字段的完整攻略: 1. 创建正则表达式 在MySQL中,正则表达式可以使用REGEXP操作符或RLIKE操作符来匹配字符串。REGEXP相对更通用一些。要使用REGEXP操作符或RLIKE操作符,需要先创建一个正则表…

    other 2023年6月25日
    00
  • php中强制下载文件的代码(解决了IE下中文文件名乱码问题)

    完整攻略: 当PHP脚本对文件的类型以及名字进行了设置后,在IE中下载时可能会出现文件名乱码的问题。解决该问题的方法是为下载文件设置正确的HTTP头信息。以下是PHP中强制下载文件的代码并解决IE下中文文件名乱码问题的完整攻略: 1.设置HTTP头信息 在PHP中使用header函数,设置以下HTTP头信息: Content-Description:文件描述…

    other 2023年6月26日
    00
  • Java访问控制符原理及具体用法解析

    Java访问控制符原理及具体用法解析 在Java中,访问控制符是指用来限制类、方法和变量的访问范围的关键字。Java中有4种访问控制符,分别为public、protected、default、private。 Java访问控制符的原理 Java的访问控制符有两个主要作用:封装和访问控制。通过访问控制符,我们可以限制对象的访问,以防止类的内部细节被错误地暴露给…

    other 2023年6月27日
    00
  • windows读取ext4硬盘

    Windows 读取 ext4 硬盘 如果你在 Windows 操作系统上使用 ext4 文件系统格式的硬盘,你可能会遇到无法打开硬盘和文件的问题。这是因为 Windows 并不支持 ext4 文件系统,而只能支持自己的 NTFS 和 FAT32 格式。 然而,如果你需要从 Windows 访问 ext4 硬盘中的数据,有一些方法可以帮助你解决这个问题。 方…

    其他 2023年3月28日
    00
  • JavaScript使用DeviceOne开发实战(一) 配置和起步

    非常感谢对我们网站的关注,下面是JavaScript使用DeviceOne开发实战(一) 配置和起步的详细攻略。 配置DeviceOne开发环境 下载安装DeviceOne Studio 首先,我们需要下载和安装DeviceOne Studio。 DeviceOne Studio官方网站:https://www.deviceone.net/ DeviceOn…

    other 2023年6月26日
    00
  • 关于angular浏览器兼容性问题的解决方案

    关于Angular浏览器兼容性问题的解决方案,可以采取以下步骤: 步骤一:使用polyfills 在Angular项目中,如果使用了Web APIs,比如IntersectionObserver、ResizeObserver,以及一些ECMAScript特性比如Promise、fetch,那么部分用户使用的浏览器可能不支持这些API和特性。 解决这个问题,可…

    other 2023年6月26日
    00
  • c#为所有checkbox添加事件

    C#为所有checkbox添加事件 在Web开发或Windows桌面应用程序中,CheckBox 控件是一个常用且很有用的控件。当我们需要处理一批相关联的复选框时,我们通常希望能够使用一个函数或处理程序来处理所有这些复选框的事件。在此文章中,我们将学习如何使用C#为所有CheckBox添加事件。 添加多个CheckBox 首先,在页面(或表格)中添加多个Ch…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部