您的位置:首页 > 理论基础 > 计算机网络

android 网络协议等socket,http,HTTPS,get。post请求 等详解

2017-11-08 19:39 1036 查看
1、Scoket通讯简介

android与服务器通讯方式主要有两种。一种是http通讯,一是Scoket通讯,两者的最大差异在于,http连接使用的是“请求相应的方式",在请求时建立连接通道,当客户端想服务器发送请求后,服务器端才能向客户端返回数据,

scoket通讯则是在双方建立起来连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端向服务端发送请求

2.什么是Scoket?

Scoket又称套接字,在程序内部提供与外界通讯的端口,即端口通讯,通过建立scoket连接,可为通讯双方的数据传输提供通道,scoket的主要特点有数据丢失率低,使用简单且易于移植。

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

3.Scoket分类

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

4.Scoket基本通讯模型

二、Socket 基本通信模型

5,Scoket基本实现原理

 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对象,并且指点监
121a2
听的端口。接下来创建一个空的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简单通信

前言:添加权限

<!--允许应用程序改变网络状态-->

<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"/>

4.1使用TCP协议通信

android端实现:

protected void connectServerWithTCPSocket() {

Socket socket;

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

socket = new Socket("192.168.1.32", 1989);

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

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

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

OutputStream outputStream = socket.getOutputStream();

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

byte buffer[] = new byte[4 * 1024];

int temp = 0;

// 循环读取文件

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

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

outputStream.write(buffer, 0, temp);

}

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

outputStream.flush();

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

// String socketData = "[2143213;21343fjks;213]";

// 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在1989端口监听

serverSocket = new ServerSocket(1989);

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

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

Socket socket = serverSocket.accept();

// 从Socket当中得到InputStream对象

InputStream inputStream = socket.getInputStream();

byte buffer[] = new byte[1024 * 4];

int temp = 0;

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

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

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

}

serverSocket.close();

} catch (IOException e) {

 e.printStackTrace();

}

}

4.2使用UDP协议通信

客户端发送数据实现:

protected void connectServerWithUDPSocket() {

DatagramSocket socket;

try {

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

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

socket = new DatagramSocket(1985);

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

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

//Inet4Address serverAddress = (Inet4Address) Inet4Address.getByName("192.168.1.32");

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

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

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

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

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

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(1985);

byte data[] = new byte[4 * 1024];

//参数一:要接受的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(10025);

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

byte data[] = new byte[4*1024];

//创建一个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();

} }

五、总结:

使用UDP方式android端和服务器端接收可以看出,其实android端和服务器端的发送和接收大庭相径,只要端口号正确了,相互通信就没有问题,TCP使用的是流的方式发送,UDP是以包的形式发送。

两类传输协议:tcp udp

tcp是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议,通过Tcp协议传输,

得到的是一个顺序无差错的数据流,发送方和接收方的成对的两个scoket之间必须建立连接,以便在TCP协议的基础上进行通讯,当一个Scoket(service scoket)等待连接时,另一个scoket可以要求进行连接,一旦这两个scoket连接起来,他们就可以进行双向数据传输,双方都可以进行发送或接受操作,

UDP是 User Control protocol 的简称,是一种无连接的协议,每个数据报都是一个独立的信息。包括完整的原地址目的地址,它在网上以任何可能的路径传往目的地,因此能否达到目的地,达到目的地的时间以及内容的正确性你能被保证,

比较:

UDP: 每个数据报中都给出了完整的地址信息,因此无需要创建发送发和接收方的连接,

UDP传输数据时是有大小限制的,每个被传输的数据必须限制在64kb之内

UDP是一个不可靠协议,发送方发送的数据报并不一定相同的次序到达接收方

TCP:面向连接的协议,在scoket之间进行数据传输之前必然要建立连接,所以在tcp中需要连接时间

TCP传输数据大小限制,一旦连接建立起来,双方的scoket就可以按统一的格式传输大的数据

TCP是一个可靠协议,他确保接收方完全正确额获取发送方所发送的全部数据

应用:1.tcp在网络通讯上有极强的生命力,例如远程连接(Telnet)和文件传输(FIP)都需要不定长度的数据被可靠的传输,但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的时间和网络的宽带,因此TCP传输的效率不如UDP高

2.UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中,client/service 应用程序,例如视频会话系统,并不要求视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP更合理一些

2,Socket通讯的过程

Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

  (1) 创建Socket;

  (2) 打开连接到Socket的输入/出流;

  (3) 按照一定的协议对Socket进行读/写操作;

  (4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)

二.http与https简介与区别

HTTP(hyper text transfer protocol)超文本传输协议是互联网上应用最为广泛的一种网络协议,由于信息是

明文传输,所以被认为是不安全的,

https(Hyper text Transfer protocol secure)是一种基于SSL/TSL的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的,HTTPS协议是在HTTP协议的基础上,添加SSL/TLS握手以及数据加密传输也属于应用层协议。

不使用SSL、TLS的http通讯,就是不加密通信,所有的信息明文传播,就会带来三大风险:

1)窃听风险

2)篡改风险

3)冒充风险

HTTPS和HTTP的区别

1)https协议需要CA机构wosign的颁发的SSL证书

2)http的信息是明文传输,https则是具有安全性的ssl加密

3)http是直接与TCP进行数据传输,而https是经过一层SSL,用的端口也不一样,前者是80,后者是443

4)http的连接很简单,是无状态的,https协议是由ssl+HTTP协议构建的可进行加密传输的网络协议,

面试题

https中的“s”是什么?

答案:安全

HTTP定义与服务器交互的不同方法,最基本的方法有4种:

get post put delete,URL的全称是资源描述符;一个URL地址,它用于描述一个网络上的资源,而

http中的get post put delete就对应着增删改查四个操作,

get 一般用于获取/查询资源信息,而post一般用于更新资源信息

get post的区别:

1)get请求数据会在url之后,

post把提交的数据放置在http包的包体中

2)get方式的提交的数据最多只能是1024字节,

理论上post没有限制,可以传输大量数据

3)post的安全性要比get的安全性高

三。http的三次握手和四次挥手

TCP协议提供可靠的连接服务,采用三次握手建立一个连接

1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

关闭连接:

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。

 CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。 

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。 

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。 

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: