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

前言:添加权限

  1. <!--允许应用程序改变网络状态-->
  2. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
  3. <!--允许应用程序改变WIFI连接状态-->
  4. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
  5. <!--允许应用程序访问有关的网络信息-->
  6. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  7. <!--允许应用程序访问WIFI网卡的网络信息-->
  8. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  9. <!--允许应用程序完全使用网络-->
  10. <uses-permission android:name="android.permission.INTERNET"/>

4.1使用TCP协议通信

android端实现:

  1. protected void connectServerWithTCPSocket() {
  2. Socket socket;
  3. try {// 创建一个Socket对象,并指定服务端的IP及端口号
  4. socket = new Socket("192.168.1.32", 1989);
  5. // 创建一个InputStream用户读取要发送的文件。
  6. InputStream inputStream = new FileInputStream("e://a.txt");
  7. // 获取Socket的OutputStream对象用于发送数据。
  8. OutputStream outputStream = socket.getOutputStream();
  9. // 创建一个byte类型的buffer字节数组,用于存放读取的本地文件
  10. byte buffer[] = new byte[4 * 1024];
  11. int temp = 0;
  12. // 循环读取文件
  13. while ((temp = inputStream.read(buffer)) != -1) {
  14. // 把数据写入到OuputStream对象中
  15. outputStream.write(buffer, 0, temp);
  16. }
  17. // 发送读取的数据到服务端
  18. outputStream.flush();
  19. /** 或创建一个报文,使用BufferedWriter写入,看你的需求 **/
  20. //          String socketData = "[2143213;21343fjks;213]";
  21. //          BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
  22. //                  socket.getOutputStream()));
  23. //          writer.write(socketData.replace("\n", " ") + "\n");
  24. //          writer.flush();
  25. /************************************************/
  26. } catch (UnknownHostException e) {
  27. e.printStackTrace();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. }

服务器端简单实现:

  1. public void ServerReceviedByTcp() {
  2. // 声明一个ServerSocket对象
  3. ServerSocket serverSocket = null;
  4. try {
  5. // 创建一个ServerSocket对象,并让这个Socket在1989端口监听
  6. serverSocket = new ServerSocket(1989);
  7. // 调用ServerSocket的accept()方法,接受客户端所发送的请求,
  8. // 如果客户端没有发送数据,那么该线程就停滞不继续
  9. Socket socket = serverSocket.accept();
  10. // 从Socket当中得到InputStream对象
  11. InputStream inputStream = socket.getInputStream();
  12. byte buffer[] = new byte[1024 * 4];
  13. int temp = 0;
  14. // 从InputStream当中读取客户端所发送的数据
  15. while ((temp = inputStream.read(buffer)) != -1) {
  16. System.out.println(new String(buffer, 0, temp));
  17. }
  18. serverSocket.close();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }

4.2使用UDP协议通信

客户端发送数据实现:

  1. protected void connectServerWithUDPSocket() {
  2. DatagramSocket socket;
  3. try {
  4. //创建DatagramSocket对象并指定一个端口号,注意,如果客户端需要接收服务器的返回数据,
  5. //还需要使用这个端口号来receive,所以一定要记住
  6. socket = new DatagramSocket(1985);
  7. //使用InetAddress(Inet4Address).getByName把IP地址转换为网络地址
  8. InetAddress serverAddress = InetAddress.getByName("192.168.1.32");
  9. //Inet4Address serverAddress = (Inet4Address) Inet4Address.getByName("192.168.1.32");
  10. String str = "[2143213;21343fjks;213]";//设置要发送的报文
  11. byte data[] = str.getBytes();//把字符串str字符串转换为字节数组
  12. //创建一个DatagramPacket对象,用于发送数据。
  13. //参数一:要发送的数据  参数二:数据的长度  参数三:服务端的网络地址  参数四:服务器端端口号
  14. DatagramPacket packet = new DatagramPacket(data, data.length ,serverAddress ,10025);
  15. socket.send(packet);//把数据发送到服务端。
  16. } catch (SocketException e) {
  17. e.printStackTrace();
  18. } catch (UnknownHostException e) {
  19. e.printStackTrace();
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }

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

  1. public void ReceiveServerSocketData() {
  2. DatagramSocket socket;
  3. try {
  4. //实例化的端口号要和发送时的socket一致,否则收不到data
  5. socket = new DatagramSocket(1985);
  6. byte data[] = new byte[4 * 1024];
  7. //参数一:要接受的data 参数二:data的长度
  8. DatagramPacket packet = new DatagramPacket(data, data.length);
  9. socket.receive(packet);
  10. //把接收到的data转换为String字符串
  11. String result = new String(packet.getData(), packet.getOffset(),
  12. packet.getLength());
  13. socket.close();//不使用了记得要关闭
  14. System.out.println("the number of reveived Socket is  :" + flag
  15. + "udpData:" + result);
  16. } catch (SocketException e) {
  17. e.printStackTrace();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }

服务器接收客户端实现:

    1. public void ServerReceviedByUdp(){
    2. //创建一个DatagramSocket对象,并指定监听端口。(UDP使用DatagramSocket)
    3. DatagramSocket socket;
    4. try {
    5. socket = new DatagramSocket(10025);
    6. //创建一个byte类型的数组,用于存放接收到得数据
    7. byte data[] = new byte[4*1024];
    8. //创建一个DatagramPacket对象,并指定DatagramPacket对象的大小
    9. DatagramPacket packet = new DatagramPacket(data,data.length);
    10. //读取接收到得数据
    11. socket.receive(packet);
    12. //把客户端发送的数据转换为字符串。
    13. //使用三个参数的String方法。参数一:数据包 参数二:起始位置 参数三:数据包长
    14. String result = new String(packet.getData(),packet.getOffset() ,packet.getLength());
    15. } catch (SocketException e) {
    16. e.printStackTrace();
    17. } catch (IOException e) {
    18. e.printStackTrace();
    19. }
    20. }

Socket通信(转)的更多相关文章

  1. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  2. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  3. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

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

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

  7. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  8. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  9. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  10. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

随机推荐

  1. [转载] 多年积累的 mysql 运维经验

    原文: http://mp.weixin.qq.com/s?__biz=MzA3MzYwNjQ3NA==&mid=207132223&idx=1&sn=f5d98146f282 ...

  2. js中event.keyCode用法及keyCode对照表

    HTML 用户名:<input type="text" id="UserAccount" onKeyPress="JumpByEnter(Use ...

  3. C++中构造函数调用构造函数

    今天想做道矩阵的题目时,却卡在一些编程细节上了,找了好久才发现原来是在构造函数处出了问题,然后上网百度了下,发现这篇文章说得很好:从一道题谈C++中构造函数调用构造函数,很棒! 还补充一点: 看来自己 ...

  4. JavaMail 发送邮件案例

    #----------------这两个是构建session必须的字段---------- #smtp服务器 mail.smtp.host=smtp.exmail.qq.com #身份验证 mail. ...

  5. SecureCRT命令行文字和背景颜色设置

    先看设置后的效果图,这是个人比较喜欢的配色(整体色调偏暗): 具体设置方法为:

  6. c++ 对象内存分配和虚函数

    1. c++类对象(不含虚函数)在内存中的分布 c++类中有四种成员:静态数据.非静态数据.静态函数.非静态函数. 1. 非静态数据成员放在每个对象内部,作为对象专有的数据成员 2. 静态数据成员被抽 ...

  7. Python核心编程-细节

    直接从六张开始看看书里有什么. cmp() len() max() and min() sorted() and reversed() enumerate() and zip() sum() list ...

  8. ios CoreBluetooth 警告 is being dealloc'ed while pending connection

    ios CoreBluetooth 警告 is being dealloc'ed while pending connection CoreBluetooth[WARNING] <CBPerip ...

  9. computer English

    算法常用术语中英对照Data Structures 基本数据结构Dictionaries 字典PriorityQueues 堆Graph Data Structures 图Set Data Struc ...

  10. jmeter 建立一个JMS主题测试计划

    创建两个线程组和组 每一个到10迭代. 总消息线程(6)x(1消息) (重复10次)= 60消息. 建立测试计划,您将使用 以下元素: 线程组 , JMS的出版商 , JMS用户 , 图结果 . 一般 ...