Android通过Socket与服务器进行通信

2024-06-14 14:48

本文主要是介绍Android通过Socket与服务器进行通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先上代码,可以先把代码下下来,对着代码看本文。代码地址是:https://github.com/huangtianyu/SocketDemo,代码记得点击star哦~

  总有些想尝试一些底层的人,之前做过socket开发,总是想能不能用socket实现手机和服务器直接通信。尝试了下,还是不难的。毕竟都是用Java写的,无论是Android端还是服务器端,都是对Socket的使用。下面给出具体代码。

 先看服务器端代码:

Server.java

 

 
  1. package com.scu;

  2.  
  3. import java.io.BufferedReader;

  4. import java.io.BufferedWriter;

  5. import java.io.InputStreamReader;

  6. import java.io.OutputStreamWriter;

  7. import java.io.PrintWriter;

  8. import java.net.ServerSocket;

  9. import java.net.Socket;

  10.  
  11. public class Server implements Runnable {

  12. public void run() {

  13. try {

  14. // 创建ServerSocket

  15. ServerSocket serverSocket = new ServerSocket(6868);

  16. while (true) {

  17. // 接受客户端请求

  18. Socket client = serverSocket.accept();

  19. if (client == null) {

  20. continue;

  21. }

  22. System.out.println("客户端来了");

  23. try {

  24. // 接收客户端消息

  25. BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

  26. String str = in.readLine();

  27. System.out.println("收到:" + str);

  28. // 向服务器发送消息

  29. PrintWriter out = new PrintWriter(

  30. new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);

  31. out.println("服务器收到了");

  32. // 关闭流

  33. out.close();

  34. in.close();

  35. } catch (Exception e) {

  36. System.out.println(e.getMessage());

  37. e.printStackTrace();

  38. } finally {

  39. // 关闭

  40. client.close();

  41. System.out.println("close");

  42. }

  43. }

  44. } catch (Exception e) {

  45. System.out.println(e.getMessage());

  46. }

  47. }

  48.  
  49. // main函数,开启服务器,这就是一个普通的Java类,可以放到命令行里面执行的

  50. public static void main(String a[]) {

  51. Thread desktopServerThread = new Thread(new Server());

  52. desktopServerThread.start();

  53. }

  54. }

 

  上面是普通的Java类,可以直接放到命令行里面编译然后执行(javac Server.java,然后java Server即可)。首先初始化一个ServerSocket,利用一个while循环,不断循环接收客户端请求。注意ServerSocket类的accept函数将会阻塞线程的运行,当没有客户端发来请求时,服务器将会停在accept方法处,直到有客户端发送请求。

  下面看看Android端代码:

 

 
  1. package com.zqc.socketdemo;

  2.  
  3. import android.app.Activity;

  4. import android.os.Bundle;

  5. import android.util.Log;

  6. import android.view.View;

  7. import android.view.View.OnClickListener;

  8. import android.widget.Button;

  9. import android.widget.EditText;

  10. import android.widget.TextView;

  11.  
  12. import java.io.BufferedReader;

  13. import java.io.BufferedWriter;

  14. import java.io.InputStreamReader;

  15. import java.io.OutputStreamWriter;

  16. import java.io.PrintWriter;

  17. import java.net.Socket;

  18.  
  19. public class MainActivity extends Activity {

  20. private final String DEBUG_TAG = "hty";

  21. private TextView mTextView = null;

  22. private EditText mEditText = null;

  23. private Button mButton = null;

  24. Socket socket = null;

  25.  
  26. /**

  27. * Called when the activity is first created.

  28. */

  29. @Override

  30. public void onCreate(Bundle savedInstanceState) {

  31. super.onCreate(savedInstanceState);

  32. setContentView(R.layout.activity_main);

  33.  
  34. mButton = (Button) findViewById(R.id.Button01);

  35. mTextView = (TextView) findViewById(R.id.TextView01);

  36. mEditText = (EditText) findViewById(R.id.EditText01);

  37.  
  38. mButton.setOnClickListener(new OnClickListener() {

  39. public void onClick(View v) {

  40. new Thread(){

  41. @Override

  42. public void run() {

  43. String message = mEditText.getText().toString();

  44. try {

  45. //创建Socket

  46. socket = new Socket("10.18.73.62", 6868);//第一个参数是ip地址,第二个是端口号

  47. //向服务器发送消息

  48. PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

  49. out.println(message);

  50. //接收来自服务器的消息

  51. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

  52. String msg = new String(in.readLine().getBytes(),"UTF-8");

  53. if (msg != null) {

  54. mTextView.setText(msg);

  55. } else {

  56. mTextView.setText("数据错误!");

  57. }

  58. //关闭流

  59. out.close();

  60. br.close();

  61. } catch (Exception e) {

  62. Log.e(DEBUG_TAG, e.toString());

  63. } finally {

  64. //关闭Socket

  65. try {

  66. if (socket != null) {

  67. socket.close();

  68. }

  69. } catch (Exception e) {

  70.  
  71. }

  72. }

  73. }

  74. }.start();

  75. }

  76. });

  77. }

  78. }

  在Android端首先初始化一个Socket,然后获取该Socket的输出流,在调用out.println的时候框架会自动进行socket请求并发送数据。可以通过socket.getInputStream()获取Socket的输入流,从而可以接收服务器的输出。

这篇关于Android通过Socket与服务器进行通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060705

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

如何在Ubuntu 24.04上部署Zabbix 7.0对服务器进行监控

《如何在Ubuntu24.04上部署Zabbix7.0对服务器进行监控》在Ubuntu24.04上部署Zabbix7.0监控阿里云ECS服务器,需配置MariaDB数据库、开放10050/1005... 目录软硬件信息部署步骤步骤 1:安装并配置mariadb步骤 2:安装Zabbix 7.0 Server

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5