Android——套接字Socket

一.网络地址InetAddress

检查设备自身与某个网络地址的连通性用到了InetAddress工具,这是对网络地址的一个封装。下面介绍该工具的主要方法说明。

  • getByName:根据主机IP或主机名称获取InetAddress对象。

  • getHostAddress:获取主机的IP地址。

  • getHostName:获取主机的名称。

  • isReachable:判断该地址是否可到达,即是否连通。

    #####下面是检查网络地址能否连通的代码片段:

public void onClick(View v) {if (v.getId() == R.id.btn_host_name) {  // 点击了“检查主机名”按钮// 启动主机检查线程new CheckThread(et_host_name.getText().toString()).start();}}// 创建一个检查结果的接收处理器private Handler mHandler = new Handler() {// 在收到结果消息时触发public void handleMessage(Message msg) {tv_host_name.setText("主机检查结果如下:\n" + msg.obj);}};// 定义一个主机检查线程private class CheckThread extends Thread {private String mHostName;  // 主机名称public CheckThread(String host_name) {mHostName = host_name;}public void run() {// 获得一个默认的消息对象Message message = Message.obtain();try {// 根据主机名称获得主机名称对象InetAddress host = InetAddress.getByName(mHostName);// 检查该主机在规定时间内能否连上boolean isReachable = host.isReachable(5000);String desc = (isReachable) ? "可以连接" : "无法连接";if (isReachable) {  // 可以连接desc = String.format("%s\n主机名为%s\n主机地址为%s",desc, host.getHostName(), host.getHostAddress());}message.what = 0;  // 消息类型message.obj = desc;  // 消息描述} catch (Exception e) {e.printStackTrace();message.what = -1;  // 消息类型message.obj = e.getMessage();  // 消息描述}// 向接收处理器发送检查结果消息mHandler.sendMessage(message);}}

检查网络地址连通性的效果:

​ 检测域名的连通性结果图

​ 检测IP的连通性结果图

####二.Socket通信

计算机网络有一个大名鼎鼎的TCP/IP协议,TCP/IP是一个协议组,分为3个层次:

  • 网络层:包括IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
  • 传输层:包括TCP协议和UDP协议。
  • 应用层:包括HTTP、FTP、TELNET、SMTP、DNS等协议

Socket属于传输层的技术, API实现TCP协议后即可用于HTTP通信,实现UDP协议后即可用于FTP通信,当然也可以直接在底层进行点对点通信。

Android的Socket编程主要使用Socket和ServerSocket两个类:

1.Scoket

Socket是最常用的工具,客户端和服务端都要用到,描述了两边对套接字(Socket)处理的一般行为。主要方法如下:

  • connect:连接指定IP和端口。该方法用于客户端连接服务端。
  • getInputStream:获取输入流,即自身收到对方发过来的数据。
  • getOutputStream:获取输入流,即自身向对方发送的数据。
  • getInetAddress:获取网络地址对象。
  • isConnected:判断socket是否连上。
  • isClosed:判断socket是否关闭。
  • close:关闭socket。

2.ServerSocket

ServerSocket仅用于服务端,在运行时不停地侦听指定端口。主要方法如下:

  • 构造函数:指定侦听哪个端口。
  • accept:开始接收客户端的连接。有客户端连上时就返回一个Socket对象,若要持续侦听连接,则在循环语句中调用该函数。
  • getInetAddress:获取网络地址对象。
  • isClosed:判断socket服务器是否关闭。
  • close:关闭socket服务器。

####3.Scoket通信案例

举个Socket通信的案例,详细步骤说明如下:

(1)首先在客户端与服务端之间建立Socket连接。

(2)然后在Activity中启动Socket连接的线程,等待界面向Socket服务器发送消息,并准备接收消息。

(3)最后启动Socket服务器(其实一开始就要启动,这样App运行时才能马上连上后端服务器)。

下面是在客户端与服务端之间建立Socket连接的详细代码:

public class MessageTransmit implements Runnable {// 以下为Socket服务器的ip和端口,根据实际情况修改private static final String SOCKET_IP = "192.168.0.212";private static final int SOCKET_PORT = 51000;private BufferedReader mReader = null;  // 声明一个缓存读取器对象private OutputStream mWriter = null;  // 声明一个输出流对象@Overridepublic void run() {// 创建一个套接字对象Socket socket = new Socket();try {// 命令套接字连接指定地址的指定端口socket.connect(new InetSocketAddress(SOCKET_IP, SOCKET_PORT), 3000);// 根据套接字的输入流,构建缓存读取器mReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 获得套接字的输出流mWriter = socket.getOutputStream();// 启动一条子线程来读取服务器的返回数据new RecvThread().start();// 为当前线程初始化消息队列Looper.prepare();// 让线程的消息队列开始运行,之后就可以接收消息了Looper.loop();} catch (Exception e) {e.printStackTrace();}}// 创建一个发送处理器对象,让App向后台服务器发送消息public Handler mSendHandler = new Handler() {// 在收到消息时触发public void handleMessage(Message msg) {// 换行符相当于回车键,表示我写好了发出去吧String send_msg = msg.obj.toString() + "\n";try {// 往输出流对象中写入数据mWriter.write(send_msg.getBytes("utf8"));} catch (Exception e) {e.printStackTrace();}}};// 定义消息接收子线程,让App从后台服务器接收消息private class RecvThread extends Thread {@Overridepublic void run() {try {String content;// 读取到来自服务器的数据while ((content = mReader.readLine()) != null) {// 获得一个默认的消息对象Message msg = Message.obtain();msg.obj = content;  // 消息描述// 通知SocketActivity收到消息SocketActivity.mHandler.sendMessage(msg);}} catch (Exception e) {e.printStackTrace();}}}
}

下面是等待界面向Socket服务器发送消息,并准备接收消息的页面代码:

public class SocketActivity extends AppCompatActivity implements OnClickListener {private EditText et_socket;private static TextView tv_socket;private MessageTransmit mTransmit;  // 声明一个消息传输对象protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_socket);et_socket = findViewById(R.id.et_socket);tv_socket = findViewById(R.id.tv_socket);findViewById(R.id.btn_socket).setOnClickListener(this);mTransmit = new MessageTransmit();  // 创建一个消息传输new Thread(mTransmit).start();  // 启动消息传输线程}public void onClick(View v) {if (v.getId() == R.id.btn_socket) {// 获得一个默认的消息对象Message msg = Message.obtain();msg.obj = et_socket.getText().toString();  // 消息内容// 通过消息线程的发送处理器,向后端发送消息mTransmit.mSendHandler.sendMessage(msg);}}// 创建一个主线程的接收处理器,专门处理服务器发来的消息public static Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (tv_socket != null) {// 拼接服务器的应答字符串String desc = String.format("%s 收到服务器的应答消息:%s",DateUtil.getNowTime(), msg.obj.toString());tv_socket.setText(desc);}}};
}

Socket通信的实现效果:

​ Socket消息发送前的界面

​ Socket消息发送后的界面

姓名:孙振木

原文链接:https://blog.csdn.net/weixin_42233728/article/details/90724281

Android——套接字Socket相关推荐

  1. 5.1 计算机网络之传输层(传输层提供的服务及功能概述、端口、套接字--Socket、无连接UDP和面向连接TCP服务)

    文章目录 1.传输层提供的服务及功能概述 2.传输层的寻址与端口 (1)端口的作用 (2)端口号的分类 (3)套接字 3.无连接UDP和面向连接TCP服务 1.传输层提供的服务及功能概述 传输层的功能 ...

  2. [python学习] 专题七.网络编程之套接字Socket、TCP和UDP通信实例

    很早以前研究过C#和C++的网络通信,参考我的文章:                  C#网络编程之Tcp实现客户端和服务器聊天                 C#网络编程之套接字编程基础知识   ...

  3. Java 套接字Socket

    套接字 一.概述 本质上是一套基于网络传输数据的流 实际上是一套用于网络通信的API IP地址 IPv4是指由4组数组成的IP地址 , 每组数的范围在0~255 .一共有2的32次方个地址(43亿多) ...

  4. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  5. 套接字socket 的地址族和类型、工作原理、创建过程

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  6. Java 套接字(Socket)

    网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www ...

  7. 网上最全的套接字socket

    套接字socket使用 1.1创建socket sk = socket(int family, int type, int protocol); family:协议簇,PF_INET.PF_INET6 ...

  8. 了解套接字Socket

     了解套接字Socket   套接字是通过操作系统(OS)完成网络通信的一种标准方法.可以将套接字看作是与连接相连的一个终端,就像是操作员配电盘上的一个插座一样.但是这些套接字只是程序员的抽象称呼 ...

  9. Python套接字Socket读取http网页web数据

    Python套接字Socket读取http网页web数据 基于Python的套接字Socket,读取网页web的数据,以读取百度首页的内容为例,程序代码如下: import socketdef get ...

最新文章

  1. 解决firefox ubuntu无法打开页面的问题
  2. android导航条高度修改,Android中修改TabLayout底部导航条Indicator长短的方法
  3. 微信小程序PHP文件建在哪里,微信小程序解析H5文件方法
  4. 从Google Maglev说起,如何造一个牛逼的负载均衡?
  5. JavaFX实际应用程序:AISO HRC-Matic
  6. Vue全家桶 - 电商后台管理系统项目开发实录(详)
  7. 窄带物联网(NB-IoT)技术开发云平台的系统构架图是什么?
  8. Excel 取消身份证的科学计数法显示形式
  9. 使用 tftp 无法向服务器上传文件问题解决
  10. 开源无人机如何实现空对地框选撞击?
  11. Java微服务系统项目技术栈总结
  12. 如何在IDEA中使用 Jclasslib
  13. 英语语法之简单句型(一)
  14. 根据线索整理的一套在2021年继续使用Flash Player的方法(20.12.29更新)
  15. BZOJ 4826 HNOI2017 影魔
  16. OSPF/2/NBRCHG:The status of the non-virtual neighbor changes.
  17. 从 Server Timing Header 看服务器是如何处理请求的
  18. 统一门户:基于网关的统一用户认证方案
  19. JavaScript富应用MVC MVVM框架
  20. multisim二极管_变容二极管应用的Multisim仿真及分析

热门文章

  1. Additive Angular Margin Loss (ArcFace) 附加角裕度损失的进阶之路
  2. 前端工程化之Webpack优化
  3. Unity 协程用法总结
  4. 初识mybatis源码
  5. 杰理之扫描设备【篇】
  6. compute用法 odoo
  7. 〖Python自动化办公篇②〗- 文件自动化管理 - shutil模块实现文件的裁剪、压缩与解压缩
  8. odoo13 报价单 PDF 中添加图片添加图片
  9. 靠「猜」答案获得顶会最佳论文,华人IOI金牌获得者找到复杂「鸡兔同笼」最简解法...
  10. Python实例之CIFAR-10数据集分类