您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > Android精典资料分析
Java资料TreeMapTreeMap.headMap方法TreeMap通过index取值的方法TreeMap通过Key获取IndexJsonJava反射有参和无参String字符串分割Stringnull值判断List与数组互转state与status区分某年中2月有多少天在Maven工程里运行Javamain方法SOCKET一、Socket通信简介Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。1.1什么是SocketSocket是一种抽象层,应用程序通过它来发送和接收数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。简单来说,Socket提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道。1.2Socket的分类根据不同的的底层协议,Socket的实现是多样化的。本指南中只介绍TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket)。流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。数据报套接字使用UDP协议,提供数据打包发送服务。下面,我们来认识一下这两种Socket类型的基本实现模型。1.3两种传输模式1)、面向连接的传输:基于TCP协议,可靠性高,但效率低;2)、面向无连接的传输:基于UDP协议,可靠性低,但效率高;二、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=newDatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)四、Android实现socket简单通信添加权限!--允许应用程序改变网络状态--uses-permissionandroid:name=android.permission.CHANGE_NETWORK_STATE/!--允许应用程序改变WIFI连接状态--uses-permissionandroid:name=android.permission.CHANGE_WIFI_STATE/!--允许应用程序访问有关的网络信息--uses-permissionandroid:name=android.permission.ACCESS_NETWORK_STATE/!--允许应用程序访问WIFI网卡的网络信息--uses-permissionandroid:name=android.permission.ACCESS_WIFI_STATE/!--允许应用程序完全使用网络--uses-permissionandroid:name=android.permission.INTERNET/4.1使用TCP协议通信Client端实现:1.protectedvoidconnectServerWithTCPSocket(){2.3.Socketsocket;4.try{//创建一个Socket对象,并指定服务端的IP及端口号5.socket=newSocket(192.168.1.32,1989);6.//创建一个InputStream用户读取要发送的文件。7.InputStreaminputStream=newFileInputStream(e://a.txt);8.//获取Socket的OutputStream对象用于发送数据。9.OutputStreamoutputStream=socket.getOutputStream();10.//创建一个byte类型的buffer字节数组,用于存放读取的本地文件11.bytebuffer[]=newbyte[4*1024];12.inttemp=0;13.//循环读取文件14.while((temp=inputStream.read(buffer))!=-1){15.//把数据写入到OuputStream对象中16.outputStream.write(buffer,0,temp);17.}18.//发送读取的数据到服务端19.outputStream.flush();20.}catch(UnknownHostExceptione){21.e.printStackTrace();22.}catch(IOExceptione){23.e.printStackTrace();24.}25.26.}Server端实现:1.publicvoidServerReceviedByTcp(){2.//声明一个ServerSocket对象3.ServerSocketserverSocket=null;4.try{5.//创建一个ServerSocket对象,并让这个Socket在1989端口监听6.serverSocket=newServerSocket(1989);7.//调用ServerSocket的accept()方法,接受客户端所发送的请求,8.//如果客户端没有发送数据,那么该线程就停滞不继续9.Socketsocket=serverSocket.accept();10.//从Socket当中得到InputStream对象11.InputStreaminputStream=socket.getInputStream();12.bytebuffer[]=newbyte[1024*4];13.inttemp=0;14.//从InputStream当中读取客户端所发送的数据15.while((temp=inputStream.read(buffer))!=-1){16.System.out.println(newString(buffer,0,temp));17.}18.serverSocket.close();19.}catch(IOExceptione){20.e.printStackTrace();21.}22.}4.2使用UDP协议通信Client端实现:1.protectedvoidconnectServerWithUDPSocket(){2.3.DatagramSocketsocket;4.try{5.//创建DatagramSocket对象并指定一个端口号,注意,如果客户端需要接收服务器的返回数据,6.//还需要使用这个端口号来receive,所以一定要记住7.socket=newDatagramSocket(1985);8.//使用InetAddress(Inet4Address).getByName把IP地址转换为网络地址9.InetAddressserverAddress=InetAddress.getByName(192.168.1.32);10.11.Stringstr=[2143213;21343fjks;213];//设置要发送的报文12.bytedata[]=str.getBytes();//把字符串str字符串转换为字节数组13.//创建一个DatagramPacket对象,用于发送数据。14.//参数一:要发送的数据参数二:数据的长度参数三:服务端的网络地址参数四:服务器端端口号15.DatagramPacketpacket=newDatagramPacket(data,data.length,serverAddress,10025);16.socket.send(packet);//把数据发送到服务端。17.}catch(SocketExceptione){18.e.printStackTrace();19.}catch(UnknownHostExceptione){20.e.printStackTrace();21.}catch(IOExceptione){22.e.printStackTrace();23.}24.}Theclientreceivesthedatareturnedbytheserver1.publicvoidReceiveServerSocketData(){2.DatagramSocketsocket;3.try{4.//实例化的端口号要和发送时的socket一致,否则收不到data5.socket=newDatagramSocket(1985);6.bytedata[]=newbyte[4*1024];7.//参数一:要接受的data参数二:data的长度8.DatagramPacketpacket=newDatagramPacket(data,data.length);9.socket.receive(packet);10.//把接收到的data转换为String字符串11.Stringresult=newString(packet.getData(),packet.getOffset(),12.packet.getLength());13.socket.close();//不使用了记得要关闭14.System.out.println(thenumberofreveivedSocketis:+flag15.+udpData:+result);16.}catch(Soc
本文标题:Android精典资料分析
链接地址:https://www.777doc.com/doc-3629848 .html