Android Socket通信详解

一、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简单通信

前言:添加权限

<!--允许应用程序改变网络状态-->   
 <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("...", );
       // 创建一个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通信详解的相关知识,希望大家喜欢。

(0)

相关推荐

  • Android开发中Socket通信的基本实现方法讲解

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

  • android Socket实现简单聊天功能以及文件传输

    干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江湖. 如果你有好看的武侠系列小说,给我留言哦.题外话就扯这么多了,接着还是上技术. 看看今天实现的功能效果图: 可以这里使用多台手机进行通讯,我采用的服务器发送消息. 是不是只有发送消息,有些显得太单调了.好,在发送消息的基础上增加文件传输.后期会增加视频,音频的传输,增加表情包.那一起来看看图文消

  • android开发socket编程之udp发送实例分析

    本文实例讲述了android开发socket编程之udp发送实现方法.分享给大家供大家参考.具体分析如下: 需要实现的功能:采用udp下的socket编程,当按下确认键,模拟器发送文本框数据,pc机上的网络调试助手接收 一.环境: win7 + eclipse + sdk 二.代码: package test.soket; //import com.test_button.R; import java.io.DataOutputStream; import java.io.IOException

  • Android中Socket通信的实现方法概述

    本文实例简述了Android中Socket通信的实现方法,具体内容如下: 一.socket通信概述 通俗的来说套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口. 应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要通过同一个TCP

  • Android中使用socket通信实现消息推送的方法详解

    原理 最近用socket写了一个消息推送的demo,在这里和大家分享一下. 主要实现了:一台手机向另外一台手机发送消息,这两台手机可以随时自由发送文本消息进行通信,类似我们常用的QQ. 效果图: 原理:手机通过socket发送消息到服务器,服务器每接收到一条消息之后,都会把这条消息放进一个messageList里面,服务器会不停地检测messageList是否含有消息,如果有的话就会根据messageList里面item的数据,推送到相应的另一端手机上面. 下面简单画了一个图来说明这个原理: 演

  • Android开发之Socket通信传输简单示例

    本文实例讲述了Android Socket通信传输实现方法.分享给大家供大家参考,具体如下: 1.开篇简介 Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类).要实现Socket的传输,需要构建客户端和服务器端.另外,传输的数据可以是字符串和字节.字符串传输主要用于简单的应用,比较复杂的应用(比如Java和C++进行通信),往往需要构建自己的应用层规则(类似于应用层协议),并用字节来传输. 2.基于字符串传输的Socket案例 1)服务器端

  • 详解Android使用Socket对大文件进行加密传输

    前言 数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.它的核心是密码学. 数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法.它利用密码技术对信息进行加密,实现信息隐蔽从而起到保护信息的安全的作用. 项目中使用Socket进行文件传输过程时,需要先进行加密.实现的过程中踏了一些坑,下面对实现过程进行一下总结. DES加密 由于加密过程中使用的是DES加密算法,下面贴一下DES加密代码: //秘钥算法 privat

  • Android编程之客户端通过socket与服务器通信的方法

    本文实例讲述了Android编程之客户端通过socket与服务器通信的方法.分享给大家供大家参考,具体如下: 下面是一个demo,Android客户端通过socket与服务器通信. 由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别.只是UI代码不一样. Android客户端通过socket与服务器通信分为下面5步: (1)通过IP地址和端口实例化Socket,请求连接服务器: 复制代码 代码如下: socket = new

  • python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: 复制代码 代码如下: #server.py  import socket  def getipaddrs(hostname):#只是为了显示IP,仅仅测试一下      result = socket.getaddrinfo(hostname, None, 0, socket.SOCK_STREAM)      re

  • Android Socket通信详解

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

  • 基于BIO的Java Socket通信详解

    BIO,即阻塞IO,在基于Socket的消息通信过程中,Socket服务端向外部提供服务,而Socket客户端可以建立到Socket服务端的连接,进而发送请求数据,然后等待Socket服务端处理,并返回处理结果(响应). 基于BIO的通信,Socket服务端会发生阻塞,即在监听过程中每次accept到一个客户端的Socket连接,就要处理这个请求,而此时其他连接过来的客户端只能阻塞等待.可见,这种模式下Socket服务端的处理能力是非常有限的,客户端也只能等待,直到服务端空闲时进行请求的处理.

  • Android RIL使用详解

    前言 Android作为一个通用的移动平台,其首要的功能就是通话.短信以及上网等通信功能.那么,从系统的角度来看,Android究竟是怎么实现与网络的交互的了? 这篇文章里,就来看一看Android中负责通信功能的Telephony中间层,通常也被称之为RIL(Radio Interface Layer)的具体实现原理与架构. Android手机要实现与网络端的通信,需要跨越两个层: RIL Java(RILJ):负责将上层APP的通信请求发送给HAL层:RIL C++(RILD): 系统守护进

  • linux下用户程序同内核通信详解(netlink机制)

    简介 linux下用户程序同内核通信的方式一般有ioctl, proc文件系统,剩下一个就是Netlink套接字了. 这里先介绍下netlink. Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink. Netlink 相对于系统调用,ioctl 以及 /proc 文件系统而言具有以下优点: 1,为了使用 netlink,用户仅需要在

  • Python Socket编程详解

    背景 关于Python Socket编程,首先需要了解几个计算机网络的知识,通过以下的几个问题,有助于更好的理解Socket编程的意义,以及整个框架方面的知识: TCP和UDP协议本质上的区别? TCP协议,面向连接,可靠,基于字节流的传输层通信协议:UDP协议无连接,不可靠,基于数据包的传输层协议. TCP协议在建立连接的过程需要经历三次握手,断开连接则需要经历四次挥手,而这建立连接的过程增加了传输过程中的安全性. 而建立连接的过程则会消耗系统的资源,消耗更多的时间,而相比较UDP协议传输过程

  • Android Handler机制详解原理

    Looper是整个跨线程通信的管理者 // 内部持有的变量如下: ThreadLocal<Looper> MainLooper Observer MessageQueue Thread 1.首先先回忆一下Handler怎么用 Android线程通信分为以下两种情况 1.子线程发消息给UI线程 2.UI线程发消息给子线程 3.子线程发消息给另个子线程 1.子线程发消息给UI线程 class FragmentContentActivity : AppCompatActivity() { val F

  • Kotlin开发Android应用实例详解

    Kotlin开发Android应用实例详解 相关文章:关于Kotlin语言的基础介绍: http://www.jb51.net/article/114086.htm 我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有浓厚的兴趣,暂且理解为对它感兴趣吧,哈哈哈.那么,我们该如何在Android中应用这门新的语言呢?今天的这篇文章带你学习使用Kotlin开发Android应用,并对比我们传统语言Java,让你真真切切的感受到他的美和优雅. 配置 项目g

  • Python基础教程之tcp socket编程详解及简单实例

    Python tcp socket编程详解 初学脚本语言Python,测试可用的tcp通讯程序: 服务器: #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import threading import time def tcplink(sock, addr): print('Accept new connection from %s:%s...' % addr); sock.send(b'Welcome!!!'); whi

  • Android 文件操作详解及简单实例

     Android 文件操作详解 Android 的文件操作说白了就是Java的文件操作的处理.所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了.好了,话不多说,开始今天的正题吧. 先从一个小项目入门吧 首先是一个布局文件,这一点比较的简单,那就直接上代码吧. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

  • Android中SharedPreference详解及简单实例

     Android中SharedPreference详解 SharedPreference是Android提供的一种轻量级的数据存储方式,主要用来存储一些简单的配置信息,例如,默认欢迎语,登录用户名和密码等.其以键值对的方式存储,使得我们能很方便进行读取和存入. SharedPreference 文件保存在/data/data/<package name>/shared_prefs 路径下(如/data/data/com.android.alarmclock/shared_prefs/com.a

随机推荐