一、Socket通信简介

Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。

而Socket通信中基于TCP/IP协议的通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。而UDP则是提供无连接的数据报服务,UDP在发送数据报前不需建立连接,不对数据报进行检查即可发送数据包。。
那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。

1.1什么是Socket Socket

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

1.2Socket的分类

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

二、Socket 基本通信模型


三、Socket基本实现原理

3.1基于TCP协议的Socket 

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

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

3.2基于UDP协议的数据传输 

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

2、客户端也创建个DatagramSocket对象,并且指点监听的端口。接下来创建一个InetAddress对象,这个对象是一个网络地址(InetAddress serveraddress=InetAddress.getByName("172.168.1.100")).定义要发送的一个字符串,创建一个DatagramPacke数据包t对象,并制定要讲这个数据报包发送到网络的哪个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据包。(String
str="hello";byte[] data=str.getByte();DatagramPacket packet=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)

好了,下面就来看看代码怎么实现吧!

四、实现android基于TCP/IP协议的通信

1、Android端(客户端)代码:

2、服务端代码:

再贴出结果吧:

服务器显示:

192.168.1.102

192.168.1.102

HelloKitty,Java,哈哈哈

【总结】基于Socket流式网络编程,也即使用TCP/IP协议,可以对文件的传输进行操作

五、实现android基于UDP协议的通信

1、Android端(客户端)代码:

2、服务端代码:

客户端图片:

服务器显示:

192.168.1.102发送:HelloKitty,Java,哈哈哈,这是udp

【注】udp的多播还没实现,实现后我会加上来的

好了,这样就实现了基本的Socket网络编程了,注意:在android端使用时还需要加入权限哦:

<!--允许应用程序改变网络状态-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>    

<!--允许应用程序改变WIFI连接状态-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>    

<!--允许应用程序访问有关的网络信息-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>    

<!--允许应用程序访问WIFI网卡的网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>    

<!--允许应用程序完全使用网络-->
<uses-permission android:name="android.permission.INTERNET"/> 

总结:使用UDP方式android端和服务器端接收可以看出,客户端和服务端的发送和接收大庭相径,只要端口号和目标主机ip地址正确了,相互通信就没有问题,而且UDP它们之间的通信是不需要连接的,因为它不管服务端开启准备接收数据包没,它只管把数据包发出去了就行。而TCP就不一样了,如果在服务器没有开启的情况下,它会报一个错,提示与服务端没有建立连接。TCP使用的是流的方式发送,UDP是以包的形式发送。

Android中Socket通信之TCP与UDP传输原理的更多相关文章

  1. Android开发:如何实现TCP和UDP传输

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协 ...

  2. Android中Socket通信案例

    以下这个案例是基于TCP/UDP协议的. 服务端实现代码 基于TCP的服务端协议 // 声明一个ServerSocket对象 ServerSocket serverSocket = null; try ...

  3. Android如何实现TCP和UDP传输

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控 ...

  4. Android 之 Socket 通信

    Android 之 Socket 通信 联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket Server ...

  5. socket通讯,TCP,UDP,HTTP的区别

    socket编程有TCP和UDP, TCP:传送控制协议(Transmission Control Protocol) 传输控制协议TCP是TCP/IP协议栈中的传输层协议,它通过序列确认以及包重发机 ...

  6. 计算机网络(十三),Socket编程实现TCP和UDP

    十三.Socket编程实现TCP和UDP 1.TCP (1)TCPServer.java类 package com.interview.javabasic.socket; import com.int ...

  7. [转]vb socket通信(TCP/UDP)一对一、多对一

    VB Socket编程(Winsock控件创建TCP/IP客户机/服务器程序)    Winsock控件建立在TCP.UDP协议的基础上,完成与远程计算机的通信.即使对TCP/IP不太熟悉的用户,使用 ...

  8. Java Socket实现基于TCP和UDP多线程通信

    一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSo ...

  9. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

随机推荐

  1. ●洛谷P3348 [ZJOI2016]大森林

    题链: https://www.luogu.org/problemnew/show/P3348 题解: LCT,神题 首先有这么一个结论: 每次的1操作(改变生长点操作),一定只会会对连续的一段区间产 ...

  2. Codeforces Round #419 D. Karen and Test

    Karen has just arrived at school, and she has a math test today! The test is about basic addition an ...

  3. bzoj3825 NOI2017 游戏

    题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...

  4. python3 字符串str 教程

    字符串可以用单引号或双引号来创建. Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用. 例: var1 = 'Hello World!' var2 = "Pyth ...

  5. Python【第四课】 模块 and 包

    本篇内容 模块基础和导入(import,from...import...) 包常识和导入(import,from...import...) 函数式第一类对象 1.模块基础和导入 1.1 模块认识 什么 ...

  6. [ 学习笔记 ] Hibernate框架学习之一

    一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...

  7. JS区分中英文字符的两种方法: 正则和charCodeAt()方法

    1.正则regExpForm.onblur=function(){ entryVal=this.value; entryLen=entryVal.length; cnChar=entryVal.mat ...

  8. C指针 指针和数组 二维数组的指针 指针应用

    直接到变量名标识的存储单元中读取变量的值--直接寻址 通过其他变量间接找到变量的地址读取变量的值--间接寻址 指针变量存放地址 显示变量的地址 指针变量使用前必须初始化,若不知指向哪,可先指向NULL ...

  9. JS中数组和字符串的方法大全

    数组的方法很多,ECMScript5又提供了好几种方法.有空把之前的云上的笔记整理了一下,方便自己以后查找使用. 一.ECMScript 3的Array.prototype中定义的方法 1.join( ...

  10. React-报错Warning:setState(...)on anunmounted component

    一.原因        这种错误一般出现在react组件已经从DOM中移除.我们在react组件中发送一些异步请求的时候,就可能会出现这样的问题.举个例子,我们在componentWillMount中 ...