一、Socket通信简介

Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。

1.1什么是Socket Socket

是一种抽象层,应用程序通过它来发送和接收数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。简单来说,Socket提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道。

1.2Socket的分类

根据不同的的底层协议,Socket的实现是多样化的。本指南中只介绍TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket)。流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。数据报套接字使用UDP协议,提供数据打包发送服务。 下面,我们来认识一下这两种Socket类型的基本实现模型。

二、Socket 基本通信模型

三、Socket基本实现原理

3.1基于TCP协议的Socket

服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据。accept()方法在没有数据进行接收的处于堵塞状态。(Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。

客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socketsocket=newSocket("172.168.10.108",8080);),通过inputstream读取数据,获取服务器发出的数据(OutputStreamoutputstream=socket.getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输。

3.2基于UDP协议的数据传输

服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。接下来创建一个空的DatagramSocket对象用于接收数据(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。

客户端也创建个DatagramSocket对象,并且指点监听的端口。接下来创建一个InetAddress对象,这个对象类似与一个网络的发送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)

四、android 实现socket简单通信

前言:添加权限

4.1使用TCP协议通信

android端实现:

protected void connectServerWithTCPSocket() {

Socket socket;

try {// 创建一个Socket对象,并指定服务端的IP及端口号

socket = new Socket("...", );

// 创建一个InputStream用户读取要发送的文件。

InputStream inputStream = new FileInputStream("e://a.txt");

// 获取Socket的OutputStream对象用于发送数据。

OutputStream outputStream = socket.getOutputStream();

// 创建一个byte类型的buffer字节数组,用于存放读取的本地文件

byte buffer[] = new byte[ * ];

int temp = ;

// 循环读取文件

while ((temp = inputStream.read(buffer)) != -) {

// 把数据写入到OuputStream对象中

outputStream.write(buffer, , temp);

}

// 发送读取的数据到服务端

outputStream.flush();

/** 或创建一个报文,使用BufferedWriter写入,看你的需求 **/

// String socketData = "[;fjks;]";

// BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(

// socket.getOutputStream()));

// writer.write(socketData.replace("\n", " ") + "\n");

// writer.flush();

/************************************************/

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

服务器端简单实现:

public void ServerReceviedByTcp() {

// 声明一个ServerSocket对象

ServerSocket serverSocket = null;

try {

// 创建一个ServerSocket对象,并让这个Socket在端口监听

serverSocket = new ServerSocket();

// 调用ServerSocket的accept()方法,接受客户端所发送的请求,

// 如果客户端没有发送数据,那么该线程就停滞不继续

Socket socket = serverSocket.accept();

// 从Socket当中得到InputStream对象

InputStream inputStream = socket.getInputStream();

byte buffer[] = new byte[ * ];

int temp = ;

// 从InputStream当中读取客户端所发送的数据

while ((temp = inputStream.read(buffer)) != -) {

System.out.println(new String(buffer, , temp));

}

serverSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

4.2使用UDP协议通信

客户端发送数据实现:

protected void connectServerWithUDPSocket() {

DatagramSocket socket;

try {

//创建DatagramSocket对象并指定一个端口号,注意,如果客户端需要接收服务器的返回数据,

//还需要使用这个端口号来receive,所以一定要记住

socket = new DatagramSocket();

//使用InetAddress(InetAddress).getByName把IP地址转换为网络地址

InetAddress serverAddress = InetAddress.getByName("...");

//InetAddress serverAddress = (InetAddress) InetAddress.getByName("...");

String str = "[;fjks;]";//设置要发送的报文

byte data[] = str.getBytes();//把字符串str字符串转换为字节数组

//创建一个DatagramPacket对象,用于发送数据。

//参数一:要发送的数据 参数二:数据的长度 参数三:服务端的网络地址 参数四:服务器端端口号

DatagramPacket packet = new DatagramPacket(data, data.length ,serverAddress ,);

socket.send(packet);//把数据发送到服务端。

} catch (SocketException e) {

e.printStackTrace();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

客户端接收服务器返回的数据:

public void ReceiveServerSocketData() {

DatagramSocket socket;

try {

//实例化的端口号要和发送时的socket一致,否则收不到data

socket = new DatagramSocket();

byte data[] = new byte[ * ];

//参数一:要接受的data 参数二:data的长度

DatagramPacket packet = new DatagramPacket(data, data.length);

socket.receive(packet);

//把接收到的data转换为String字符串

String result = new String(packet.getData(), packet.getOffset(),

packet.getLength());

socket.close();//不使用了记得要关闭

System.out.println("the number of reveived Socket is :" + flag

+ "udpData:" + result);

} catch (SocketException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

服务器接收客户端实现:

public void ServerReceviedByUdp(){

//创建一个DatagramSocket对象,并指定监听端口。(UDP使用DatagramSocket)

DatagramSocket socket;

try {

socket = new DatagramSocket();

//创建一个byte类型的数组,用于存放接收到得数据

byte data[] = new byte[*];

//创建一个DatagramPacket对象,并指定DatagramPacket对象的大小

DatagramPacket packet = new DatagramPacket(data,data.length);

//读取接收到得数据

socket.receive(packet);

//把客户端发送的数据转换为字符串。

//使用三个参数的String方法。参数一:数据包 参数二:起始位置 参数三:数据包长

String result = new String(packet.getData(),packet.getOffset() ,packet.getLength());

} catch (SocketException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

以上内容是小编给大家分享的Android Socket通信详解的相关知识,希望大家喜欢。

android传递socket对象,Android Socket通信详解相关推荐

  1. Android IBinder 通信详解

    Android IBinder通信详解 转载链接: [https://blog.csdn.net/qq_30379689/article/details/79451596](https://blog. ...

  2. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

  3. Android JNI使用方法,JNI机制详解

    Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...

  4. Android消息传递之EventBus 3.0使用详解

    前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...

  5. c语言 recv_sin,C++_C语言中经socket接收数据的相关函数详解,recv()函数: 头文件:#incl - phpStudy...

    C语言中经socket接收数据的相关函数详解 recv()函数:头文件: #include #include 定义函数: int recv(int s, void *buf, int len, uns ...

  6. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  7. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  8. Socket 套接字原理详解

    Socket 套接字原理详解 socket 编程介绍 Socket编程封装了常见的TCP.UDP操作,可以实现非常方便的网络编程. socket() 函数介绍 # socket.socket(fami ...

  9. Android 7.0 Audio的Resample过程详解

    Android 7.0 Audio的Resample过程详解 Qidi 2017.02.23 (Markdown & Haroopad) [前言] 处理过音频文件的工程师都知道音频数据存在采样 ...

最新文章

  1. 手把手教你STM8单片机标准库移植
  2. R语言中的esttab命令_R语言︱基本函数、统计量、常用操作函数
  3. FTP服务器的安装和配置
  4. maven 工程启动找不到 Spring ContextLoaderListener 的解决办法
  5. 编程入门:C语言基础知识全网超全不用到处找了!
  6. 记录部署hue在k8s上
  7. Java面试2021,java黑马百度云
  8. Sudoku Extension UVALive - 4763
  9. 漫话:如何给女朋友解释鸿蒙OS是怎样实现跨平台的?
  10. java定义一个方法,返回一个浮点数保留两位小数,考虑四舍五入的结果
  11. java 字符串 面试题_Java常用类String的面试题汇总(java面试题)
  12. crontab定时任务不执行的原因
  13. mysql .myi权限_mysql之引擎、Explain、权限详解
  14. jpg如何免费转换成pdf
  15. 怎么注册Google Earth Engine(GEE)
  16. 记一次在京东购买笔记本电脑的经历
  17. 女神节:向女性程序员致敬!
  18. 计算机网络与新媒体是什么,网络与新媒体专业课程是什么
  19. 并购当当是海航自编自导的一场大戏
  20. 中芯区块链公共服务平台即将推出“企业Linktree”新功能

热门文章

  1. chatbot-检索式模型介绍(四)
  2. input隐藏域和layui图片上传问题
  3. ws2812b灯带容易坏_WS2812灯带问题
  4. 你真的搞懂了什么叫敏捷式 ( Agile ) 开发吗?
  5. 报错`RuntimeError: CUDA out of memory. Tried to allocate 256.00 MiB (GPU 0; 9.78 GiB total capaci
  6. 【番杰的问答笔记】摄氏度与华氏度的转换
  7. android腾讯云im刷新会话列表,融云 IM SDK 集成 --- 刷新会话界面和会话列表界面...
  8. DHCP欺骗和解决方案
  9. 【PaddleNLP学习】PaddleNLP笔记
  10. 互联网下半场,实体店的转型思考